快速摘要
- Debian 14 “Forky” 将引入可重现软件包强制要求,任何人使用相同的源代码和构建指令都能生成位级一致的二进制文件。
- 该举措旨在通过将信任从构建基础设施转移到可审计的源代码来保障软件供应链安全,任何构建层面的篡改都会因哈希不匹配而立即暴露。
- 目前项目进展良好,对于 amd64 和 arm64 等常见硬件架构,Debian “Forky” 仓库中超过 97% 的软件已经可重现。
引言
想象一下,下载一个软件更新时,你能绝对确定没有人篡改过它。你不需要仅仅“信任”开发者或构建服务器,你可以自己证明它。这就是可重现构建的目标,而 Debian 正将其变为强制要求,并作为未来版本的核心部分。
什么是可重现构建?
简单来说,如果任何人使用相同的源代码、相同的环境和相同的指令,都能生成逐位相同的软件副本,那么这个构建就是可重现的。
这意味着最终文件(无论是可执行文件还是发行版软件包)必须完全一致,精确到最后一个字节。验证的主要方法是使用密码学安全的哈希函数来比较文件。如果哈希匹配,你就知道软件是真实的。
为什么位级一致很重要?
你可能会问为什么需要如此严格的指标。答案是供应链安全。
通常,当你通过 apt 安装软件包时,你信任的是 Debian 构建服务器正确编译了你看到的源代码。但如果服务器被黑客入侵呢?聪明的攻击者可以在不触及源代码的情况下向二进制文件中注入“后门”。
可重现构建解决了这个问题。由于输出必须一致,任何人都可以自己重新构建代码来验证。如果服务器提供了被篡改的二进制文件,独立的重建将产生不同的哈希值,立即暴露攻击。
这将信任的焦点从不可见的构建基础设施转移到了可审计的源代码上。
挑战:消除非确定性
实现这种完美程度是困难的,因为大多数构建过程是非确定性的。它们包含微小的随机变化,会改变最终文件。为了使构建可重现,开发者必须追踪并修复这些常见的“陷阱”:
- 时间戳: 工具通常会将当前时间嵌入二进制文件。解决方法是使用
SOURCE_DATE_EPOCH环境变量提供固定的、一致的时间戳。 - 文件顺序: 文件系统通常以随机顺序返回文件列表。开发者现在使用
disorderfs等工具在构建过程中强制排序、可预测的顺序。 - 构建路径: 编译器有时会记录开发者工作的绝对文件夹路径。使用
-ffile-prefix-map等标志可以剥离这些本地路径,使文件夹名称无关紧要。 - CPU 差异: 有时,甚至使用的 CPU 核心数也会改变输出。
Debian 14 Forky:新的强制要求
Debian 社区已经为此努力了十多年。现在,他们正在将这一努力转化为一项要求。
Debian 14(代号 “Forky”),预计于 2027 发布,将引入可重现软件包强制要求。根据这项新要求,软件包必须可重现才能被包含在发行版的“稳定”版本中。
如果一个软件包不可重现,它将不被允许从“不稳定”仓库迁移到“测试”仓库。这意味着如果它不符合标准,就不会进入最终的稳定版。
Debian 如何重建所有内容
Debian 不只是希望事情可重现,他们不断进行测试。reproduce.debian.net 项目尝试重建归档中的每个二进制文件以进行验证。
以下是其工作流程:
- 编排: 一个名为
rebuilderd的工具管理待测试软件包的队列。 - 环境重建: 工具
debrebuild查看.buildinfo文件,以了解原始构建中使用的依赖项的确切版本。 - 重建: 使用
sbuild,系统重建该确切环境并编译代码,以查看生成的哈希是否与原始哈希匹配。
目前,结果令人印象深刻。对于即将发布的 Debian 14 “Forky”,主流架构如 amd64 和 arm64 的重现率已超过 97%。
你可以通过以下链接验证:
该页面显示即将发布的 Debian 14 中的软件包是否可以独立重建并产生位级一致的二进制文件。
以下截图显示了 Debian 14 “Forky” 中 arch:all 软件包的可重现性结果:
该网站的工作方式如下:
- Debian 发布一个软件包。
- 独立的重建服务器获取相同的源代码和构建指令。
- 他们使用
rebuilderd、debrebuild、mmdebstrap和sbuild等工具从头开始重建软件包。 - 将重建的二进制文件与官方的 Debian 二进制文件进行比较。
- 如果哈希完全匹配,则该软件包被视为可重现。
在此链接中,你还可以找到:
- 不同架构的页面,如 amd64、arm64、i386、riscv64 等。
- 关于失败重建的统计信息。
- 软件包搜索。
- 重建工作节点状态。
以下是 Debian 14 Forky 中 arch:amd64 软件包的可重现性结果:
以下是 Debian 14 Forky 中 arch:arm64 软件包的可重现性结果:
超越代码的测试
虽然可重现性证明了二进制文件与源代码匹配,但 Debian 还使用 autopkgtest 来确保软件实际工作。
与检查组件内部是否正常工作的标准单元测试不同,autopkgtest 执行全包集成测试。它在虚拟环境中运行软件包,以确保它与系统的其余部分正确交互,例如检查程序在缺少配置文件时是否会崩溃。
行业新标准
Debian 并不孤单。像 F-Droid 这样的项目也在推动 Android 生态系统的可重现性,以确保用户获得开发者意图的确切代码。
通过迈向可重现构建,Debian 为开源领域的问责制和透明度树立了高标准。这是一项强有力的安全投资,保护开发者和用户免受针对数字基础设施的复杂攻击。
资源:




