needhelp
← 返回博客

Debian 14 'Forky' 将成为首个强制可复现构建的主流 Linux 发行版

作者 needhelp
debian
可复现构建
linux
安全
开源

2026 年 5 月 10 日,Debian 发布团队宣布,从现在起 Debian 的迁移软件将阻止任何无法逐比特位复现(或复现性出现倒退)的软件包进入 testing 分支。这意味着预计 2027 年发布的 Debian 14 “Forky” 将成为首个强制要求所有软件包实现可复现构建的主流 Linux 发行版。

同一份公告还确认 LoongArch64(Loong64)已正式加入 Debian 存档。

这不是简单的策略调整。这是这个最古老、最具影响力的 Linux 发行版之一在软件供应链完整性保障上的一次结构性变革。我们来逐层拆解其技术、经济和地缘政治意义。


为什么是现在?XZ 后门作为分水岭

要理解这件事的重要性,必须先了解 XZ Utils 后门事件(CVE-2024-3094)——安全研究员 Alex Stamos 称其为”有史以来植入过的最广泛、最有效的软件后门”。

XZ Utils logo

XZ Utils 项目的 logo 由后门实施者 "Jia Tan" 贡献。来源:Wikipedia

2024 年,攻击者花费了两年多时间,通过社会工程手段渗透进 xz/liblzma 项目的维护者信任链——施压、傀儡账号、制造虚假紧迫感——最终在每一个主流 Linux 发行版使用的压缩库二进制文件中植入了后门。持有特定 Ed448 私钥的攻击者可以通过 SSH 以 root 身份远程执行任意代码。该漏洞的 CVSS 评分为 10.0——最高严重级别。它之所以没有被大规模部署,仅仅是因为微软工程师 Andres Freund 注意到他的 SSH 登录比平时慢了约 500 毫秒。

Veritasium 制作了一部关于这次攻击的纪录片。

关键教训是:如果你无法从源代码复现一个二进制文件,你就无法知道它实际上做了什么。 XZ 后门的恶意代码只存在于发布 tarball 中,而不在 git 仓库里。可复现构建可以立即标记这种不一致:从 tarball 和 git checkout 构建的二进制文件将产生不同的哈希值。

这正是 Debian 此次公告所回应的上游威胁。


执行机制:到底改变了什么

可复现构建项目(reproducible-builds.org)自 2014 年起就已存在。Debian 一直是核心参与者——该项目的 CI 基础设施主要运行在 Debian 硬件上。在这次公告之前,Debian 已有超过 95% 的源码包实现了可复现。5 月 10 日的变化是在迁移工具链中增加了一个硬性关卡

Debian 的发布流程是这样的:

  1. 维护者上传到 unstable(Sid)
  2. 经过迁移延迟(通常 5-10 天)后,软件包考虑升级到 testing
  3. 迁移软件执行自动化检查:依赖解析、架构支持、bug 跟踪状态,以及可复现性

在 5 月 10 日之前,可复现性检查是建议性的——仪表板上的一个备注。现在它是一个阻塞性检查。如果包 foo 的版本 2.0-1 不可复现,或者版本 2.0-1 使 foo 从可复现变为不可复现,迁移工具将拒绝其升级。

这一检查通过 .buildinfo 文件强制执行——这些文件记录了完整的构建环境:每个依赖的版本、每个编译器标志、构建路径、内核版本、区域设置。结合 diffoscope(一款深度比较两个二进制文件并报告每一个字节级别差异的工具),系统可以判断一个包的源码是否能在独立构建中产生相同的输出。

实际后果是:Debian 维护者现在必须在其软件包到达稳定版发布流程之前修复可复现性问题。他们无法通过补丁或标记 Bug 为已解决来绕开——迁移关卡将直接阻止他们。


深层意义:这到底意味着什么

1. 信任模型的转变:从”信任我们”到”验证我们”

每个二进制分发包系统都基于某种信任模型。在此之前,信任模型是:“Debian 的构建守护进程是安全的;请相信我们分发的二进制文件与展示的源代码一致。”

之后,模型变为:“任何人都可以独立验证我们分发的文件确实与其源代码一致。如果不一致,系统拒绝分发。”

这是一个有实质意义的区别。这意味着即使 Debian 的构建基础设施被攻破——例如攻击者控制了构建守护进程集群并在编译后修改了二进制文件——任何人通过重新构建都可以检测到这一点。攻击者需要同时攻破每一个独立的重新构建验证系统,这大大提高了攻击难度。

2. 对上游的经济压力

一个容易被忽视的后果:不支持可复现构建的上游项目将被 Debian 拒之门外。 如果一个上游项目的构建系统嵌入了时间戳、依赖文件系统遍历顺序,或在编译过程中生成了随机标识符,Debian 软件包维护者现在必须修复这些问题,或者申请例外豁免。

