Троянский компилятор - PullRequest
       6

Троянский компилятор

11 голосов
/ 23 апреля 2009

Я пытаюсь лучше понять троянский компилятор Томпсона (обсуждаемый в его речи ACM Turing Award 1984 " Размышления о доверии к доверию "), и до сих пор я так понимаю:

"Первоначальная программа входа в систему для Unix принимала любой логин и пароль, которые ему указал root. Она принимала только определенный пароль, известный только человеку, который написал систему. Это могло позволить ему войти в систему как корень. "

Это правильная концепция? Я не уверен на 100%, понимаю ли я всю концепцию.

Если бы кто-то мог прояснить ситуацию, это помогло бы.

(См. Также Брюс Шнайер Противодействие доверительному доверию )

Ответы [ 3 ]

15 голосов
/ 23 апреля 2009

Исходная программа входа в систему принимает совпадающие пары имени и пароля из файла.

Модификация заключается в добавлении сверхмощного пароля, скомпилированного в программу входа в систему, который разрешает root-доступ. Чтобы гарантировать, что этот код не виден при чтении программы входа в систему, в компиляторе есть изменение, чтобы распознать этот раздел программы входа в систему, в его первоначальной форме и скомпилировать его в супер-мощный двоичный пароль. Затем, чтобы скрыть существование этого кода в компиляторе, необходимо внести еще одно изменение в компилятор, который распознает раздел компилятора, в который было добавлено первое изменение, и выдает измененную форму.

Как только измененный код компилятора существует, вы можете скомпилировать компилятор и установить его в стандартном месте, а затем вернуть исходный код программы входа в систему и компилятора в неизмененную форму. Установленный скомпилированный компилятор затем возьмет неизмененную программу входа в систему и выведет небезопасную форму. Точно так же установленный компилятор скомпилирует исходный код неизмененного компилятора в хитрый вариант. Любой, кто проверяет исходный код любого из них, согласится, что в них нет ничего необычного.

Конечно, он работает только до тех пор, пока исходный код любой программы не будет развиваться достаточно далеко, чтобы измененный компилятор больше не распознавал его. Поскольку исходный код модифицированного компилятора больше не присутствует, его нельзя поддерживать, и (при условии, что компилятор и логин продолжают развиваться) он в конечном итоге перестанет производить небезопасный вывод.

6 голосов
/ 23 апреля 2009

Я никогда раньше не сталкивался с этой концепцией, но это довольно интересно - я нашел аккуратную статью в http://scienceblogs.com/goodmath/2007/04/strange_loops_dennis_ritchie_a.php

2 голосов
/ 23 апреля 2009

Да, это правильная концепция. Это еще не все; модифицированный компилятор должен также скомпилировать исходный код неизмененного компилятора в аналогично измененную копию самого себя. Это включает в себя тривиальные варианты этого источника, что в основном означает, что модифицированный компилятор должен быть в состоянии решить, например, проблема остановки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...