这个问题不是关于如何将构建工件和签名追溯到其“可信来源”——操作系统维护者。我问这个问题深度Linux发行版记住,其中一些用户对下载和安装 ISO 映像有合理的担忧由一家中国公司建造和发行。
即使安全专家能够检查和清除操作系统发行版的大量代码,甚至忽略所有可信的上游依赖项,我如何确定维护人员在构建过程中没有陷入公共代码库之外的邪恶内容?即使对于像 Ubuntu 这样的知名发行版,拥有“信任但验证”的心态仍然是件好事。
我见过的典型答案是“自己建造!对于一个小型的开源应用程序或库来说,这可能并不困难,但对于一个完整的 Linux 发行版来说,这个过程将是一项艰巨的任务,对于深度操作系统的目标 Linux 初学者来说,这绝对是不可能的。
理想情况下,关键开源软件的每个版本都将基于相同的提交和挂钩依赖项构建由独立各方,并且会有一个工具可以在可执行文件的指令级别上比较这些构建中的所有工件,以确保它们真正“相同”(忽略由于时间戳引起的差异)。
那么,这样的工具存在吗?
答案1
不幸的是,目前无法根据源代码自动验证发行版。然而,有一些中间结果可以在一定程度上使用;可重复构建项目是主要驱动力。
再现性是指在输入相同的情况下的能力和相同的工具,产生相同的输出工件。各种各样的参与可重复构建工作的项目从而允许一定程度的再现性;例如:
- 许多 Debian 软件包是可复制的,因此给定相同的源软件包和相同的构建环境(编译器、构建依赖项等),您将获得完全相同的软件包;
- Debian 的官方 Docker 镜像是可重复的,因此给出相同的参考包(不是源代码)和相同的构建工具,您将获得完全相同的根文件系统。
最终用户对上面生成的工件进行验证尚不可能,特别是因为记录构建环境的文件尚未发布(据我所知)。但它们被保留下来,所以在某个时候这将成为可能。
我不认为任何“大型”发行版都支持从源代码到发行介质(ISO 等)的可再现性,更不用说验证了。路上有很多障碍:
- 然而,并非所有软件都可以重复构建;
- 可重现的工件嵌入了其构建环境的“知识”,并且在发行版准备期间是可变的(因此验证发行版将涉及重建其历史);
可能还有其他我现在没有想到的。尾巴确实发布了完全可复制的分发媒体,因此这在技术上是可行的,但它需要分配可复制;如果发行版未以可重复的方式发布,则外部参与者无法对其进行验证。 (这并不能阻止外部审计的存在,有时甚至是有用的。)
看看各种项目在 Reproducible Builds 网站上引用,其中一些专注于使这一切变得更简单;参见例如整体。 Reproducible Builds 项目本身发布了许多工具这可以帮助生成和分析可重现的工件。
即使没有可重复性和可验证性,您问题中的一点已经在很大程度上得到解决:
我如何确定维护人员在构建过程中没有陷入公共代码库之外的邪恶内容?
大多数发行版(我不知道 Deepin)仅发布在自己的构建基础设施上构建的二进制工件,因此维护人员无法将任何内容放入公共代码库(公共代码库中,与工件一起记录)之外。这不会消除您对发行版本身的隐式信任,这是您在这里主要关心的问题,但至少它消除了个别维护者发布恶意工件而不发布相应源代码的能力。
另请参阅肯·汤普森的经典之作“关于信任信任的思考“, 和关于信任编译器主题的后续研究;以及以下问题: