一念Jeff LiWriting · zhipeng.li中文

The Original Hacker

黑客之祖

The system has only just been installed, and someone is already logging in at will. You read through the source code of the kernel, the shell, the login program, even the compiler, and recompile everything, yet he still comes and goes as he pleases. This really happened, as Ken Thompson told it in his 1984 Turing Award lecture: a Trojan hidden inside the compiler that passes itself on to the next generation of compilers. More than thirty years later, where should we start building the foundation of trust?

哇,这也行!——你不知道的黑客手法 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多年前的这件事之后,朋友你告诉我:最值得信任的可信的基础,该从那里构建起呢?

注

Originally published on the WeChat account 网安志异, 2015-06-21 · original

Comments

    No sign-in needed; comments appear right away.