Reflections on trusting trust
За матеріалами (с) Sean Brian Townsend про те, як написати “ідеальний” бекдор.
“Я думаю, что коллеги программисты помнят замечательную статью Кена Томпсона “Reflections on trusting trust”. В ней описывается очень интересный фокус, связанный с компиляцией компиляторов. В языке Си специальные символы, переводы строки, табуляции записываются специальными последовательностями, такими как “\n”.
Как мог бы выглядеть код компилятора? ЕСЛИ (текущий_символ = ‘\’, а следющий ‘n’), то вернуть “\n” Кода перевода строки 10 нет нигде в исходниках. Компилятор должен быть собран дважды. В первом “поколении” if (c == ‘n’) return 10; а в следующем уже if (c == ‘n’) return ‘\n’; Компилятор “обучен” новой последовательности.
По-умному, называется bootstrapping, чем-то напоминает попытку вытянуть себя за волосы из болота. Turtles all the way down. Попытайтесь, к примеру, реализовать новый тип struct без структур и вы поймёте о чем я. Ричард Гебриел не зря говорил, что Юникс и Си – особенно зловредный вирус, паразитирующий на человечестве.
И вот этот нехитрый фокус, можно использовать для того, чтобы вставить в софт троянского коня. Нужно только подправить компилятор, следующим образом – ЕСЛИ мы видим код сравнивающий пароли, ТО вставить сравнение с предустановленным паролем. И никакая проверка и вычитка исходных кодов, ни компилятора, ни программы контролирующей доступ не выявит нарочно вставленную уязвимость. Меня поражает до сих пор.
А на скриншоте оригинальная статья, написанная лейтенантом и майором американских ВВС, из которой идею подобрал Томпсон. 1974 год. Я потом напишу еще один пост, чуть более понятный, про вирусы, лямбда исчисление, формальные языки, иерархию Хомского, смешные примеры и того и другого, а пока просто листаю раритет – https://seclab.cs.ucdavis.edu/projects/history/papers/karg74.pdf” (PDF)