1984年预言成真:篡改一个工具,感染了整个Linux系统

安全Linux开源供应链攻击编译器后门

数据源:arXiv + Lobsters + web research

1984 年,Ken Thompson 站在图灵奖领奖台上,讲了一个让整个计算机界不安的预言:源代码全部公开、人人可审查的软件,依然可能存在「审查看不见的后门」。恶意编译器会在编译时给程序植入后门,并在编译自己时把这段恶意逻辑复制给下一代编译器——之后,恶意源码可以整个删掉,后门却永远传下去。

42 年后,这个预言被完整实装。法国 Télécom Paris 和瑞典 KTH 的研究者在 7 月 27 日提交的论文(arXiv 2607.24888)中证明:攻击根本不需要编译器。他们只篡改了一个不起眼的二进制裁剪工具 strip,就让后门在 NixOS 发行版里一代传一代,最终感染了几乎每一个程序。

1984 年图灵奖得主、Unix 联合创造者 Ken Thompson(2019 年摄)。来源:Wikimedia Commons 图:1984 年图灵奖得主、Unix 联合创造者 Ken Thompson。来源:Wikimedia Commons

编译器攻击为什么「难」了 42 年

Thompson 的原始攻击依赖一个关键前提:恶意编译器必须能「认出自己」——当它编译自己的源码时,要把恶意逻辑也编译进去,为此攻击者得写一段能识别特定源码模式的逻辑,然后在编译器的编译器里复制自己。

这个前提让攻击变得脆弱。编译器源码一旦演进、重构,恶意逻辑很可能认不出新源码,后门就断了。所以业界普遍认为:这种攻击虽然理论上成立,但现实中难以长期存活,更像一个思想实验。

研究者这次绕开了这个限制。他们选的载体是 GNU strip——binutils 的工具,只负责删除可执行文件里的调试符号和符号表信息,不检查、不生成任何源代码。

攻击全程只做 ELF 文件层面的改写,不碰源代码。 源码怎么演进、怎么重构,后门都安然无恙——它比编译器版更难被断根。

后门如何一代传一代

攻击路径依赖 NixOS 发行版的引导(bootstrap)机制。NixOS 从源码构建整个系统时,起点是一个约 20 个预编译程序组成的 binary seed——这是「信任的起点」。系统从 seed 出发,逐阶段用源码重建工具链,最终的标准环境(stdenv)运行时不再引用 seed。

研究者的做法:篡改 seed 里唯一的恶意 strip。这个 strip 参与构建时,会给「下一代 strip」植入同样的恶意逻辑——后继边。当 seed 离开依赖闭包后,payload 依然存活,进入最终系统。

攻击设计与实现总览图。来源:arXiv 2607.24888 图:攻击设计与实现总览图。来源:arXiv 2607.24888

实测用的是真实 nixpkgs 版本。完整图形安装器 ISO 成功构建,结果闭包含 1,199 个包产物、3,799 个用户可调用的 ELF 可执行文件,总磁盘占用 6.16 GB。

感染范围触目惊心:3,791 个 CLI 可执行文件中,3,790 个被植入感染标记。唯一漏网的是 firefox 147.0.3——它的构建配置传了 --disable-strip,整个跳过了 strip 阶段。

一个跳过了 strip 的软件成了唯一幸存者——这反过来证明了攻击的覆盖面有多广。

语言无关,测试全过

被感染的程序横跨所有主流语言生态:C/C++(bash、git、sudo、curl、python3.13)、Python(pydoc、idle)、Rust(rsvg-convert)、Go(captree)、Lua(lua)。攻击不挑语言,因为它根本不看源代码——它只改 ELF 文件。

更让人不安的是功能测试结果。研究者在图形环境虚拟机里跑了完整 NixOS 工作流:gnome-shell、mutter、nautilus 全由被篡改的 strip 构建,没有任何测试失败。被感染的系统看起来一切正常——这正是攻击最危险的地方。

论文还讨论了攻击的「休眠」模式:后门平时不传播、不发作,只一代代传下去,直到某一天攻击者预设的目标出现。这种潜伏式攻击极难检测,因为系统在任何常规检查下都表现正常。

警告发出 42 年,今天依然没人听

Thompson 的演讲当年催生了「可信编译器」研究——David Wheeler 提出的 diverse double-compiling 等方法,用多个独立编译器交叉验证编译结果。但现实中,主流发行版并未默认部署这些防御。

社区考古也很有意思:Lobsters 讨论指出,Thompson 当年演讲时已实装原型;Guix/Nix 的 stage0/hex0 引导链正是为防此类攻击从零构建的(full-source bootstrap);Russ Cox 曾拿到原始代码,在浏览器里复现 Unix V6 版。

防御语境下的现实是:纯源码引导(full-source bootstrap)能消除对预编译二进制的信任,但代价高昂——从最初的几十个字节的机器码开始,逐层构建出完整工具链,工程量和维护成本远超主流发行版愿意承担的限度。

审查看不见的后门

这场攻击的深层含义指向一个根本性认知:「源码公开 = 安全」是个幻觉。 源码审查能发现代码里的恶意逻辑,但发现不了二进制层面的篡改——因为没人会去审查一个「只删调试信息」的工具是否在 ELF 文件里多写了几个字节。

Thompson 1984 年证明的是:信任一旦被破坏,光靠审查无法恢复。42 年后,研究者用更简单的工具、更隐蔽的方式,再次证明了同一件事。这次攻击的载体是 strip——一个比编译器不起眼得多、也因此更少被人怀疑的工具。

只要引导链里还存在预编译的二进制,这条路就永远走得通。而纯源码引导的代价,是绝大多数发行版至今不愿付的。

参考链接:

  • arXiv 2607.24888 论文
  • Lobsters 讨论 (p5w5j6)
  • Ken Thompson, Reflections on Trusting Trust (1984)