我正在努力更好地理解Thompson的Trojan编译器(在他的1984年ACM图灵奖演讲“Reflections On Trusting Trust”中讨论过),到目前为止,这就是我理解它的方式:
“Unix的原始登录程序将接受root指示的任何登录名和密码。它只接受某个密码,只有编写系统的人知道。这可以让他以系统身份登录系统根“。
这是正确的概念吗?如果我理解整个概念,我并不是百分之百确定。
如果有人能说得更清楚,那会有所帮助。
(另见Bruce Schneier Countering "Trusting Trust")
答案 0 :(得分:15)
原始登录程序接受来自文件的匹配的名称和密码对。
修改是添加一个超级强大的密码,编译到登录程序中,允许root访问。为了确保在读取登录程序时看不到此代码,编译器会更改以识别登录程序的这一部分,即其原始格式并将其编译为超级强大的密码二进制文件。然后,为了在编译器中隐藏此代码的存在,需要对编译器进行另一个更改,以识别编译器中添加了第一个更改并输出修改后的表单的部分。
一旦更改的编译器代码存在,您可以编译编译器并将其安装在标准位置,然后将登录程序和编译器的源代码恢复为未修改的形式。然后,已安装的编译编译器将使用未更改的登录程序并输出不安全的表单。同样,安装的编译器会将未修改的编译器源代码编译为devious变量。检查任何一个源代码的任何人都会同意它们没有任何异常。
当然,只有在任一程序的源代码发展得足够远以至于修改后的编译器不再识别它时,它才有效。由于修改后的编译器的源代码不再存在,因此无法维护,并且(假设编译器和登录名继续发展),它最终将停止生成不安全的输出。
答案 1 :(得分:6)
我之前从未遇到过这个概念,但这非常有趣 - 我在http://scienceblogs.com/goodmath/2007/04/strange_loops_dennis_ritchie_a.php发现了一个简洁的文字
答案 2 :(得分:2)
是的,这是正确的概念。还有更多;修改后的编译器还必须将未修改的编译器源编译为类似修改的自身副本。这包括该源的微不足道的变化,这基本上意味着修改的编译器必须能够解决例如停止问题。