找到底部乌龟

2021-06-21 12:26:11

如果你从来没有阅读过受信任信任的经典反思,那么你喜欢对计算基础的想法,请读。太奇妙了。它详细说明了今天我们无法真正信任大部分软件的现实。

随着时间的推移,从这个演讲的想法演变为对开源软件的重要报答:我们是否知道我们正在运行的Proprams对应于我们访问的源代码?

我将开始简要回顾信任的信任攻击。 Saynyou试图在没有检测到的情况下恢复到流行的开放型号的开放棋牌。修改他们的源代码才能发现很难(虽然人们之前有过伦))。修改释放二进制文件ISA的体面方式来获得时间点妥协,但是一个简单的重建来源既可以解决问题并使其在BinaryDiffs中可见(假设可重复的构建,这是另一个蠕虫的蠕虫即可获得现在进入)。

更狡猾的攻击是将恶意代码插入编译器,使其识别它正在编译TargetSoftware并在那里插入后门。重新编译从Source和Source Inspection无济于事,因为后门在每一个编译时可靠地获取。

这只是推动问题一步一步进一步将链条进入TheCompiler。如果您可以从来源重新编译,您可以消除返回。我们在今天计算中的问题是大多数人是自主托管,这意味着他们用他们编译的非常简单地写作。

换句话说,要从源自源构建GCC的清洁副本,您可以使用...一个C编译器二进制(实际上是一个C ++编译器二进制表格,但让我们假设您从GCC 4.7或较旧的开始,唯一只需进行C)。

这是引导问题。如果您足够深入挖掘任何系统,您将达到从来源的第一件您需要的位置是一个自主主机编译器......意味着您需要ToalReady为该语言编译。

在构建Linux发行版时,这会出现。如果您想要对您的发行发行的强制断言,您需要某种软件补充链的保证,这意味着您将想要自行的源自源。对于Linux Distrs,如果您足够深,您最终将获得编译GCC ...这需要C编译器和大多数基本UNIX系统(Shell,各种核心实用程序......)甚至构建。

因此,要从源代码构建Linux系统,您需要已经有伪日天际系统,您没有从Sourceyourself中编译......因此不能提出任何承诺。

此时,那里有两种人。考虑到现代计算机和备注的复杂性,一组群体务实:鉴于现代计算机的复杂性,信任信托攻击非常困难。要插入精确的后门,损害了一种特定的片段软件的供应链,而不会导致任何其他程序中的逆向效应,同时也稳健地将源代码“上堆栈”随时间的变化......呃,它非常努力地从不发生了。

因此,谁关心我们如何引导到我们的小宇宙中? Gccrequires a c编译器和Unix-ish环境?酷,我会刚刚从哦,哦,我不知道,Ubuntu,并使用那些引导mysoftware树。他们可能很好。

在实践中,最多的Linux Distr(以及我的理解,流行的专有OSE)最终是什么。如果将PackagedEnceptendency Tree Down Down到最底层,则最终将找到奇迹般的包,该包奇迹般地包含立即下一个层次的各种二进制文件,但无法从Source重建。菲亚特勒克斯!

我很高兴在世界上存在的实用主义者,否则我现在不会求爱这篇文章,因为我没有Emacs,或Go,Orhugo,或带网络和显示驱动程序的Linux内核,...

但是,在心里,我是纯粹主义者。在一些基本层面,它困扰着我,这是现代计算的整个大厦建立在一个摇晃。在过去的某个时刻,我们从未从今天到达今天的地方建造了我们的方式。但是因为我们没有向供应链安全行为,所以在某些时候,我们失去了Cultody的链。

在遥远的过去的某些时候,PDP-7汇编程序中有一个Proto-C编译。具有足够的护理和中间步骤,您可以使用Proto-C编译器来构建您的方法,以便从那里到达一个完整的Linux发行版。但这条路径可能会对时间丢失的软件和硬件,所以Chainis破坏了(除了,PDP-7汇编程序来自哪里?以及编辑软件?以及运行PDP-7的软件足以收到文本输入和组装?)。

那么,我们今天如何返回引导系统?这是Bootstrappable.org家族的purpospults。他们这些天似乎大多是GNU-隶属,所以他们的客人将从工作的GCC建立环境倒退到尽可能地“毫无”。

最终,目标是让奇迹般的预先现有的种子足够小,以便单一人类可以通过手动检查和验证机器代码,并使用源代码备份。

