最近,在GoTo芝加哥,我做了一个关于这个主题的演讲,并认为写一篇有结论的文章会很好。 这篇文章是关于为什么开源固件对于安全性很重要的原因。
权限等级
在典型的堆栈中,您具有不同的特权级别。
- 第3环:应用程序:最低特权,但用户空间中的沙箱除外,该特权更为有限。
- 环0。内核:操作系统的内核,如果是开源OS,则可以看到其代码。
- 环-1。 系统管理程序:虚拟机监视(VMM),创建并运行虚拟机。 在Xen,KVM,bhyve等开放源代码管理程序中,您会看到代码。
- 环-2。 系统管理模式(SMM),UEFI核心:专有代码,请参见下文。
- 环-3。 控制引擎:专有代码,请参见下文。
负环表示特权大于零的级别。
从以上内容可以明显看出,在-1至3的环中,我们有机会使用开源软件,并且可以在很大程度上查看和控制它。 对于低于-1环的级别,我们的控制较少,但是由于开源固件开发和社区,这种情况正在改善。
这是一个矛盾的情况:最封闭的代码在我们的系统中拥有最多的特权。 这个矛盾应该修复开源固件。环-2。 SMM,UEFI核心
此环控制所有CPU资源。
系统管理模式(SMM)对它顶部的其余堆栈不可见。 它有一半的核心。 最初用于电源管理和系统硬件控制。 它包含许多专有代码,是供应商添加新专有功能的地方。 它处理系统事件,例如内存或芯片组错误,以及其他逻辑。
UEFI内核极其复杂,具有数百万行代码。 下载后,UEFI应用程序处于活动状态。 核心是根据“默默无闻的安全性”原则开发的。 如果要四处逛逛,
该规范绝对
是疯狂的。
环-3。 控制引擎
最特权的戒指。 对于英特尔(x86),这是英特尔管理引擎。 该系统可以安静地打开节点并覆盖磁盘,内核启动
Minix 3以及Web服务器和整个网络堆栈。 事实证明,由于这个原因,Minix是最流行的桌面操作系统。 控制引擎具有许多功能。 我可能需要一整天才能列出它们。 如果您愿意,有
很多 资源可以进行更详细的研究。
在我们的堆栈的ring -2和ring -3之间,至少有两个半其他内核,以及一堆专有的和不必要的复杂性。 每个核心都有自己的网络堆栈和Web服务器。 代码可以自行更改,在关闭电源并重新安装后仍然可以保留。
鉴于这些环具有最多的特权,我们几乎没有关于这些环中代码实际执行的操作的信息,这太可怕了。他们都有功绩
环-2和-3中存在漏洞应该不会令任何人感到惊讶。 一旦找到它们,那真的很可怕。 仅作为示例,尽管您可以自己搜索其他示例,但是
英特尔管理引擎Web服务器中存在
一个错误,该错误是开发人员已经七年不知道的 。
情况如何改善?
NERF:不可扩展的精简固件
NERF是社区正在努力的目标。 目的是降低固件的危害能力,并使固件的行为更明显。 他们努力删除运行时的所有组件,但是在英特尔管理引擎中仍然很难做到这一点。 但是您可以从此处删除Web服务器和IP堆栈。 开发人员还希望删除UEFI IP堆栈,其他驱动程序,并删除英特尔管理/ UEFI自固件功能。
me_cleaner
用于将Intel Management Engine清洗到所需的最低功能的项目(
在GitHub上 )。
u-boot和coreboot
u-boot和
coreboot是开源固件。 他们处理芯片初始化和DRAM。 Chromebook同时使用x86上的coreboot和其余的u-boot。 这是他们
检查加载的步骤之一。
Coreboot的设计理念是
“尽量减少使用硬件的必要,然后将控制权转移到另一个称为有效负载的程序 。
” 在这种情况下,它是linuxboot。
linux启动
Linuxboot处理设备驱动程序,网络堆栈,并提供多用户多任务环境。 它基于Linux构建,因此单个内核可以在多个板上运行。 Linux已经被充分测试,并且许多人遵循该代码,因为它已经被广泛使用。 最好使用带有大量“控制器”的开放式内核,而不是另外两个不同且封闭的内核。 这意味着我们减少了由于更少的代码变体而产生的攻击面,并依靠开源代码。 Linux通过用增强的Linux驱动程序替换未经测试的固件驱动程序来提高启动可靠性。
使用内核,我们已经有了固件工具:开发人员在需要编写逻辑以验证签名,加密磁盘等时,可以使用熟悉的工具。 所有这些均采用现代,经过测试,支持和易于阅读的语言。
根
u-root是golang用户空间工具包和引导程序。 它用作linuxboot中Linux内核的initramfs。
他们说NERF堆栈已将启动时间减少了20倍。 但这是一篇安全性文章,所以让我们回到安全性上吧……
NERF堆栈提高了许多以前完全专有的组件的可见性。 但是,设备仍具有许多其他固件。
那其他固件呢?
我们需要网络接口控制器(NIC),固态驱动器(SSD)和基本管理控制器(BMC)的开放固件。
Open Compute项目正在
NIC 3.0固件上做一些工作。 看看他们在做什么会很有趣。
BMC既有
OpenBMC也有
u-bmc 。 我在
上一篇文章中写了一些关于它们的
文章 。
我们需要所有开源固件,以确保在堆栈上具有完全可见性,并实际检查计算机上软件的状态。
信任的根源
信任根的目的是验证是否在设备的每个组件上都安装了适当的软件。 您可以确保设备未被黑客入侵。 由于我们现在在设备的许多区域都有大量封闭的源代码,因此很难做到这一点。 如何真正知道组件固件中没有漏洞或后门? 没办法 开源是另一回事。
似乎每个云和每个供应商都提供了自己的信任根源。 微软有
Cerberus ,谷歌有
Titan ,亚马逊有
Nitro 。 它们似乎暗示着对专有代码(我们看不到的代码)的明确信任。 留下一种奇怪的感觉。
使用完全开源会更好吗? 然后,我们可以毫无疑问地验证从源代码编译的代码是否与在安装了固件的设备上运行的代码相同。 然后,我们可以检查机器是否处于正确状态,而不必怀疑它是否容易受到攻击或带有后门。这使您想知道什么小型云提供商(例如DigitalOcean或Packet)用作信任根。 我在Twitter上问了这个问题,但没有得到应有的答案...
保罗•麦克米兰 (
Paul McMillan)和马特•金
( Matt King)
在结垢时进行了设备安全的精彩演讲。 作者详细描述了如何保护硬件,同时使客户可以使用它。 当他们从客户那里收到设备退回时,他们需要始终如一地可靠地确保一切保持不变,并且任何组件中都不会隐藏任何意外。
所有云提供商必须确保在客户端对其进行计算之后,设备才不会受到损害。
平台固件容错
但是,芯片制造商似乎有一种特殊的外观。 英特尔具有
平台固件弹性 ,莱迪思具有
平台固件弹性 。 他们似乎更专注于NIST
平台固件的容错指南。
我试图在Internet上询问使用它的人,但收到的答复很少,因此,如果您使用具有平台固件弹性技术的设备,请告诉我!
从
OCP关于英特尔固件创新的
演讲中,看来英特尔的平台固件弹性(PFR)和Cerberus齐头并进。 英特尔使用PFR来实现Cerberus认证原则。 感谢
@msw的澄清。
减少杂乱无章的工具来完成此工作将是很好的。 我还希望看到源代码,以亲自了解它是安全的。
如何协助
我希望您对开发开源固件的现有项目有什么了解,以及它的重要性! 如果您想提供帮助,请告诉其他人。 尝试使用开源平台。 Chromebook和
Purism电脑都是一个很好的例子。 您可以问供应商他们做什么来发布开源固件,并以信心为根基确保设备安全。 快乐的书呆子! :)