Шрифт:
Интервал:
Закладка:
Начнем с того же трюка, с которым мы познакомились в предыдущем примере, – с добавления бэкдора «райанкрутой» в компилятор, но на этот раз изучим его поподробнее. Пока вы не взялись за дело, нормальный процесс компилирования компилятора выглядел вот так:
Как и в прошлый раз, вы измените исходный код компилятора, чтобы каждое созданное на нем приложение считало «райанкрутой» действующим паролем. И теперь компилирование компилятора выглядит так:
И вот, как и в прошлый раз, вы успешно создали злодейский компилятор, но вас точно так же поймают, когда кто-нибудь проверит исходный код, где все ваши изменения лежат на виду. Хорошо, что мы еще пока не закончили!
Шаг 2
Вы добавите в этот компилятор еще больше злодейского кода: теперь он замечает, когда компилирует себя. Когда это происходит, ваш компилятор теперь воспроизводит ваш код, создающий бэкдор в любых приложениях. И процесс уже выглядит так:
Отметим, что теперь новый злодейский компилятор ведет себя точно так же, как исходный, кроме двух особых случаев. Компилируя приложения, он, как и прежде, вставляет в них секретный бэкдор для пароля «райанкрутой»:
А когда злодейский компилятор меняет себя, то создает новый компилятор, который тоже вставляет бэкдор в любое приложение. Теперь ваши изменения невозможно выкорчевать, даже если кто-нибудь сделает новый компилятор на основе проверенного, надежного и неизменного исходного кода:
Шаг З
Ваше преступление близко к завершению. Осталось только удалить злодейские инструкции из исходного кода компилятора – и вы идеально замели следы. Теперь компилятор ведет себя, как положено (насколько видно со стороны), довольно создает программы, которые для всего мира выглядят неизмененными.
Но на самом деле он безнадежно скомпрометирован: он собирает приложения по вашим спецификациям и в любой созданный на нем компилятор втайне тоже встраиваются ваши указания.
И ни в одном исходном коде не остается ни единой подозрительной строчки.
Ну вот! Готово. Перенесите пример с паролями на «подсчет голосов в свою пользу» – и ваше преступление завершено.
А! И поздравляю с успехом в цифровом голосовании, госпожа президент.
Замечательно
Это замечательно! Просто замечательно. Вы, конечно, подумаете, что ваши жертвы могли бы просто вручную проверить двоичный код вашей программы, но это проще сказать, чем сделать, особенно если программа достаточно сложная и объемная. Рассмотрим для сравнения полное собрание сочинений Уильяма Шекспира (хотя бы написанных на английском!): оно составляет 6 Мб информации, и нужно несколько дней, чтобы прочесть более 50 млн бит данных. Один только браузер «Файрфокс» требует больше 200 Мб только для установки, а на компьютере есть и другие программы. Скорее всего, во всем мире нет ни одного живого человека, который прочел все 200 Мб этого двоичного кода. Ведь он даже записан на языке не для людей! И да, если кто-то заподозрит, что вы влезли в компилятор (чего никогда не произойдет, если вы все сделали правильно), он может хотя бы сравнить его с известным хорошим компилятором и сверить измененные разделы двоичного кода. Но даже если отложить вопрос, откуда возьмется хороший компилятор, проверка не скажет, в чем изменения, только то, что изменения есть. А чтобы разобраться, нужно переписать двоичный код с самого начала.
Лучшая (или худшая, как посмотреть) часть этого замысла – все это не секрет и известно уже несколько десятилетий. В 1984 году Кен Томпсон – создатель «Юникса», предшественника операционных систем на большинстве компьютеров и смартфонов, – написал статью «Размышления о доверии к доверию» (Reflections on Trusting Trust), где пришел к такому же выводу. «Мораль проста, – написал он. – Нельзя доверять коду, если не написали его сами целиком. (Особенно коду от компаний, где работают такие, как я.) Никакая проверка исходного кода вас не защитит…» Под «написали сами целиком» Томпсон имеет в виду не просто программу, а все, что только можно, вплоть до компилятора. Мало у кого хватит времени, умения и денег, чтобы собрать компьютер с нуля, включая все программное обеспечение. Похоже на контрольный выстрел в голову доверию к компьютерам. И скажем честно: если вам нравится издавать злодейский хохот, то сейчас самое время.
Но, несмотря ни на что, мы все равно доверяем компьютерам во всем! Как так? Почему мы по своей воле пользуемся этими адскими машинами?
Все сводится к тем же требованиям легитимных выборов: открытые, честные, анонимные, прозрачные и точные.
Во многом, для чего мы используем компьютеры… черт, да просто многому в реальной жизни либо не нужны все эти требования, либо нужны, но только ставки не так высоки. Люди спокойно платят кредитными картами в Сети, но лишь потому, что эмитенты этих карт готовы покрыть убытки от мошенничества как обычные издержки, главное, чтобы деньги (и доходы) текли свободно. Банки исходят из тех же соображений, когда гарантируют безопасность транзакций через свои сайты: иногда преступники похищают деньги, но банк покроет убытки, поскольку цена доверия к их сайту гораздо выше, чем потери от действий мошенников. Онлайн-опросы по мелочам работают, поскольку ставки ниже: если результаты подделают, проигнорируют или не примут, судьба демократии не повиснет на волоске – это всего лишь дурацкий опрос в интернете. А когда в Сеть утекают нюдсы, то чаще всего потому, что ими поделились с кем-то, кто не стоит доверия и их слил, а не потому, что был взломан компьютер с изображениями[78]. В действительности компьютеры удобные и прикольные, и есть не так уж много случаев, когда к ним требуется абсолютное доверие.
Но выборы – не из таких случаев.
На выборах взлом может повлечь масштабные и непоправимые последствия, потому что выборы не так легко изменить. И они по природе чрезвычайно публичны: заранее известно, где и когда они будут происходить. Хуже того, у изменения исхода выборов есть очевидная, желаемая, мотивирующая и потенциально очень