以下是本领域当前状态的摘要(意思,通过这种方式的一个非常有关的Distros of Distrs Bootstrap,并且是“大多数ootebootstrappable”分列):

要构建当前的GCC,您需要一个C ++编译器:GCC 4.7,In专用于C编写的LastGCC版本。

要构建GCC 4.7,我们需要C编译器:GCC 2.95。我并不完全是为什么这一层间接存在,但没有人才能消除,这让我认为它支持重要的C功能(例如ISO C99的位),下一个层次没有。

为了构建GCC 2.95,我们仍然需要一个C编译器:TCC,一个Compiler Toolchain,仅在数百千字节(GCC)的数百千字节(GCC),AndMaybe兆字节或两个源代码中重量。

要构建TCC,我们仍然需要一个C编译器:GNU MES,令人欣赏的奇怪工具,包括相互自主托管的C和Scheme编译器。

目前,MES是底龟。与GCC开始相比,最终信任程序的数量从〜250mib收缩到〜60mib。而且,在这一链条中,我们有一个C编译器没有写入C.相反,有两个不同的语言,每个语言都在另一个中实现。此外,方案勾选器被写入更基本的C子集。

为此基本C子集提供编译器,它为您提供了ascheme解释器,可以在方案中运行更全功能的c编译。

正如我上面所说,现在MES是底龟。 Theart启动链的状态以“奇迹套装二进制文件套在MES方案翻译”结束。这是一个较小的块的块状代码,但它仍然是6000万字节的东西,远离人类检查和用手验证的人。

那么,我们如何引导到MES,并进一步减少计算底部“奇迹”种子的大小?输入第一个项目。

Stage0的目标是从一块机器代码开始,如此清晰的是,它可以通过手动使用Hocessor参考手册来拆卸它,并完全理解并验证。源于,Stage0可用于逐步构建到足以运行MES C编译器的基础上的解释器 - 在哪个点ME可以编译自己的方案运行时,剪掉所有上个舞台,并继续攀登复杂性阶梯......但从Asolid基础上继续攀登。

