一种可能的方法,尽管在实践中会花费很长时间,但要回到根源。GNU的开发始于1984年,Minix的原始版本(在早期Linux开发中用于引导目的)于1987年发布。
完整的答案是基于您的前提,即“ [您或其他人具有阅读和理解安全漏洞源代码的能力,因此在编译之前将首先对源代码进行审查”,并且您可以相信这种分析的结果。没有这个答案,这个答案可能会比一文不值的糟糕,因为您将花费大量的时间完全没有任何好处。
如果您可以找到带有源代码的Minix原始书的副本,则可以从书中键入它。对其进行编译,然后在不同的系统上使用不同的反编译器来验证编译器是否生成了预期的机器语言二进制输出。(代码只有12,000行,大概是C,所以这样做很耗时,但是如果您对这样的项目很认真的话,这仍然是合理的。)您甚至可以编写自己的反汇编程序。那应该不是很难。
抓住您可能会接触到的最旧版本的GNU实用程序(因为这些代码可能具有较少的代码,并且对外部库的依赖较少),遍历代码,为Minix构建(尽管这可能需要一些工作;但是,您会发现)绝对要避免的是对源代码进行调整,因为这会使以后添加补丁程序非常容易出错),并且会为GNU工具经历类似的反汇编验证周期。那时,您已经信任了操作系统和工具链,因此您只需要遍历补丁集中的源代码(补丁集中的所有内容都已经被信任),但是与您使用的工具相比,这些工具仍然非常原始和粗糙到今天。例如,除了系统工具的最基本功能之外,别无所求。阅读很多XKCD。
在某个时候,您将拥有一个可以编译和引导Linux内核的早期版本的系统,就像在1990年代初Linux开始受到黑客的欢迎时所做的那样。我建议此时迁移到Linux(针对Linux重建系统库和工具链,构建Linux内核,引导至Linux并可能在Linux中重建Linux内核和GNU工具链;最后一个证明该系统现在可以自我托管),但这完全取决于您。不断验证补丁程序,修补内核,库和基本的GNU工具,以及重新构建,直到获得最新版本为止。
那就是当您拥有可用于构建现代软件的受信任的基本OS和编译器时。届时,您可以按照《Linux From Scratch》指南进行操作,以构建能够执行有用任务的系统。
“编译器”系统绝不能以任何方式(包括作为联网主机上的VM)连接到网络;您可能会冒险渗透到包括内核在内的任何具有网络功能的组件。如果您担心Thompson编译器攻击,则必须期望任何VM主机也可能受到威胁。使用sneakernet可以在要编译内容的物理主机上获取源代码并从中获取二进制文件。至少在实现USB大容量存储支持之前,至少要在系统上打开和关闭文件时遇到麻烦。如果你真的偏执,打印源代码列表和手型他们(和希望,打印机驱动程序和打印机不具备类似的代码它们),或在一台计算机显示器上读取代码,然后将其键入物理上相邻但未连接的另一台计算机。
是的,这将花费很多时间。但是这种方法的优点是每个步骤都是渐进式的,这意味着,除非经过许多版本的逐步采用,否则任何恶意软件都很难通过。这是因为每个步骤的更改集相对较小,因此更容易查看。将补丁集与变更日志进行比较,并确保您可以准确确定哪个变更日志条目对应于源代码中的每个变更。再一次,这确实假设您有能力(可能通过您信任的人)验证这种更改是否没有潜入代码库中,但是它应该使您与仅软件一样接近受信任的系统,除了-固件方法可以。