如果并非所有包构建都是可重现的,那么如何保证用户不会运行相同版本和架构的两个不同二进制文件?
答案1
无法验证二进制包是否按照源代码所说的那样执行(这在理论上和实践中都是一个无法解决的问题)。但是,如果您知道二进制包是如何生成的,您也许可以确定它是编译源代码的结果。这需要信任:
- 编译工具(不仅仅是编译器本身,还包括构建过程中涉及的所有其他工具,例如
make
、tar
等):您需要相信他们正确地完成了自己的工作; - 进行编译的机器(您需要相信它们按预期执行了编译工具);
- 从进行编译的计算机到使用包的计算机的分发链。
主要发行版在严格控制的基础设施上构建二进制包(只有少数管理员可以访问这些机器),使用来自发行版本身的编译器(因此,只要没有编译器有错误或后门,并且没有从使用受感染的机器,不会出现任何问题)。构建包时,同一台机器(或在同一严格控制的基础设施中运行的机器)对其进行加密签名。加密签名可确保最终用户计算机上安装的软件包正是在构建基础设施上生成的软件包。所有主要的包管理工具(apt、yum、dnf 等)都会验证包签名。
因此,分布本身不验证(1)(它不能),并确保(2)而不是验证它,但分布验证(3)。
可重现的构建有助于实现 (2):它们提供独立的验证,确保构建按预期进行,从而防止构建基础设施受到损害。
已经针对(1)提出了独立编译的方案,但它们很少实用:大多数语言没有独立的实现。