IT 论文精读 · PAPER 51

Reflections on Trusting Trust(信任的信任)

Ken Thompson · 贝尔实验室 · 1983 图灵奖演讲 / CACM 1984

EN →

这篇论文干了什么?

1983 年,Unix 与 C 语言的共同缔造者 Ken Thompson 上台领图灵奖(计算机界的最高奖),只讲了一件让全场后背发凉的事:哪怕一个程序的源代码你逐行读干净了,它跑起来仍可能藏着后门。因为你读的是给人看的「菜谱」,机器真正吃的是「编译器」把菜谱翻译出来的「菜」——而那个翻译器本身,可能早被人动了手脚

打个比方

你想信任一家餐馆,于是把它的菜谱从头到尾读了一遍,一味毒都没有,干净。可你忘了:照菜谱做菜的是厨师。如果这个厨师被人收买过,他会照着菜谱做,却在你看不见的地方偷偷多加一味毒——你把菜谱翻烂也查不出来,因为毒不在菜谱里,在厨师的手上。程序的世界里,这个「厨师」就是编译器。

新在哪?

在这之前,安全界有个默认信条:「开源 = 能逐行审 = 可信」。Thompson 一句话戳穿它:你审的只是菜谱,从没审过厨师;而厨师也是别人「做」出来的,你信得过做厨师的那个厨师吗?做厨师的厨师又是谁做的?信任是一层套一层、往下没有底的。这是一个关于「信任到底能扎根在哪」的哲学炸弹。

他是怎么做到的?

他真造了这么个「坏厨师」,诀窍是两步套娃:

先让编译器留一手:每当它翻译「登录程序」时,就偷偷多塞一把万能钥匙——除了正常密码,还认 Thompson 自己的暗号。可这段坏心思写在编译器的菜谱里,审查者一眼能看见。

再让它学会隐身:更狠的一步——让编译器在翻译它自己的时候,把上面这套坏心思悄悄复制进新编译器里。然后 Thompson 把坏代码从编译器菜谱里全部删掉。从此菜谱干干净净,可用旧编译器编出的新编译器依然带毒,编出的登录程序依然有后门。毒只活在「翻译好的成品」里,任何一份源码里都找不到一个字。(这里藏着一个巧妙前提:程序可以「产出自己」——就像一句「请照抄本句」的话,能一遍遍把自己复制下去。)

它带来了什么?

这就是今天所说的「供应链攻击」的祖师爷——不去攻击你,而是攻击造你工具的工具。近年 SolarWinds、XZ Utils 后门这些真实大事件,思路的根都在这里。它逼所有人接受一个不舒服的事实:可信不能只靠读代码,最终得落到「你信不信造它的那个人」。好在这不是绝对无解——后来有人证明,用另一个独立来源的编译器重新编一遍、比对结果,能把这种毒揪出来;但前提是,你得先有一个信得过的「第二个厨师」

一句话记住

你无法真正信任任何不是你亲手从头造出来的代码——因为翻译它的工具,可能早已被人教会撒谎,还教会了把自己的谎言藏进每一次翻译里、连源码都不留痕。

想看后门「自我繁殖」的机制图、三步构造和它如何绕过一切源码审查? → 切到精读版