acm-header
登录

ACM通信

实践

开源固件


开源固件,插图

图片来源:Philipp Tur

回到顶部

Windows、Linux和macOS等操作系统都有内核。内核控制对系统资源的访问。它包含允许多个进程共享硬件机制(如CPU、内存、磁盘I/O和网络)的逻辑。

当计算机启动时,用于初始化DRAM、硅和设备的主界面是固件。固件通过引导加载程序初始化操作系统。您可能听说过GRUB(源自Grand Unified Bootloader),这是Linux发行版的一种常见引导加载程序。

每台计算机或服务器通常都带有由生产它的供应商生产的固件。固件存在于SSD/HD(固态驱动器/硬盘驱动器)、键盘、鼠标、CPU、网卡和其他设备中。

固件中的漏洞会导致很多伤害,因为固件负责许多特权操作。例如,考虑对SoftLayer的入侵,3.裸金属云,其中基础管理控制器(BMC)被黑,留下一个后门,以便当客户使用服务器后重新配置服务器时,黑客仍然可以访问该服务器。任何云提供商的最低标准都是为用户提供一台在使用后能够被彻底清除的机器。这显然违背了我们的承诺。

更糟糕的是,大多数固件都是私有的。具有最多特权的代码具有最少的可见性。这就导致了有能力同时影响多个平台上的用户的入侵和事件。对于黑客来说,这就像猫薄荷。

开源固件可以通过使固件的操作更加可见和不太可能造成伤害来帮助将计算带到一个更安全的地方。本文的目标是让读者感到有能力向能够推动这种变化的供应商提出更多要求。

这是对一个复杂话题的介绍;有些部分只是触及表面,但其目的是提供开源固件世界的全貌。

回到顶部

特权级别

今天的计算机有各种级别的特权。

  • 环3用户空间。这枚戒指的特权最少。这是运行用户程序的地方。用户空间沙盒可以进一步限制特权。
  • 环0内核。这是操作系统内核;开源操作系统允许看到内核背后的代码。
  • 环1管理程序。这个VMM(虚拟机监视器)创建并运行虚拟机。诸如Xen、KVM、bhyve等开源管理程序提供了对这个环背后代码的可见性。
  • 系统管理模式(SMM),统一可扩展固件接口(UEFI)内核。这是控制所有CPU资源的专有代码(后面会详细介绍)。
  • 环3管理引擎。这是一种专有代码,只要主板在接收电源,它就会运行,即使它是关闭的(后面会详细介绍)。

这个总结清楚地表明,环-1到3可以选择使用开源软件,并且对软件有很大的可见性和控制权。环-1下的特权级别允许更少的控制,但随着开源固件社区和项目的发展,这种情况正在改善。

可见性最低的代码拥有最多的特权,这是违反直觉的。这就是开源固件要解决的问题。该生态系统的目标是降低固件的危害能力,并使其行为更加可见。

环2。SMM, UEFI内核。这个环控制所有的CPU资源。SMM对它上面的堆栈的其他部分是不可见的。它最初用于电源管理和系统硬件控制。它处理系统事件,如内存或芯片组错误。

