Dav*_*d J 64 linux compiling kernel compiler gcc
假设我在美国/英国以外的一家大型服务机构工作。我们广泛使用 UNIX 和 Linux 服务器。
通读这篇文章,它提到将后门插入 C 编译器很容易,然后用该编译器编译的任何代码也将包含后门。现在鉴于最近有关 NSA/GCHQ 授权在所有加密方法、硬件和软件中放置后门/弱点的泄密事件,编译器现在是一个关键的故障点。可能所有标准的 UNIX/Linix 发行版都可能受到损害。我们不能让流氓政府损害我们的系统、数据和客户数据。
鉴于这些信息,我想从头开始构建一个受信任的编译器,然后我有一个安全的基础来构建,这样我就可以使用该编译器从源代码构建操作系统和应用程序。
从源代码编译编译器(一个看似鸡生蛋的场景)然后从头开始编译受信任的 Unix/Linux 发行版的正确(和安全方法)是什么?
您可以假设我或其他人有能力阅读和理解安全漏洞的源代码,因此在编译之前将首先审查源代码。我真正想要的是一份从头开始安全地生成这个编译器的工作指南,可用于编译内核、操作系统的其他部分和应用程序。
如果我们要对在该堆栈上运行的操作系统或应用程序有任何信心,安全堆栈必须从基础级别开始。是的,我知道可能存在硬件后门,它们可能会在编译器构建时将一些微代码插入到编译器中。除了可能使用不是在美国设计的芯片之外,我们目前对此无能为力。让我们先对这一层进行排序,并假设我可以在插入任何后门之前在旧计算机上构建它。
正如布鲁斯·施奈尔 (Bruce Schneier) 所说:“我对工程师们说:我们建立了互联网,我们中的一些人帮助颠覆了它。现在,我们这些热爱自由的人必须修复它。”
额外链接:
str*_*gee 30
AFAIK 完全确保安全性的唯一方法是用汇编语言编写编译器(或直接自己修改磁盘)。只有这样你才能确保你的编译器没有插入后门——这是有效的,因为你实际上完全消除了编译器。
从那里,您可以使用您的从头开始编译器来引导例如 GNU 工具链。然后您可以使用您的自定义工具链来编译Linux From Scratch系统。
请注意,为了让您自己更轻松,您可以拥有第二个用 C(或任何其他语言)编写的中间编译器。所以你会在汇编中编写编译器 A,然后在 C/C++/Python/Brainfuck/whatever 中重写该编译器以获得编译器 B,你将使用编译器 A 编译它。然后你将使用编译器 B 编译 gcc 和朋友。
use*_*ser 23
一种可能的方法,虽然在实践中需要非常长的时间,但它是回归本源。GNU 的开发始于 1984 年,Minix 的原始版本(在早期 Linux 开发期间用于引导目的)于 1987 年发布。
整个答案基于您的前提,即“[您] 或其他人有能力阅读和理解安全漏洞的源代码,因此在编译之前将首先审查源代码”,并且您可以相信此类分析的结果. 没有它,这个答案可能比毫无价值更糟糕,因为您将花费大量时间而绝对没有任何好处。
如果您可以找到带有源代码的原始 Minix 书的副本,则可以从书中输入它。编译它,然后在不同的系统上使用不同的反编译器来验证编译器是否生成了预期的机器语言二进制输出。(代码只有 12,000 行,大概是 C 语言,因此这样做很耗时,但如果您认真对待这样的项目,这仍然在合理范围内。)您甚至可以编写自己的反汇编程序;这应该不是很困难。
获取您可能获得的最旧版本的 GNU 实用程序(因为它们可能具有较少的代码和对外部库的较少依赖),检查代码,为 Minix 构建它(不过,这可能需要一些工作;绝对要避免的是对源代码进行调整,因为这会使以后添加补丁非常容易出错)并为 GNU 工具经历类似的反汇编验证周期。那时你信任操作系统和工具链,所以你只需要查看补丁集中的源代码(任何不在补丁集中的都已经被信任),但与你使用的工具相比,这些工具仍然非常原始和粗糙到今天。例如,除了系统工具最基本的功能之外,不要期望任何其他功能。阅读大量 XKCD。
在某个时候,您将拥有一个可以编译和引导早期版本的 Linux 内核的系统,就像在 1990 年代初 Linux 开始在黑客中受到关注时所做的那样。我建议此时迁移到 Linux(针对 Linux 重建系统库和工具链,构建 Linux 内核,引导到 Linux 并可能在 Linux 中重建 Linux 内核和 GNU 工具链;最后证明系统现在是自托管),但这在很大程度上取决于您。不断验证补丁,修补内核、库和基本 GNU 工具,并重新构建,直到您获得现代版本。
那就是当您拥有可用于构建现代软件的可信赖的基本操作系统和编译器时。到那时,您可以遵循例如Linux From Scratch指南来构建一个能够执行有用任务的系统。
“编译器”系统在任何时候都不能以任何方式连接到网络(包括作为网络主机上的虚拟机);您可能会冒着渗透到任何具有网络功能的组件(包括内核)的风险。如果您担心Thompson 编译器攻击,您必须预料到任何 VM 主机也可能会受到威胁。使用sneakernet 从你正在编译的物理主机上获取源代码和二进制文件。预计至少在您实现 USB 大容量存储支持之前,在系统上打开和关闭文件会遇到麻烦。如果你真的偏执,打印源代码列表和手(和希望键入他们的打印机驱动程序和打印机不具备类似的代码它们),或在一台计算机显示器上读取代码,然后将其键入到物理上靠近但未连接到它的另一台计算机中。
是的,这将需要很多时间。但是这种方法的优点是每一步都是渐进式的,这意味着任何恶意的东西都很难漏掉,除非它在多个版本的一段时间内逐渐引入;这是因为每个步骤的更改集相对较小,因此更容易查看。将补丁集与更改日志进行比较,并确保您可以准确确定哪个更改日志条目对应于源代码中的每个更改。同样,这确实假设您有能力(可能通过您信任的人)来验证此类更改没有潜入代码库中,但它应该让您像纯软件一样接近受信任的系统,除了 -固件办法可以。
| 归档时间: |
|
| 查看次数: |
4685 次 |
| 最近记录: |