Любой, кто писал код на любом высокоуровневом языке, наверняка уже мысленно сочиняет гневное письмо в мой адрес из-за фразы, что «это просто
Эта замена, случившаяся, скорее всего, из-за того, что я на микросекунду быстрее убрал палец с кнопки, и отличавшаяся
Поэтому программы и уязвимы перед злодейским планом, который вы провернете.
Уязвимость спрятана у всех на виду. Когда пишешь код на любом высокоуровневом языке, доверяешь компьютеру аккуратно преобразить написанное в двоичный код. Чтобы влезть в чей-то код, достаточно влезть в компилятор. Есть очевидный способ – плюс коварный, практически незаметный способ.
Давайте сначала рассмотрим очевидный.
Вот что происходит, когда вы компилируете приложение, написанное на высокоуровневом языке:
Допустим, вы проникли в компьютер жертвы через интернет и тайно изменили компилятор так, чтобы, компилируя с командой Print, он добавлял единицу к любому выведенному числу. И теперь, когда кто-нибудь использует компилятор, процесс выглядит вот
Внезапно, хоть кодировщики не наделали ошибок, все, что они создали с измененным компилятором, будет радостно извещать мир, что 10 + 20 = 31.
Приложения станут работать так, как не задумывалось, а бедные программисты-жертвы не смогут найти и исправить глюк «10 + 20 = 31» в своем коде, куда они посмотрят первым делом, поскольку изменения не там. Причина таится в исходном коде компилятора.
Конечно, они довольно быстро сообразят, что здесь что-то не то, ведь у их программ откровенная и заметная ошибка: каждое число больше на единицу. Но что, если действовать тоньше? Что, если вместо того, чтобы возиться с командой Print, сделать так: во всех ситуациях, когда компилятор обнаружит код с паролем, он проследит, чтобы
Сделайте так – и получите то, что принято называть «бэкдор», или «черный ход», в любую компьютерную программу, которую создают с вашим компилятором: термин значит, что ваши жертвы могут как угодно запирать, ставить на сигнализацию и укреплять переднюю дверь – это не важно, ведь у вас есть секретная дверка, о которой никто не знает.
Не важно, насколько талантливы разработчики и как безопасен их пароль: все, что соберет ваш злодейский компилятор, примет пароль «райанкрутой» и разработчики никогда об этом не догадаются, если только случайно тоже его не попробуют.
Тут вы наверняка подумали: «Но ты же сказал, что компиляторы – такие же компьютерные программы, как и любые другие, а значит, любой может заглянуть в исходный код компилятора и найти мои изменения. Стоит им убрать ту часть, которая делает „райанкрутой“ паролем, и моему замыслу конец».
И вы правы: так может сделать кто угодно. Но вы сами сказали: компиляторы – такие же программы, как и любые другие.
И значит, они
И вот тут – самый коварный момент.
Шаг 1
Начнем с того же трюка, с которым мы познакомились в предыдущем примере, – с добавления бэкдора «райанкрутой» в компилятор, но на этот раз изучим его поподробнее. Пока вы не взялись за дело, нормальный процесс компилирования компилятора выглядел вот так:
Как и в прошлый раз, вы измените исходный код компилятора, чтобы каждое созданное на нем приложение считало «райанкрутой» действующим паролем. И теперь компилирование компилятора выглядит так:
И вот, как и в прошлый раз, вы успешно создали злодейский компилятор, но вас точно так же поймают, когда кто-нибудь проверит исходный код, где все ваши изменения лежат на виду. Хорошо, что мы еще пока не закончили!
Шаг 2