UEFI是操作系统和BIOS固件之间的接口。EFI是UEFI的前身,是为了解决BIOS的位限制而设计的。从那时起,更多的功能被添加到UEFI规范中,包括密码、网络和认证。UEFI内核非常复杂,有数百万行代码。它由引导服务和运行时服务组成。规格书(https://uefi.org/specifications如果你想深入研究的话,这是相当冗长的。UEFI应用程序,如UEFI shell, GRUB, Gummiboot,或Windows引导管理器有启动后激活的选项。

UEFI内核是许多漏洞的通用载体,因为它有一些在许多不同平台上使用的相同的专有代码。GRUB和Windows引导管理器等引导加载程序是特定于平台的。UEFI内核在多个平台上共享,这使得它成为攻击者的一个很好的目标。

此外,因为只有UEFI可以重写自己,所以可以将漏洞持久化。这是因为UEFI位于处理器的固件中,通常存储在串行外围接口(SPI)闪存中。即使用户擦除整个操作系统或安装新的硬盘驱动器,攻击也会持续存在于SPI闪存中。

环3。管理引擎。在Intel (x86)的情况下,Ring -3是Intel管理引擎。7它可以不可见地打开节点和重新映像磁盘。它有运行Minix的内核,11以及一个网络服务器和整个网络堆栈。正因为如此,Minix是世界上使用最广泛的操作系统。管理引擎中有很多功能;把这些都列出来可能要花上一整天的时间,但是有很多资源可以用来挖掘更多的细节。16

在环-2和环-3之间,栈中至少有两个半的其他内核具有许多功能。每个内核都有自己的网络堆栈和web服务器,这是不必要的,而且有潜在的危险,特别是如果您不想让这些环通过网络更新自己的话。代码还可以自我修改,并在电源周期和重新安装时保持不变。很少能看到这些环中的代码实际在做什么,这很可怕,因为这些环拥有最多的特权。

他们都有功绩。环-2和环-3都有各自的漏洞,这对任何人来说都不应该感到惊讶。当攻击发生时,它们有一个巨大的影响半径。例如,在英特尔管理引擎的Web服务器上有一个错误。14没人意识到这个漏洞的存在七个年。

我们怎样才能使它变得更好?

回到顶部

固件的项目

固件项目通常存储在SPI flash中。

u-boothttps://www.chromium.org/developers/u-boot),coreboothttps://www.coreboot.org/)是开源固件。它们处理硅和DRAM初始化。chromebook两者都使用:x86上的coreboot和u-boot。这是谷歌验证引导的一部分。2验证引导降低了恶意软件的风险,允许安全的软件更新,并确保设备上软件的完整性。

Coreboot的设计理念是“做最少的必要工作以确保硬件可用,然后将控制传递给另一个称为有效载荷的程序”(https://doc.coreboot.org).本例中的有效负载是LinuxBoot。

LinuxBoothttps://www.linuxboot.org/),以前称为非扩展缩减固件,或NERF (https://trmm.net/NERF),处理设备驱动程序,管理网络堆栈,并提供一个多用户、多任务环境。它是用Linux构建的,因此一个内核可以为多个板工作。可以说,使用一个有很多人关注的开源内核比使用两个半完全不同且封闭的其他内核更好。这意味着您正在通过使用更少的代码变体来减少攻击面,并且您正在努力依赖于开放源代码的代码。Linux通过用加固的Linux驱动程序替换最少测试的固件驱动程序来提高引导可靠性。(Linux比大多数专有系统要经过更严格的审查;因为它被广泛使用,所以很多人都在关注它。)

通过使用已经拥有工具的内核,固件开发人员可以使用他们已经知道的工具来构建。当他们需要为签名验证、磁盘解密等编写逻辑时,他们可以使用一种现代的、易于审计、可维护和可读的语言。

回到顶部

运行时

运行时使系统能够使用开源固件并运行自定义编程逻辑。

http://osresearch.net/)是一个coreboot的配置,它有一个安全配置的Linux内核作为coreboot有效负载。它适用于服务器和笔记本电脑。该项目由Trammel Hudson发起,受多年固件漏洞研究的影响(Thunderstrike;https://trmm.net/Thunderstrike;《雷击2》;https://trmm.net/Thunderstrike_2).

u-roothttps://github.com/u-root/u-root)是一组Golang用户空间工具和引导加载程序。它被用作LinuxBoot的Linux内核的initramfs。

由于是开源的,这个新的固件栈有助于提高许多以前非常专有的组件的可见性。使用LinuxBoot可以使启动速度提高20倍。12将一个开放的计算节点引导到Linux shell的时间从8分钟缩短到17秒,速度提高了32倍。

回到顶部

其他固件怎么办?

大量其他设备也需要开源固件。其中包括:

  • EC(嵌入式控制器)/SIO(超级I/O)。这是针对移动设备和基于桌面的平台。它可以控制键盘、温度监控等。
  • TPM(可信平台模块)。这是一个加密密钥的安全仓库。
  • BMC(底板管理控制器)/ME(管理引擎)。BMC与服务器平台相关联,而ME通常与客户端平台相关联。对于一个开源BMC,有两个项目:OpenBMC (https://github.com/open-bmc/openbmc)及u-bmc (https://github.com/u-root/u-bmc).me_cleaner (https://github.com/corna/me_cleaner)是用于清理英特尔管理引擎到最小的必要功能的项目。
  • NIC(网络接口控制器)NIC 3.0上的开放计算项目正在进行中,13网卡的规格说明
  • GPU(图形处理器)。
  • 硬盘/ SSD。
  • eMMC(嵌入式多媒体卡)/UFS(通用闪存)。移动系统的存储设备。
  • 电源。
  • cpld(复杂可编程逻辑器件),fpga(现场可编程门阵列)。可编程逻辑元件。
  • 粉丝。

开源固件不仅需要提供对堆栈的可见性,而且需要验证计算机上软件的状态。

回到顶部

英特尔的Boot Guard

Boot Guard应该用来验证处理器的固件签名。在英特尔处理器的情况下,这样做的问题是,只有英特尔拥有签名固件包的密钥。这使得不可能在这些处理器上使用coreboot和LinuxBoot或它们的等效固件。如果您尝试了,固件将不会使用英特尔的密钥进行签名,并且失败的引导尝试将会阻塞主板。


开源固件可以通过使固件的操作更加可见和不太可能造成伤害来帮助将计算带到一个更安全的地方。


Matthew Garrett的一篇关于Boot Guard的文章强调了在固件方面用户自由的重要性。1硬件的所有者也有权拥有固件。Boot Guard可以防止这种情况。在2018年开源固件大会的安全主题演讲中,5Trammel Hudson描述了他如何发现绕过Boot Guard的漏洞(http://bit.ly/2S6oGrd);bugzilla的详细信息可以在http://bit.ly/2XVdAKU.该漏洞允许攻击者使用无签名固件并正常引导,完全否定了boot Guard的目的。

信任的根源。信任根的目标应该是验证安装在硬件的每个组件中的软件是否是预期的软件。通过这种方式,您可以毫无疑问地知道并验证硬件是否被黑客入侵。由于您几乎看不到在硬件中许多地方运行的代码,因此目前很难做到这一点。您如何真正知道组件中的固件不容易受到攻击或它没有任何后门?没有坚定的信任,你无法知道。

每个云和供应商似乎都有自己实现信任根源的方式。微软有Cerberus,15谷歌有土卫六,18亚马逊有Nitro。4

保罗·麦克米伦和马特·金在2018年做了一场关于大规模保护硬件的演讲。8它详细介绍了如何保护裸金属,同时也为客户提供了访问裸金属的权限。当客户将硬件返还给他们时,他们需要确保一致性和可靠性,确保没有任何来自客户的东西隐藏在硬件的任何组件中。

所有云必须确保在客户使用计算资源后,它们正在运行的硬件没有受到损害。

平台固件弹性。Hip供应商正在基于NIST指导方针投资平台固件弹性(PFR)。17这些指导方针的重点是确保固件保持完整状态,检测它何时已损坏,并将固件片段恢复到完整状态。

供应商一直在围绕NIST PFR指南构建功能。英特尔6和晶格半导体10每个都有一个版本。开放计算项目(OCP)关于英特尔固件创新的演讲9英特尔正在使用PFR来传递微软的Cerberus认证原则。

回到顶部

挑战

开源固件的一个挑战涉及到威胁模型。你是否有信任的根源,以及信任的根源是如何运作的,这取决于威胁模型。让我们通过一个例子来深入研究一下。如果您是一家拥有自己的云的企业,您的威胁模型将阻止您使用任何可能包含威胁您的业务或客户数据的漏洞或后门的固件。在这种情况下,理想情况下,您需要一个完全开放源码的信任根,以及服务器或笔记本电脑中的每个设备的开放源码固件,并使用可复制的构建来确保完整性。这将为您提供对正在运行的固件及其组成逻辑的最大可见性。

另一个挑战是为所有设备编写固件。厂商可以在他们的系统中使用很多设备选项,所以如果没有设备厂商的帮助,要支持其中的许多设备是很困难的。例如,考虑到许多不同的供应商生产DRAM或ssd。


所有云必须确保在客户使用计算资源后,它们正在运行的硬件没有受到损害。


如何提供帮助。本文的目的是深入了解使用开源固件构建的是什么,以及为什么使固件开源是如此重要。为了帮助这一努力,请帮助传播这个消息。尽量使用重视开源固件组件的平台。chromebook就是一个很好的例子,Purism (https://puri.sm/)计算机。询问您的供应商,他们正在做些什么来推进开源固件的事业,或者在信任的基础上确保硬件安全。

致谢非常感谢开源固件社区,感谢Ron Minnich、Trammel Hudson、Chris Koch、Rick Altherr和Zaolin在这段旅程中对我的帮助。

ACM队列的q戳相关文章
queue.acm.org

连续交付听起来不错,但它在这里能奏效吗?
第一版
https://queue.acm.org/detail.cfm?id=3190610

迈向更高的精度
里克·拉泽尔和罗德尼·格林斯特里特
https://queue.acm.org/detail.cfm?id=2354406

模拟器:过去(和未来)的虚拟机
Bob Supnik
https://queue.acm.org/detail.cfm?id=1017002

回到顶部

参考文献

1.Garrett, M. Intel Boot Guard, Coreboot和用户自由,2015;https://mjg59.dreamwidth.org/33981.html

2.验证了Chrome OS的启动以及如何让它为你工作。欧洲嵌入式Linux会议,2013;https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/42038.pdf

3.超级微硬件的弱点让研究人员通过后门进入IBM云服务器。arsTechnica, 2019;https://arstechnica.com/information-technology/2019/02/supermicro-hardware-weaknesses-let-researchers-backdoor-an-ibm-cloud-server/

4.汉密尔顿,J. AWS硝基系统。观点,2019;https://perspectives.mvdirona.com/2019/02/aws-nitro-system/

5.Hudson, T.开源固件会议安全主题演讲,2018;https://trmm.net/OSFC_2018_Security_keynote#Boot_Guard

6.英特尔。带固件弹性的英特尔数据中心块。解决方案简报,2017;https://www.intel.com/content/dam/www/public/us/en/documents/solution-briefs/firmware-resilience-blocks-solution-brief.pdf

7.英特尔。什么是英特尔管理引擎?英特尔,2017;https://www.intel.com/content/www/us/en/support/articles/000008927/software/chipset-software.html

8.金,M,麦克米伦,P.大规模固定裸金属硬件。PDX, 2018;https://www.youtube.com/watch?v=PEVVRkd-wPM

9.库马尔,M. J. OCP计划和英特尔实施,2018;https://www.opencompute.org/files/Intel-System-Firmware-InnovationsMohanKumar-OCP18.pdf

10.晶格半导体。通用平台固件弹性(PFR)服务器,2018;http://www.latticesemi.com/en/Solutions/Solutions/SolutionsDetails02/PFR

11.关于英特尔隐藏的Minix操作系统和安全问题的真相。这是自由/开源软件,2017年;https://itsfoss.com/fact-intel-minix-case/

12.明尼奇,R.等人。2017年,用Linux内核替换您受漏洞困扰的固件;https://schd.ws/hosted_files/osseu17/84/Replace%20UEFI%20with%20Linux.pdf

13.OCP服务器工作组。OCP网卡子组。开放计算项目OCP NIC 3.0设计规范版本0.85b, 2018https://www.opencompute.org/wiki/Server/Mezz

14.黑客简介:英特尔修复了一个长达7年之久的严重漏洞。《连线》杂志, 2017;https://www.wired.com/2017/05/hack-brief-intel-fixes-critical-bug-lingered-7-dang-years/

15.开放计算项目。Cerberus的项目。GitHub, 2018;https://github.com/opencomputeproject/Project_Olympus/tree/master/Project_Cerberus

16.Pataky, D. Intel管理引擎。Technische Universität德累斯顿,2017;https://files.bitkeks.eu/docs/intelme-report.pdf

17.平台固件弹性指南。NIST特刊800-193,2018;https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-193.pdf

18.Savagaonkar, U.等。深度泰坦:明文安全。谷歌云,2017;https://cloud.google.com/blog/products/gcp/titan-in-depth-security-in-plaintext

回到顶部

作者

杰西Frazelle是独立承包商。她曾在GitHub、微软、谷歌、Docker和几家初创公司担任工程师。


版权归作者/所有者所有。授权ACM出版权利。
请求发布的权限permissions@acm.org

数字图书馆是由计算机协会出版的。版权所有©2019 ACM, Inc.


没有找到条目

Baidu
map