Stage0项目通过几个步骤来通过几个步骤“手动进入计算机中的机器代码”(奇迹Stage0二进制文件是“读取一些十六进制数字的解释器”,建立一定的符号汇编程序,Basic C编译器或方案解释器可以留下。

也许略微奇怪,为了使这一引导造影分级经销商,早期的阶段是为组成的VirtualMachine编写的。这一想法是为了提出一个全新的平台,你是最终需要实现这个VM,然后你可以开始建立第0级。我没有亲自相信,这比简单地宣布第一个引导阶段依赖于100%的平台。凭经验,Stage0 Project AnitessomeWhat,因为它还提供了X86的早期权利阶段的实现,因此您可以在真正的硬件上引导。

但是,这个VM层的存在确实突出显示了一个提出的问题,即Stage0项目试图搏斗:是由此成为真正的引导可能的硬件吗?

假设第0阶段的最后阶段和MES集成完成。 WeCan最后,宽敞的粉丝,加载神奇的Stage0 BinaryInto我们的x86处理器,并启动了从4Rustable基础的软件的整个宇宙。 CPU执行ISONE的第一指令我们手动检查和验证!

除了它不是,是。当你的代码在x86上运行时,数百兆字节的固件已经向initializethe系统执行了足够键盘和显示工作的东西。更糟糕的是,其中一些固件在您​​的代码上有看不见的超级大国。 SMMCAN执行代码超出了Mere Ring0软件的意识,Andhas对其执行环境的总控制。

这不是假设的风险。政府机构在过去建立了SMMROTKITS,因为它们是一个完美的地方,他们是一个完美的地方,他们是一个完美的地方,他们是整个底层系统的信任。

然后甚至低于SMM,英特尔管理引擎和AMDplatform安全处理器是另一层最终的特权代码,甚至没有在同一台计算机上运行的代码,而是HasunFettered对硬件的访问权限。

这不是限于x86的东西。现代计算机如此复杂,可以始终存在一定量的软件,使处理器从统治到一个合理的executionEnvironment的点。甚至基本ARM Cortex M0微控制器也包含一个Afirmware ROM,实现基本的硬件培养和闪烁USB的特定硬件。从根本上说,在现代计算机上,你是第一指令特权。

那么,这整件事毫无意义吗?这感觉就像我们在我们的引导中达到了Apoint,我们必须运行PreSXISTingSoftware我们不信任,无法替换,无法避免。

这是很多纯粹主义者都应该成为务实所的地方。大多数自行启动爱好者可能会使用x86 computerdledle固件。即使是最顽固的Libre纯粹主义者也是用CoreBoot的WhoOverwrite他们的固件,运行Me_Cleaner到中性的管理引擎尽可能多,无法摆脱系统中的所有固件,而不是沿着镜头。

这并不意味着这一切都不毫无意义。安全性在安全性的重要作品是检测与预防一样重要。那里,你能告诉你什么时候出了什么问题吗?

在这种光中看到,尽可能地减少不受信誉的表面。我们甚至可能会将强制性不受信任的Firmwaresurface降至手动检查和验证可取的程度。它不会是开源,但我们仍然可以证明它是无害的。

仍然会有很多人,就像我一样,在VendorFirmware的大斑点上运行最为开源的软件堆栈,我们选择忽略它可以忽略,以便我们可以继续下去。但也许我们用来引导这些系统的二进制文件应该来自更多“纯粹”。如果靴子在坐在不值得信任的底龟上的系统上抓获,则YOUCAN永远不会撤消这一点。但是,如果Bootstrap从Trustedplace开始...

好吧,它不能为初学者拥有任何固件。对于我们的最终用户框,我们希望开源,可更换的固件,以便我们可以将我们的Supply Chain Security一直扩展到硬件...... Butsomeone必须编译该固件,它不能是我们的TROWSTRIPPER。

我们还需要第一个程序,运行不源于其他电脑,自从在这个思想练习中,我们假设我们没有建立自己的Allsoftware是嫌疑人,可能会腐败我们宇宙的自身。

所以,奇怪的是,第一件软件不能成为软件。它更加类似于硬件。采取到极端,它可以用正确的方式钩住钩住的电线,或核心绳索记忆的储备,使其脱掉电子。 Theidea将不得不从大脑中跃入物理世界,而不经历软件中间阶段。

这感觉就像我认为我们已经丢失了现代计算的一个神秘经验。如今,如果您有一个新的平台,您希望引导启动,您可以使用您使用的现有计算机,用于傀儡何种新硬件。您对新目标交叉编译软件,通过USB程序员闪光itstorage,您已完成。它的方式比从头开始释放的方式,但它模糊了从纯粹的硬件世界到软件的宇宙中的关键牵引。每次转换发生时,它都是一种巨大的巨大宇宙的可抵押思想。我认为这是一种遗憾的是,我们优化了对少数人在世界之间进行过度飞跃的观点。

无论如何,足够神秘主义。第一个硬连线程序是自动启动的最终底龟。除了硬件和人类之外,没有下面的多哥没有地方。

一旦您拥有硬连线监视器,您就可以遵循类似的步骤0和MES来构建您想要的任何内容。但是,从如此低级开始,一个能够在没有固件的情况下工作的CPU,你可能会在披风的一块硬件上运行(可能甚至可以从独裁离校学家播出......当我提到核心时我觉得我正在开玩笑ropememory?)。

下一步是要到达一个点,在哪里可以从源自稍微更好的机器源头,说RISC-v登机机A POWER9,这两者都有一半的机会能够进行润滑的固件。然后,您再次重新启动“Stage0”的引导,但这一次运行在更有力的机器上,您构建了自己的运行运行。这台机器可能是强大的eNuareo一直到GCC,从那里到达你想要的其他软件。

假设您想要的软件是交叉编译的,您甚至可以为X86等平台提供可用于平台的软件,其中固件大通完全可信。当然,你永远不会确定他们的罪恶是值得信赖的,但至少你的二进制文件不会是Weak的链接,你总是有一个可值得信赖的事情,你可以备份染色的东西。

因此,这是引导性的最终,以及为什么Stage0project正在欺骗这个虚拟机。也许有一天,有人会在实际硬件中实例化该机器,在哪个点赛段将准备从中启动宇宙。

我不知道。 这篇文章只是在发现引导艺术艺术的历史记录的冒险记录,并思考在为我们的软件维护中重新创建引导链的问题。 还有整个问题是硬件本身是否可取,以及我们如何尝试制作它。 但是对于我的初学者来说,答案是为了安全地从事硬件TOSoftware的飞跃而不失去我们的监护链。