黑客之祖
系统刚装好就有人随意登录;你读遍内核、shell、登录程序乃至编译器的源码,全部重新编译,他依然来去自如。这是Ken Thompson在1984年图灵奖演讲里讲的真事:木马藏进编译器,还会把自己传给下一代编译器。三十多年后,可信的根基该从哪里建起?

哇,这也行!——你不知道的黑客手法 2
你管理着一个计算机。刚刚安装好系统,还没有添加用户账号,有一个人立刻就登录进你的系统。
可能是安装文件里面有后门,你想。还好,这个系统是开放源码的。于是你找到与登录相关的所有程序的源代码,仔细阅读了源代码,确认没有后门之后重新编译,替换掉原来那些程序文件。你相信,所以这些程序都已经剔除了后门,应该没问题了。
但是那个人还是随便就能登录进系统。
于是你比把系统所有程序的源代码,包括内核源代码,shell源代码,登录程序源代码,甚至编译程序自身的源代码等等,全部都阅读检查了一遍,确信是正确的源代码,确信没有后门,然后重新编译了一遍,替换掉了原系统中的所有程序。现在的系统之中,所有的文件、程序都是你重新编译过的,都是可以信任的,后门应该被剔除掉了,没问题了。
但是那个人还是随便就能登录进系统。
于是你就抓狂了——到底怎么回事?
1984年,图灵奖颁奖,获奖人上台发表了演讲,题目是:反思对可信的信任(Reflections On Trusting Trust )。这个人叫Ken Thompson,上面故事中那位能够随便进入系统的人就是他。这个故事是真实发生的。

Ken Thompson是Unix的设计和创建者,并与Dennis Ritchie一起发明了C编程语言。他为了证明一个关于信任的概念而设计了一个巧妙植入木马的方法,这个方法使他的同事抓狂,无论如何也想不到木马是如何植入系统中的。
Ken Thompson的思路是这样的。如果直接在登录系统的源代码中加入后门,那么人们查看这个程序的源代码时就会看到,可以去掉这个后门。所以需要从编译程序中下手,编译登录程序源代码的时候,这个编译程序识别到编译对象是登录程序源代码,于是就在生成的程序文件中加入后门。
但这样做还不够,如果人们用这个编译程序编译一个干净的编译程序的源代码,生成一个新的编译程序的话,这个新的编译程序就是干净的,再用它编译登录程序,编译出得登录程序就没问题了。所以,要对编译程序再做修改,当它被用来编译一个干净编译程序源代码的时候,它能识别到并把木马留在新编译出来的编译程序里面。
这真的做得到吗?
Ken Thompson提交了一个只有三页的论文(Reflections On Trusting Trust ),描述了这个惊天杰作,并在领取图灵奖的时候宣读了这篇论文(0)。

如果觉得论文原文读起来艰难,这里(1)有一位程序员大三的时候根据这篇论文做了一个实现,并写了篇文章《给开源编译器插入后门》,可供参考。
在这个可信计算大行其道的年代,有冒充操作系统补丁的木马,有伪造的数字证书,有潜伏在BIOS/Fireware里面的RootKit......回顾30多年前的这件事之后,朋友你告诉我:最值得信任的可信的基础,该从那里构建起呢?
注
原载于微信公众号「网安志异」,2015-06-21 · 原文
留言