可复现构建的”十诫”列出了最常见的非确定性来源:

  • 时间戳:编译日期嵌入到二进制文件中(通过 SOURCE_DATE_EPOCH 修复)
  • 文件系统顺序readdir() 以任意顺序返回文件(通过确定性排序或 ar 归档修复)
  • 构建路径/home/user/build/foo/build/foo 产生不同输出(通过 -ffile-prefix-mapBUILD_PATH_PREFIX_MAP 修复)
  • 区域设置sort 在 en_US.UTF-8 和 zh_CN.UTF-8 下产生不同顺序(通过设置 LANG=C 修复)
  • 随机性:临时文件名生成 UUID(必须做到确定性)
  • 时区:输出随时区变化(必须固定为 UTC)

每个问题都可解决,但每个都需要工作。结果是,Debian 正在对整个开源生态系统施加下游经济压力,迫使其采用确定性构建实践。这可能是本次公告最具生态系统级影响力的结果。

3. 下游影响:Ubuntu、Kali 等

Debian 是超过 120 个衍生发行版的上游源,包括 UbuntuKali LinuxLinux MintMX LinuxRaspberry Pi OSTails。当 Debian 为其 testing 分支强制执行可复现构建时,每个跟踪 testing 的衍生版都继承了这一保障。

Ubuntu 尤其值得关注。在 XZ 事件期间,Canonical 推迟了 Ubuntu 24.04 LTS 的 beta 版并进行了完整的存档重建——这是一项成本极高的操作。如果已经有了可复现构建流水线,验证成本将大幅降低:Canonical 只需选择性重建那些构建产物与预期哈希不匹配的包,而不是重建 30000+ 个包。

4. 与其他发行版的比较

最接近的先例是 NixOS,它从一开始就将可复现构建作为核心设计目标。Nix 基于内容寻址的存储天生支持可复现性验证。但 NixOS 从未强制要求普遍可复现——其生态系统中确定性构建的包比例也很高(超过 90%),但没有 Debian 刚刚引入的这种硬性关卡。

Guix 更进一步——通过可引导构建,旨在将可信计算基础缩小到一个人工可审计的小型二进制种子。

Fedora 一直在推进可复现构建,但尚未宣布硬性政策。Arch Linux 目前在其打包工具链中没有可复现构建基础设施。

Debian 的行动之所以值得关注,是因为它是第一个将可复现性设为硬性要求的主流通用发行版——不是特性,不是最佳实践,而是一道关卡。

5. LoongArch64:地缘政治维度

同时宣布 LoongArch64(Loong64) 进入 Debian 存档,放在这一背景下值得关注。LoongArch 是龙芯中科开发的国产 CPU 指令集架构,定位为 x86 和 ARM 的替代方案。龙芯一直在推动更广泛的软件生态支持,Debian 对 LoongArch 的官方支持是一个重要的里程碑。

这个时间点很有意思。在新增一个来自不同网络安全利益国家的架构的同时强制可复现构建,Debian 借此建立了一个强大的信任框架:任何人都可以验证 LoongArch 的二进制文件是否与源代码一致,从而减少在地缘政治敏感背景下信任构建基础设施的必要。


仍然缺失的部分:硬问题还在

尽管这一政策意义重大,但它并不能解决所有供应链安全问题:

引导问题。 用于构建 Debian 的第一个编译器本身必须被信任。可复现构建可以验证编译器自洽,但无法证明不存在 Ken Thompson 式的信任攻击——被篡改的编译器在其编译的每个程序中植入后门,包括未来的编译器版本。Guix 的可引导构建工作正在解决这个问题,但 Debian 尚未采纳。

可复现 ≠ 安全。 可复现的二进制文件仍然可能存在漏洞。可复现性保证二进制文件与源代码一致——但不能保证源代码没有 bug。2024 年影响数百万台服务器的 OpenSSH 漏洞 CVE-2024-6387(regreSSHion)就无法被可复现构建发现。

硬件相关的构建。 某些包根据 CPU 架构特性或可用指令集的不同会产生不同的输出。在不同构建硬件上实现真正的可复现性仍然是一个挑战。


总结

Debian 14 “Forky” 将不仅仅是一个版本——它标志着可复现构建从”专业领域关切”跨越到主流要求的时刻。XZ 后门证明了威胁模型是真实的,开源生态系统基于志愿者的信任模型是脆弱的。Debian 的答案不是增加更多信任——而是让信任变得可以通过代码验证。

迁移关卡现在已经生效。可复现构建项目长达十年的努力终于进入了执行阶段。每一个软件包维护者、每一个上游项目、每一个衍生发行版都将感受到这一变化的影响。

“信任我们,我们构建的”时代正在结束。“验证我们,方法在此”的时代从 Debian 14 开始。

分享本页