用于企业系统管理员和蓝队的平台固件安全防御

用于企业系统管理员和蓝队的平台固件安全防御

Paul English 和 Lee Fisher 著

PreOS Security

https://preossec.com

著作权所有(C)2018 Paul English 和 Lee Fisher

知识共享:署名—非商业—相同方式共享 4.0 许可证(CC BY-NC-SA 4.0)

著作权声明

封面

封面艺术修改自 Wikipedia 的 IIVQ 的原创作品,其许可证为 GNU 自由文档许可证(GFDL)(https://www.gnu.org/copyleft/fdl.html)或者知识共享:署名—相同方式共享 3.0(CC BY-SA 3.0)。

https://commons.wikimedia.org/wiki/File:Dartboard_unlabeled.svg

内容

所有其他内容:著作权所有(C)2018 Paul English 和 Lee Fisher,知识共享:署名—非商业—相同方式共享 4.0(CC BY-NC-SA 4.0)

免责声明

固件属于软件,但是与存储在您的(固态)硬盘上的操作系统和应用软件不同的是,您不一定能够将其擦除并且重新安装。由于平台固件使得系统能够运作,您在处理固件的时候有可能使得您的系统完全不能运作。在本书中,我们将会试图强调那些比较危险的操作,特别是自动化的模糊测试,或者写入/重写。对于大多数技术建议或者软件——小心操作并且自行承担风险。

注记

在企业环境中,理论上会部署众多(几乎)完全相同的系统。因此在部署到大量系统之前先在一台样机上测试某些比较危险的操作是合理的。PreOS Security 强烈建议采用这种方式。在企业环境中,您可能还会拥有来自制造商或者 OEM 的保修以及延伸支持。在操作之前,请毫不犹豫地咨询制造商——事实上,这会通过向制造商强调消费者关注这些问题并且想要得到可靠、安全的系统这一点进而帮助每一个人乃至整个生态系统。

关于本书

脚注

与此书的第一版的脚注不同的是,我们将最新版本的 Awesome Firmware Security 的在线文档 Github Awesome list 作为附录包含进来。每一处应该作为脚注的参考文献都被包含到此文档中。

我们欢迎您的反馈!我们希望这本书成为顶尖的,而此书的两位作者都不是作家。

邮件:editor@preossec.com

第 1 章 简介

我们将会为您呈现一段关于现代平台固件技术的简介,从基于 Intel 的、基于 BIOS 的 IBM PC 开始。对于一位 IT 专家,这其中的某些内容可能是您已经知道的了。但是,我们会使其简短,然后前往讨论其安全启示。

平台固件已经经历了快速的进化和扩展,如同软件那样,它朝着更多层级的抽象和代码复杂度的方向发展。自然而然地增加了代码行数以及攻击面,这意味着同时有更多地东西需要防护。防护既包括认知又包括行动,而我们将会同时涵盖二者,对于系统管理员、站点可靠性工程师,或是企业事故响应蓝队(Blue Team)成员。

这些话题中的一部分对于个人消费者级别的固件防御同样相关,但是我们计划于近期发布一本专门探讨该话题的书。

1.1 定义平台固件

固件(firmware)这一概念拥有多种定义。对于移动/嵌入式/物联网设备,固件被认为是所有软件(操作系统和应用程序)。对于手机/相机/游戏机的固件更新正在迅速成为标准实践,并且如果这些设备被期望拥有互联网连接,它们通常包括使用互联网的自动或者半自动的更新能力。尽管比在操作系统中更新应用软件略为危险,在这些设备上的固件更新通常包括校验和以及多重引导程序能力以避免使得设备变砖。移动/嵌入式/物联网设备上的安全性是至关重要的,特别是由于它们通常持续暴露于基于互联网的攻击者。然而,这些固件实现中的很多过于复杂,以至于可以被看作独立的操作系统,通常是某种嵌入式版本的 Linux 或者某种 BSD 的变体。

与之相反,我们对于本书的目的是讨论诸如 UEFI、ACPI 和 PCI 选项 ROM 等平台固件。值得注意的是,任何复杂到同时拥有操作系统和应用程序的移动/嵌入式/物联网设备很可能不仅仅拥有一种固件,而是拥有若干种平台固件(platform firmware)用于板载的额外控制器或者处理器。例如,一台手机拥有一块主 CPU 以运行 Android 或者 iOS,但它同时拥有一块基带处理器用于运行固件。

平台固件是使得硬件能够工作的软件。诸如 UEFI、ACPI 和 PCI 选项 ROM 这样的名词是平台固件的组成部分。当硬件加电时,固件代码便被执行,该代码帮助初始化硬件。固件的引导程序加载操作系统,或者有时是下一层级的固件自举,最终导致操作系统的引导。大多数平台固件存储于闪存 ROM 芯片中。在某些案例中,例如 UEFI,固件也可作为来自文件系统中的文件(foo.efi)来加载,如同操作系统中的可执行文件(foo.exe)那样。

自原始的基于 BIOS 的 IBM PC 开始,平台固件已经发生了显著的进化。它已经变得更加复杂,极大地增加了攻击面,并且已经衍生为安装到任意给定的主板上的众多不同固件,而如果考虑外设则更多。不幸的是,每当平台固件更新可用时,即使是系统管理员有时也没能关注这些更新,因而它们从未被应用。有些固件实现是完全不可更新的,或是它们的空间限制使得必要的更新不能被应用。只有相对少数的平台固件实现拥有直接连接到互联网以获取更新的能力。即使某些实现诸如 UEFI 拥有完整的网络栈以支持网络启动以及诸如 BMC、IPMI 和 Redfish 等带外管理功能以支持远程管理,大多数实现仍然缺乏自动下载更新的能力。只有少数制造商和特定型号支持通过操作系统的自动更新机制来自动更新固件,例如 Windows Update 和 Linux Vendor Firmware Service,并且它们不全经过签名和加密。与之相反,即使是在今天,更新必须通过运行由各家固件提供商所提供的软件来实现,以检查状态并且按需应用更新。难怪平台固件更新会被忽略。

在本书中,我们将会探讨平台固件(platform firmware),并且可能会可互换地简称为固件(firmware)。

1.2 平台固件的类型

1.2.1 历史——从 BIOS 到 EFI

自从有 IBM PC 之日就有 BIOS 了,并且它仍然存在于某些现代系统中。BIOS 是用于 MS-DOS 的 16 位实模式代码库。大多数其他操作系统仅将 BIOS 用于初始化其自身,并且依赖于它们自身的驱动程序来访问系统。BIOS 是基于中断(interrupt-based)的,并且为操作系统/应用程序提供服务:中断 10h 为磁盘 I/O、中断 13h 为视频 I/O 等。IBM PS/2 拥有一种称为 ABIOS(高级 BIOS)的变体,它是一种保护模式的可重入(reentrant)的解决方案,解决了 BIOS 的众多原始技术限制,但是它专属于 PS/2 平台并且随着它一起消亡了。最初,BIOS 并没有包括任何安全考虑,然而随着安全性成为 PC 生态系统中的话题,BIOS 加入了口令,安全特性也开始被添加。在历史上曾经有过少数 BIOS 实现由 OEM 和 IBV(独立 BIOS 厂商)提供。UEFI 产生的原因之一是为了解决 BIOS 的技术限制。

ARC 是一种运行于某些 RISC 系统上的固件技术,包括 DEC Alpha、PowerPC、MIPS 等。ARC 的架构设计——固件可执行文件存储于 FAT 文件系统卷上——和 EFI 的设计非常相似。

1.2.2 EFI/UEFI

当 Intel 推出 Itanium 处理器的时候,EFI 作为其固件层被发明了出来,由于以 x86 为中心的 BIOS 不能运行于 Itanium 之上。其后,Intel 将 EFI 用作它的 x86/x64 系统上的除了 BIOS 以外的主要平台固件技术。当苹果从 PowerPC 迁移到 Intel 处理器之后,它们采纳了 EFI 作为其固件。微软 Windows 最终从 BIOS 迁移到使用 UEFI,并且后来强制要求 UEFI 用于 Windows。EFI 在朝向一种称为 Tianocore 的标准化、开源代码库的发展过程中变为 UEFI(统一 EFI)。UEFI 可以运行于 Intel 和 AMD 的 x86 和 x86_64 系统上。UEFI 现在也可以运行于 ARM 系统上,并且出现在了某些 ARM 服务器上。UEFI 拥有一种有时会用到的架构独立的字节代码(EBC)。EFI 几乎没有安全特性,其后 UEFI 添加了安全启动(Secure Boot)(以及后来基于它的更多特性)和可执行文件的代码签名。

1.2.3 BIOS/UEFI 的扩展

1.2.3.1 远程启动

某些早期的 PC 和终端机被作为“无盘工作站”出售,并且被设计为从通过网络远程加载的二进制文件来启动。这一功能被标准化为 PXE(预启动执行环境),并且被包含在众多 BIOS 系统中。由于 BIOS 仅针对本地启动而设计,这涉及到向固件中添加完整的网络栈和 NIC 驱动程序——可以是添加到 BIOS 本身之中,或是添加到 NIC 的固件中。当前的 UEFI 网络栈支持 IPv4、IPv6 和 iSCSI。除了 PXE 以外,UEFI 还拥有“UEFI HTTP[S] 启动”,即通过 HTTP 启动的能力。如果协议未被适当地防护并且认证,远程启动赋予了攻击者大得多的攻击面。

1.2.3.2 ACPI

电源管理的不同固件解决方案,ISA PNP(即插即用)、APM 等已经进化为 ACPI。ACPI 被加入到 BIOS 中以启用电源管理,允许加电循环中的待机/唤醒状态。ACPI 同样也被 UEFI 使用,并且其 ACPI 规范由 UEFI 论坛控制。除了电源管理功能外,ACPI 是一种通用目的的固件扩展性的方法,厂商可以在其中定义它们自己的代码模块(表),其中包含了代码和/或数据。ACPI 拥有一种架构独立的字节代码(AML,即 ACPI 机器语言),因此每种操作系统都需要拥有 ACPI VM 以执行 ACPI 代码。微软 Windows PC 包括嵌入了 Windows 可执行文件的 ACPI 表,这些可执行文件将会在 Windows 需要 sysprep 或者恢复系统时使用。很多厂商拥有具有多样化用途的 ACPI 规范。修改社区已经长期更新 ACPI 表,以变通方式使得 Windows 或者 macOS 能够运行于不同的硬件之上。攻击者可以潜在地使用与修改者相同的技术以更新 ACPI 使其包含他们的恶意软件。

1.2.3.3 PC 以外:嵌入式 Linux 引导程序

U-Bootcoreboot 是嵌入式 Linux 系统上的流行的引导程序。当使用在 Intel 系统上时,这些引导程序运行 BIOS 负载(payload)。coreboot 和 U-Boot 也能调用基于 UEFI 的负载——在 Intel 和 ARM 系统上。某些嵌入式解决方案将负载、coreboot 和 U-Boot 嵌套起来。更为复杂的是,传统的 UEFI 同样可以被构建为将 coreboot 用作 UEFI 初始化层(而非负载)。因此基于负载的引导程序可能拥有多种固件技术的组合。

ARM 可以运行 coreboot、U-Boot,或者较为罕见地运行 UEFI。以 ARM 为中心的两种固件安全技术的例子包括 TrustZone 和 ARM 可信固件(ARM Trusted Firmware)。

Google Android 使用带有验证启动的 coreboot。Google ChromeOS 系统使用带有验证启动的 coreboot。在 Intel ChromeOS 系统上,coreboot 加载 BIOS 负载,而非基于 UEFI 的解决方案。尽管这种 BIOS 负载仅有有限的安全性,它正在受到 coreboot 的验证启动的保护。ChromeOS 通常使用 Intel 平台上的 TPM 或者 ARM 平台上的 TrustZone 作为支撑它的可信存储区。

1.2.4 CPU 以外:其他处理器

1.2.4.1 TPM/fTPM

TPM 芯片被添加到某些 PC 上以提供可信根(root of trust),但是很多 BIOS 系统并未使用它。Trustworthy Computing Group 维护 TPM 标准以及相关协议。TPM 芯片被设计为存储难于访问的机密信息。除了基于硬件的 TPM 以外,还有固件 TPM(firmware TPM),这是一种软件(固件)实现,运行于另一块处理器之上,例如在 Intel ME 处理器上作为基于 Intel AMT 的固件而运行。据推测,任何托管固件 TPM 的处理器访问起来不会像防破坏(tamper resistant)的 TPM 那样困难。关于专用的 TPM 硬件的漏洞的一个近期的范例是 Infineon TPM 漏洞,称为 ROCA,它影响到具有弱密钥生成算法的特定芯片。某些整合了受影响的 Infineon TPM 芯片的厂商拒绝提供该 bug 的修复。

1.2.4.2 管理处理器

Intel 将其管理引擎(ME)集成到 CPU 裸晶上一同发售,AMD 对其平台安全处理器(PSP)采取同样方式。苹果将其 T2 处理器作为一个独立组件发售。在每一种情况下,管理处理器可以运行应用程序,诸如用于提供远程管理能力(例如 Intel AMT)、fTPM 功能以及更多其他功能的应用程序。

1.2.4.3 图形处理器(GPU)

图形处理器(GPU)被添加到 PC 中以提升视频性能。现在 GPU 被用作通用目的处理器(GPGPU)。某些高端系统拥有 GPU 阵列。通常,GPU 适配器通过 PCIe 连接(或者在某些情况下是雷电)。因此为了能够在启动时可见,它需要选项 ROM(option ROM)。

1.2.4.4 网卡(NIC)

最初,PC 并不包含网络适配器,但是现在几乎每一台计算设备都至少拥有一块,通常是多块网卡。尽管某些网卡相对简单,某些技术诸如 TCP 卸载(TCP offloading)需要网卡拥有完整的通用目的处理器、相对复杂的固件以用于自举,有时还有完全扩展(full-blown)的操作系统以供操作。在蜂窝技术中,蜂窝网卡或者调制解调器包含强大的、通常是黑箱的固件,称为基带(baseband)。在此领域中包含并且考虑 WiFi、蓝牙和 NFC 技术是重要的,由于每种方式都提供了网络或者类似网络的方式以访问一台设备,并且可以使其默认打开或者拥有与之关联的平台固件。

1.2.4.5 基板管理控制器(BMC)

基板管理控制器通常是独立于 CPU、内存、外存和网络的系统,被设计为管理主要宿主系统,通常用于刀片服务器。通常它们被设计为即使在宿主系统关机的情况下仍然保持开机,并且为系统管理员提供远程控制。BMC 是一个通用的词语,由很多品牌的实现,包括 IPMI、DMTF、SMASH、DASH 和 Redfish。历史上,这些控制器被构建为可以插到主板上的扩展产品,但由于它们的实用性,有类似 BMC 的特性被直接构建到 CPU 的主裸晶中——即使这意味着事实上是在主 CPU 内部附带一整套额外的 CPU 和操作系统——此种情况包括 Intel ME,尤其是作为应用程序运行于 Intel ME 和 AMD PSP 之上的 Intel AMT

1.2.4.6 刀片服务器

当 PC 从台式机进化为服务器的时候,一个机架的刀片带来了一个新的信任级别。一个机架的多台刀片服务器在其机架上拥有一块服务处理器,它控制着刀片服务器,即作为所有刀片的新的可信根。控制了服务处理器的攻击者也就控制了所有刀片。

1.2.4.7 智能手机

现代手机是具有平台固件以及嵌入的操作系统/应用程序的强大 PC。此外,手机还包括一块基带处理器及其固件。这些处理器及其固件通常是商业机密的闭源技术,因此很难说出如何才能防护它们。悲观的是,攻击者们很可能能够访问这些商业机密,因此可以使用该处理器来托管他们的恶意软件,而对于主系统的 CPU 和固件不可见。

1.2.4.8 虚拟机监视器(Hypervisor)

防护一块轻信任何东西的裸机 CPU 不受攻击的一种方式是拥有一块后台管理模式处理器。另一种方式是将系统虚拟化,添加新的安全层级以对抗攻击者。有了虚拟机监视器,虚拟化的硬件现在包含了虚拟化的固件。与某些裸机目标相比,虚拟机监视器对于攻击者而言可能是更加容易的目标。其硬件和固件组件是操作系统级别的进程,磁盘上的固件相对于闪存上的更加易于访问,并且通常带有某种远程访问的方式而无需对于裸机系统的物理访问。对于防护者而言,针对 VMM 进程的攻击可能更加易于观察,利用操作系统级别的 SIEM 和记录工具,并且防护者至少会去关注操作系统级别的交互。

1.2.5 系统固件以外:外设固件

外设固件扩展了系统固件。当今,基本上有两类外设:插入主板插槽(ISA、ISA-PNP、EISA、PCMCIA、PCI、PCIe 等)中的板卡以及通过端口(USB、雷电、串口、火线等)连接的设备(硬盘、固态硬盘、监视器、打印机、扫描仪等)。二者之间的界限正在变得模糊,由于可以外接 PCIe 设备(通过雷电),并且有时可以跨过一个层级,例如直接连接到 PCIe 的 NVMe 设备就跳过了 SAS/SATA 层。微处理器(以及内存、ROM、NVRAM)的能力不断增加——低功率操作、更多的晶体管、更高的复杂度以及对于外设的需求的增加,因此更加强大的处理器(以及更多的内存、ROM 和 NVRAM)自然而然地被添加到所有外设中,随之而来的是更多行的代码以支持新增的特性,以及因此带来的更大的攻击面。

1.2.5.1 PCIe 和雷电

当 BIOS 最初被开发之时,主要的外设板卡总线接口是 ISA,而现在则是 PCIe。当硬件厂商向它们的板卡(网络/磁盘/视频适配器等)中添加特性时,它们需要扩展 BIOS 所提供的那些特性。板卡通过选项 ROM,又称为扩展 ROM,即板卡所包含的用于扩展 BIOS 的固件来扩展 BIOS。BIOS 扩展其功能的方法是挂钩中断。雷电基本上是通过端口而非主板上的插槽的 PCIe,因而具有类似的选项 ROM 驱动程序的安全问题,并且对于攻击者而言,将设备连接到端口上相对于打开系统机箱向主板上添加板卡更加容易。

我们已经提到过 GPU 和网卡固件,但是 PCIe 适配器通过嵌入一块它们自己的 CPU 以试图从主 CPU 卸载工作量这一情形并不罕见。RAID 适配器也属于这一类别,然而任何具有足够高的数据吞吐量(或者足够高端/昂贵)的 PCIe 设备都属于此类候选者。

1.2.5.2 USB

基于 USB 的设备拥有它们自己的固件栈。攻击者有多种方式来利用 USB 固件以使得 USB 设备以有趣的方式运作。USB 设备上的固件驱动程序可以声明其为网络设备、本地存储设备或是众多其他选项,这些选项可以使其骗过过于轻信任何东西的操作系统或是盲目地插入他人为其提供的 USB 设备的最终用户。

对于通过端口连接的设备,该设备包含固件,与此同时,现代的线缆(USB、雷电等)内部通常也包含固件。攻击者能够以带有多种攻击向量的方式将一块恶意 PCIe 或者 USB 设备连接到系统上:诸如 Hak5 USB Rubber Ducky 等设备是常用于 USB 的方法,而 PCILeech 是一种常用于 PCIe 的方法。最近的操作系统更新包括诸如在待机/唤醒状态下禁用端口的防护措施。

1.2.6 外设的外设

1.2.6.1 存储设备

存储设备通常被连接到外设总线上,并且在系统侧有一块控制器,诸如 SAS 或者 SATA 主机总线控制器,或者 RAID 控制器,它们可能拥有其自身的固件。然而,每一块存储设备在其自身上也有固件。不幸的是,除了“控制器”以外还没有更好的词语用于这类事物。对于机械硬盘,其控制器必须能够将复杂并且可变的物理磁盘位置(块)映射到操作系统上的相对统一的逻辑块表示方式上来,并且通过标准化的 SAS 和/或 SATA 命令以及 SMART 管理协议进行通讯。固态存储设备作为一系列独立的闪存芯片来运作,因此除了映射块以及隐藏/重映射坏块以外,固态硬盘控制器通常也会实现 RAID 的一种内部变体以提供额外的数据恢复能力,以及管理一块可轮换的缓冲空间用于负载均衡。机械硬盘和固态硬盘通常还会加入诸如加密等特性。每一项新增的特性都需要额外的代码,从而增加攻击面。

1.3 防护引导程序

当系统固件尝试加载操作系统时,攻击者可以在不同时机利用 BIOS 或者 UEFI 系统。不同的技术被添加进来以帮助保护启动过程。

安全启动(Secure Boot)是 UEFI 的一项特性,它使用 PKI 来防护启动过程的某些阶段。如果禁用安全启动,用户可能会被诱骗运行基于 UEFI 的恶意软件或者不安全的操作系统。苹果的 macOS 不使用安全启动,但是提供了一种安全启动的变体,由于苹果已经在独立于 UEFI 发展它的 EFI。随着它们的 T2 安全处理器的引入,苹果引入了它们自己的安全启动,区别于 UEFI/EFI 安全启动。Windows 和 Linux 可以被配置为使用安全启动,并且微软已经强烈鼓励 OEM 迁移到 UEFI 2.x 以使用安全启动特性。UEFI 安全启动可以被配置为不仅保护启动过程,并且也保护内和扩展以及甚至是最终用户应用程序。在足够大的规模上,为您的企业考虑生成安全启动密钥是有意义的,并且将其保护完整地应用到应用程序的水平或许也是有意义的。

验证启动(Verified Boot)是用于 Android 和 ChromeOS 系统上的 coreboot 的一项特性,它在概念上类似于安全启动:如果验证启动被禁用,则攻击者可以暗中破坏启动过程。

测定启动(Measured Boot)使用 TPM 的测定功能以对启动过程的各个阶段进行散列值校验以期发现恶意软件。可信启动(Trusted Boot)使用 Intel TXT 的测定功能以对启动过程的各个阶段进行散列值校验以期得到类似的结果。

Intel Boot Guard 是来自 Intel 的晶片级技术以在安全启动开始之前保护启动过程。一旦您在系统上启用 Boot Guard,您就不能再禁用它。

1.4 管理系统和固件

不同的技术被开发出来以帮助管理服务器系统而无需派遣 IT 员工前往数据中心。完全物理隔离的 IP-KVM 和 IP 电源开关解决方案可以变得更加安全,但同时也更加昂贵,因此对于可能需要远程管理的系统,(理论上)带外(out of band)但是完全集成式的解决方案被开发了出来。为了在一台系统看起来已经关机的情况下控制它,这些解决方案需要某些电源和网络访问,以使得管理处理器能够工作。通常,这些解决方案被集成到固件中或者与之邻近,或者属于非常低级的访问,事实上位于零环以下并且运行它们自己的固件,这具有相对较大的攻击面。

IPMI 是这一领域内的一种早期的标准化努力,以提供内建的或是通过扩展板卡提供的相对廉价的扩展的远程管理能力。关于 IPMI 的一个常见的安全问题是它通常在被制造商发售时处于启用状态,带有一个标准化的弱口令。尽管很多带有 IPMI 的设备拥有一块专用的管理网卡,随着该项技术已经变得廉价并且更加集成化,更为常见的是 IPMI 被启用于标准的主网卡上,或者甚至是可以轻松地被连接到非隔离网络的多个网卡上。

使用分开并且隔离的网络来进行此类管理几乎总是最好的实践,但是在某些情况下,这可能难于实现,特别是由于这些技术已经开始出现在台式机和笔记本上。

Intel 主动管理技术(AMT)是一种运行于 Intel ME 处理器上的固件,被设计为提供远程管理能力,并且被作为针对面向消费者的 CPU 的一项相对廉价的企业级升级选项而发售。AMT 提供了一种基于网络服务的远程管理系统。在最近发现的一个漏洞中,攻击者可以登录,而 AMT 的口令检查代码将会接受任何口令。制造于 2009 ~ 2017 年的系统存在漏洞,如果它们的 AMT 网络流量可以被攻击者访问,并且用于 AMT 的通常配置是将其设置为在主要的、一直在线的网卡而非隔离的管理网络上启用它。一个主要的漏洞也于近期被发现存在于 Intel ME 处理器及其自身的操作系统中。AMD 系统提供一种称为平台安全处理器(PSP)的类似技术。苹果于近期添加了一块 T2 处理器以为其 iMac Pro 和 MacBook Pro 提供某些类似功能。

DMTF SMASH 和 DASH 在某种程度上类似于 IPMI。多种 AMD 系统通常使用 DASH(用于台式机)和 SMASH(用于服务器)。

DMTF Redfish 是用于 IPMI 的一种标准化的替代方案,它提供了一种基于 HTTP 的 JSON ReSTful 管理接口。

还有众多类似的以厂商为中心的技术,诸如 HP iLO、Dell DRAC、Sun/Oracle ILOM、AMI MegaRac 等。UEFI 应用程序、驱动程序和服务也可以在 UEFI 引导程序加载操作系统之前运行。

1.5 总结

本章试图总结某些更为重要的计算机固件技术以及它们的某些安全问题。如需获得更多信息,参见 NIST SP 800-193 规范对于平台固件的列举,以及 CHIPSEC 项目的硬件抽象层驱动程序的组件(其中的每一个都是安全研究人员的一个兴趣领域)。计算机硬件和固件持续进化,并且涉及到多个层级的技术。攻击者正在学习使用固件作为他们的宿主,防护者需要学习保护他们的计算机固件。

第 2 章 针对固件的威胁

对于几乎每一类型的固件,都存在关于概念性的漏洞利用的例证。很多种类的固件漏洞的主动利用已经在公开领域被发现,并且其他一些已经在泄露的文档中被引用。随着固件的复杂度不断增加,可供利用的攻击面也在增大。操作系统尽管广泛存在漏洞,但是它们相对于固件更好地被系统管理员和安全专家所理解和保护。在某些案例中,常规的保护和现存的最佳安全实践仍然不足以对抗固件级别的攻击。

在几乎所有基于 Intel/AMD 的现代系统中,UEFI 取代了老旧的 BIOS。尽管曾经有过基于 BIOS 的攻击,它们通常需要一位对于它将要被应用于的目标 BIOS 和系统拥有相对深入的了解的攻击者以汇编语言编写。这种攻击不一定能够在目标系统和任何其他品牌或者型号的系统之间可移植,即使这些系统出自同一制造商。UEFI 是非常标准化的平台,使得众多厂商可以撬动一种称为 Tianocore(https://tianocore.org)的强大的开源核心系统,它在很多方面就像一种发展完全的操作系统。数千行代码普遍存在于不同的 UEFI 实现中,其在不同系统之间的主要区别是标准化的模块,它们使用一种通用的 API,这在 UEFI 中称为协议(protocol)。可为 UEFI 编写的模块通常是用 C 语言编写的,但是 UEFI 也可支持若干种其他编程语言,包括 Python 甚至 Javascript,因此对于低级汇编语言的编程技能的需求较少。因此 UEFI 相对于 BIOS 呈现了大得多的攻击面。幸运的是,UEFI 经常与某些显著的安全性改进一同被实施,诸如安全启动。但是就像大多数安全性改进那样,诸如安全启动等技术为管理系统增加了额外的工作量,因此它们经常被禁用。

尽管 UEFI 是一个完全不同的案例,并且相对于其他系统固件明显更加标准化,某些相同的问题也适用于其他领域。ARM 和其他类似的微处理器的更低的成本、更高的可用性和能力使得对于内建于 PCIe 板卡、硬盘和固态硬盘的控制器而言,利用 C 语言或者更高级的语言进行构建来实现一种接口更加容易,通常也更加廉价。通常,固件可以从操作系统级别进行更新,允许就地修补而非返厂送修(RMA),但也会允许深度植入的恶意软件,始于操作系统级别的攻击。当然,只能由制造商更新的 ROM 并不能保证起到保护作用——由于可能会犯错,诸如将一台笔记本退还给错误的客户,此笔记本拥有诸如 Computrace(一种 LoJack 式的固件)这样的机密,对于它所涉及的另一位客户而言。

几乎所有固件,包括每一种正在生产中的 UEFI 版本,都包含闭源的已编译代码的二进制 blob,并且供应链上的几乎每一个步骤通常都会向完整的系统中添加额外的二进制 blob。很容易认为一台系统是来自一家特定的制造商的,但是即使它们真正地制造了这台系统,而非只是在其中加入它们的名字,通常也有一长串的原始设计制造商(ODM)和独立硬件厂商(IHV)位于原始设备制造商(OEM)的上游,而这还不算独立组件,诸如网络和硬盘控制器等的制造商。

如果您熟悉开源软件对于 bug 和安全透明性的原则,您不会在固件领域看到太多的透明性。带有安全性的启示的 bug 会被持续隐藏长得多的时间,并且恶意软件可以于二进制 blob 被添加的任何阶段被添加进来。

2.1 固件威胁的类型

在固件水平上,有可能执行几乎每一类在更高层级的软件领域可能更加为人们所熟知的攻击。在大多数直接的案例中,那些需要操作系统的恶意软件可以通过受到攻击的固件在操作系统运行时植入操作系统中,或者直接植入非易失性存储设备中。更为隐蔽的是,固件可以完全在操作系统以外运作——在存储设备(硬盘、固态硬盘等)中,固件可以在数据传入/传出存储设备的过程中将其损坏或者窃取,或者在外设中进行操作,在启用摄像头的同时使其指示灯保持为禁用状态。

以下所有这些范例,加上每一种额外的普通软件攻击,已经被发现能够影响固件:

  • 竞争条件
  • 缓冲区溢出
  • 权限提升
  • 语法分析错误
  • 不当配置

2.1.1 Intel 分类法

Intel 于 Black Hat 2017 展示了固件安全话题,并且包括了一个很好的固件 bug 分类法——以及对于 bug 出现几率的评估。

尽管这些可以被看作标准软件 bug 的变体,从固件的视角将其考虑为特殊案例是有益的。此列表完全由 Intel 贡献:

  • 不一致的电源状态过渡检查
  • 无效的初始化状态(保存于内存中的机密,对于特定系统状态的猜测)
  • S3 启动脚本
  • 竞争条件
  • 启用保护机制(包括禁用/启用特定硬件元素,包括错误的模块启动顺序)
  • 检查时间/使用时间(TOCTOU)竞争条件
  • 信任输入(来自平台中的较低权限实体,或者拥有由不同威胁向量配置的不同内容)
  • 测定失败
  • 未能测定某些模块
  • 接受经过签名但适用于错误平台的更新,由于它们使用相同密钥
  • 在错误的时间接受加载特定模块(此时某些内容未被适当地保护)
  • 未能识别某种测定错误/问题
  • 平台能力未恰当配置
  • 未设置锁、设备未恰当地初始化、特性未被禁用等
  • 安全或者有意义的内容暴露给不受信任的实体
  • 例如 UEFI 变量
  • 硬件不当行为
  • 错误定义的架构、微架构、不良设计等
  • 平台组件行为与规格说明不符

尽管 Intel 在构建此列表时主要考虑的是 UEFI,它可以同等程度地适用于系统上的任何固件。

2.2 固件威胁案例

2.2.1 Hacking Team 的 UEFI Rootkit

UEFI 极其强大。与 BIOS 相比,UEFI 拥有众多新增特性并且可扩展,这带来了相对于老旧的 BIOS 和小型启动固件大得多的攻击面。Hacking Team 在其文档于 2015 年被泄露时被发现拥有一种行之有效的攻击方法。Hacking Team 的攻击方法对于 Insyde 的 UEFI 实现是有效的,并且被发现需要对于目标机器的物理访问以启动进入 UEFI shell 并且加载攻击代码。此代码只是简单地注入(或者重新注入,如果需要)基于微软 Windows 的恶意软件,因此它对于非 Windows 操作系统不会奏效。然而,有证据显示 Hacking Team 曾经对攻击失败的案例提供支持,例如对于非 Insyde 实现的 UEFI。将其攻击代码移植到另一种 UEFI 实现对于 Hacking Team 这样的对手而言是一件相对简单的事情。如有必要,远程安装恶意软件可能也比较简单,这可能需要重启进入 UEFI shell,它有可能是由另一款恶意软件以 UEFI 更新的形式在操作系统内安装的。这种类型的攻击的主要目标是保证持续性,即使是在重新安装了操作系统的情况下。

2.2.2 BadUSB

通过 USB 的最明显的攻击方式就是一块带有自动运行文件或者其他恶意软件的闪存盘。当该文件被自动执行或者由用户打开时,该恶意软件便在应用程序层级上被植入操作系统。尽管更加复杂以及更具挑战性,存在多种从 USB 设备发动固件攻击的方式,考虑到对于攻击者而言,创建他们自己的驱动程序以骗过计算机有关该 USB 设备的功能的难易程度。诸如 Hak5 USB Rubber Ducky 这样的设备对于攻击者来说容易获得。

针对 USB 固件的攻击于 2014 年被展示,它们针对使用 Phison 控制器的设备。攻击者可以修改一块 USB 存储设备以使其如同一块 HID(键盘、鼠标等输入设备)那样运作,或者在该存储设备内部创建隐藏分区。这种攻击专用于 Phison 控制器,并且将会需要一位具有相似水平的技能的攻击者以构建一次针对其他 USB 设备的自定义攻击。

2.2.3 PCIe 和雷电的 DMA 攻击

将 PCIe 总线暴露给外部设备为具有物理访问的攻击者创造了一个新的攻击向量。一种专为此种类型的攻击而设计的通用设备称为 PCI Leech。当其被插入 PCIe 总线时,可以通过 DMA 直接从系统内存中窃取数据,或者修改该内存的内容以安插恶意软件。针对 Mac 的 Thunderstrike 攻击将会感染 PCIe 选项 ROM(PCIe option ROM)——存在于众多 PCIe 设备中的一块固件 blob。利用 Thunderstrike,攻击者可以感染一块特定的雷电设备,然后每当该设备被使用在一台新的系统上时,它将会感染新的宿主系统。

2.2.4 Equation Group 的硬盘固件攻击

将恶意软件安插到硬盘控制器的固件本身将会允许攻击者跳过磁盘加密,以及在磁盘或者固态硬盘读写数据时实时读取或者损坏数据。此技术也可用于注入操作系统层级的恶意软件,通过简单地感染一块可执行的在线磁盘。Equation Group 被发现曾经使用过此种攻击。

第 3 章 固件防护

3.1 理想解决方案

固件问题的终极解决方案是一个巨大的挑战。哪怕是单块主板的众多独立设计商和制造商都需要被说服以执行它,并且遵循最佳实践以及诸如 NIST 这样的组织的建议。如此做将会要求它们在一种剩余价值极低的业务模式中投入资金到系统开发中来。对于最终用户而言,固件拥有低得多的可见性,以及慢得多的更新周期。设计商和制造商同样需要将思维模式从历史性的闭源/二进制 blob 和知识产权保护转变到一种即使不是完全开源也应该更加透明的模式上来,出于可审计性的考虑。

某些专家,诸如 Invisible Things 的 Joanna Rutkowska 提议将固件从硬件中分离并且隔离开来,以使得它可以被跟踪更改,以及创建一种无状态计算机。

尽管如此之多的业界潮流反对进步,作为一名手握购买决定权以行使或者影响权力的系统管理员,您确实拥有能力以影响事物使其变得更好。事实上,如果那些影响大规模购买决定权的人们不争取进步,进步将肯定不会发生。

3.2 真实的解决方案

今天可供您使用的实践上的解决方案涉及到对您现有的实践方式进行修订,诸如硬件生命周期管理。在此领域中,安全性至今也没有得到多少关注,更不必说固件安全性。此外,有一些小范围的微调是可以应用于您很可能已经在执行的常规最佳安全实践的,以针对固件方面的考虑进行增补和调整。

下一章将会进行更加深入的介绍,并且在我们的尾注中,我们将会包括一个详尽(但是简洁)的检查列表以供您用于您的组织。

以下是关于开始思考这个问题的快捷但是不完整的概括:

  • 当应用于固件时,遵循通常的最佳安全实践,包括:
  • 锁定固件设置
    • 设置口令
    • 禁用不需要的服务(例如远程管理、PXE 等)
    • 启用安全启动——并且在大规模部署时考虑部署或者管理您自己的安全启动密钥
  • 将固件添加到硬件生命周期
  • 确保您正在购买您所能买到的最安全的硬件,基于其他限制条件(预算等)
  • 在部署之前,锁定固件设置,转储并且计算散列值
  • 当 IT 人员着手操作硬件时,检查并测试固件
    • 是否有必要的更新
    • 转储并计算散列值
    • 检查散列值
    • 使用 CHIPSEC、FWTS 及其他工具
  • 在废弃处理之前,确保硬件已经被适当地抹除——包括固件,特别是存储于诸如 TPM 等位置的机密信息,更改固件口令以及安全启动密钥
  • 遵循 NIST 对于固件的建议
  • 使用 CHIPSEC、固件测试套件(FWTS)及其他工具

3.3 遵循最佳安全实践

作为一名 IT 专业人士,您很可能已经知道并且遵循比一般的非技术人士安全得多的最佳实践。这其中的某些可能完全不适用于固件——但是请记住,固件也是软件,并且通常是具有完整网络栈以及连续网络访问的软件。大多数现存的实践只需相对较少的逻辑性的修改就可以涵盖固件安全性。

下面的列表可能会遗漏某些项目并且作者将会欢迎那些可以整合到此书的未来版本中的建议。

我们的起点是这篇优秀的文章“保护固件免受攻击的 5 条提示”(5 Tips for Protecting Firmware from Attacks),其中带有来自 Eclypsium(之前来自 Intel 高级威胁研究(ATR))的 Yuriy Bulygin 和 John Loucaides 的输入内容,此外还有 NIST SP 800-147 标准。

3.3.1 理解并传播针对固件的威胁是真实存在的这一点:技术员工和管理教育

通过阅读本书,您将会比您的大多数同行更好地理解威胁。分享这本书,并且和您的同行以及经理分享您从中所学到的。最为紧迫的步骤是确保您了解您的系统所使用的哪种固件,并且以一种及时的方式更新制造商的固件升级,这将会需要您和 IT 及安全部门的合作与努力。

由于这些固件实现通常并不包括启用互联网的自动更新功能,这项任务落到了您身上。在大多数企业环境中,大量相同配置的机器使得这项任务变得容易了,但是跟踪固件版本和更新的可用性,并且部署它们仍然是一项繁重的任务。您已经有过管理操作系统和应用程序更新的实践,诸如保证更新以一种及时的方式被完全应用,尤其是当您允许用户延迟更新时。理想情况下,您可以在此过程中整合您的固件更新管理,如果不是实际的固件更新本身的话。

3.3.2 对固件进行宽泛的思考

记住,每一台现代计算系统的几乎每一个组件都包含固件。这不仅包括笔记本和服务器及其内建组件,诸如板载 WiFi 适配器或者硬盘等,也包括您可能将其完全视为外设的组件,诸如监视器等。记住包含那些并不严格属于计算机的计算设备,诸如交换机和路由器等。保持这样一种警觉性,即当今的几乎每一台电子设备都是某种形式的计算机,或者拥有与其相连接的某种形式的计算机。即使暂时还没有,很可能很快就会如此。

3.3.3 实践基本安全性

大部分固件只能在拥有物理访问或者 root/管理员权限的情况下进行更新。因此保护这些权限是至关重要的。遵循带有防火墙、沙盒、IDS/IPS 以及操作系统和应用程序更新的深度防护。

3.3.4 物理安全性

物理安全性就其自身而言是一整个独立的主题,自从人类农业起源之时就有其专业技能和知识。因此自然而然地有大量此类技能存在于信息技术世界以外。完全覆盖物理安全性,甚至只是在它涉及固件安全的情况下,也已经大大超出本书的范围。从根本上说,物理安全性是关于访问的——确保只有经过认证的个人拥有访问权,并且记录访问,不仅是那些认证过的个人的访问,甚至还包括非认证的个人的访问,例如在一次系统入侵中。

对于固件安全而言,物理访问是一个更加重要的方面,由于我们所讨论的众多类型的固件只能在拥有对包含该目标固件的机器的物理访问的情况下被修改。诸如通过主板上的 JTAG 端口,或者在重启过程中的控制台的物理存在。

3.3.4.1 服务器的物理安全性

对于服务器的情况,物理访问通常是高度控制的,以符合最佳实践。如果没有,则存在诸多额外的理由使得固件安全经受物理安全性的检查批准。应当注意的是,物理访问保护是必要的,但对于服务器而言还不够,由于在大部分现代系统上,众多固件 ROM 可以直接被远程修改(在远程访问 IP KVM、IPMI、iLOM、BMC 和 Redfish 等案例中),而且更有可能是经过操作系统和操作系统层级的工具来间接修改。

3.3.4.2 终端机的物理安全性

对于诸如台式机、笔记本和移动设备这样的客户终端系统而言,解决其物理安全性的问题看似不可能。然而,已有用于管理此类问题的最佳实践,并且在大多数情况下,在简单地遵循最佳实践的基础上仍有大量余地以进行改进,对于管理移动设备的物理访问,以及训练携带它们的人员。

关于终端机的固件安全性的最重要考虑是未知来源访问。最为明显的案例是经典的邪恶女仆攻击(Evil Maid Attack),其中一台遗留在酒店客房的无人值守的笔记本被一位装扮成酒店雇员的攻击者以物理方式访问。

在当今或是将来,旅行要求可能会鼓励或者要求人们将其笔记本放置在接受检查的行李中,这为机场安检以及行李搬运工提供了访问机会。即使您并不关注国家级别的威胁,某些国家可能会在边境或者旅行中鼓励或者协助企业间谍行为,以获取对于商业机密和知识产权的访问权,从而获得竞争优势。

对于终端机的标准安全建议,诸如:

  1. 要求使用强口令
  2. 使用强固件口令
  3. 不要给予用户本地管理员权限
  4. 使用全盘加密
  5. 使用安全启动

并不足够,一旦一台笔记本被攻击者物理接触,所有这些假设都将不复存在。

还有一种更为隐蔽的版本称为“局中人下属”(insider affiliate)。由 Alice 所拥有的一台经常离开受到安全保护的公司办公环境的笔记本可能轻松地被朋友或者家庭成员访问而不被 Alice 所知,尽管她在绝大多数情况下保持了对该笔记本的物理访问权,并且不像在经典的邪恶女仆攻击的上下文中那样将其视为一台独自遗留在一个陌生位置的笔记本。这带来了几点重要的建议:

  1. 总是保有大量经审查确认清洁(包括固件更新和安全扫描)的可供随时取用的笔记本,使得您不会由于这种轮换而过多地影响 Alice 的生产力
  2. 开发并且持续改进笔记本轮换过程,使其保持尽可能高的效率
  3. 考虑在每次出国旅行之后增加一次笔记本轮换
  4. 使得针对更新和安全性的固件扫描成为任何移动式部署的一个常规部分,如同您对于病毒和恶意软件那样。每天一次甚至多次也不为过

Linux 基金会工作站安全性检查列表在此领域中会有所帮助,带有针对固件考虑的具体指导,并且其大多数建议可以同等程度地适用于其他操作系统。

3.3.4.3 运输过程中的物理安全性

您可能会发现您自己需要运送任何类型的机器,包括服务器、笔记本、工作站、平板等。通常,这将会需要被快速办理,由于某些正当的商业理由。运输包装的物理破坏抵抗和检测是一项完善建立起来的技术。但是,值得对其进行某些思考,例如,如果您的企业通常运送的是整个货架的指尖陀螺,而您正在要求您的运输部门运送计算机设备。在运输过程中拦截硬件以植入间谍软件或者恶意软件是一种已知的攻击结构(称为“禁运”(interdiction))并且如果您使用全盘加密或者攻击者希望得到持久性,那么固件就是首选目标,特别是如果攻击者可以接触硬件足够长的时间以访问主板上的 JTAG 端口。因此运输之前的一整套固件更新、镜像提取和散列值计算的操作是合情合理的,还有对于以上相同元素的运输后验证。

3.3.5 黄金镜像(及其散列值)

这部分内容也许是您认为遗留在您安装操作系统的那段 IT 职业生涯中的东西,但是在固件领域,这仍然是高度相关的。某些固件实现可以被设计为或者期望为在其服务的生命周期内不会发生改变,即使它们的内容是可升级的,例如通过 JTAG 端口。制造商可能仅仅期望在保修送回时进行更新,或者例如只是将可升级性作为一种确保万无一失的特性。即使固件可以被期望进行相当频繁的更新,诸如 UEFI,它们拥有相当缓慢的更新周期,相对于您已经熟悉的操作系统和应用程序更新而言。

因此,在您初次购买时,为您的系统上的尽可能多的不同固件 ROM 制作黄金镜像以及当前级别(SHA256 或者更高)的散列值,并且周期性地在每一台设备上验证它们。注意,更改变量内容(例如 UEFI 中的启动设备顺序等)将会改变散列值。在现场使用中,此类更改应该不会非常频繁地发生,并且在理想情况下,制作黄金镜像及其散列值将会以至少相同的频率进行。这些镜像和散列值可以随同您已经保存的其他类似的可审计性的信息一同保存起来。

3.3.6 安全扫描

诸如开源项目 CHIPSEC、来自 Intel 的工具以及来自 Ubuntu Linux 的固件测试套件(FWTS)等工具允许对固件进行深度安全扫描。理想情况下,每一个品牌的基于 Intel 芯片和 UEFI 固件的系统都应该通过 CHIPSEC 中的每一项测试。作为一名系统管理员,使用您的购买杠杆以就这一问题向您的厂商施压,与此同时,您至少可以运行全部 CHIPSEC 测试,并且为每一台新系统记录信息,然后周期性地重复。您也可以利用您的 CHIPSEC 失败记录来影响未来的购买决策。

3.3.7 最终用户和非技术员工的教育

大多数企业当前并未对其员工进行起码足够的信息安全教育,但是移动设备的物理安全性是必需的。既然您当前的用户教育很可能确实需要改进,为何不包含某些关于物理安全性的训练呢?如果您的雇主事实上或者实际上要求员工将其笔记本带到工作单位以外,请确保并且强调一种“不加指责”(blameless)的方式来应对一起物理攻击事故——雇员们的工作要求他们的笔记本被非雇员接触并不是他们的过错。事故也是每个人学习如何改进安全性以及精炼您的事故响应计划的一次机会。同时,利用这次机会以宣传您的极低争执与快速的过程以将他们的可能受到攻击的笔记本轮换为完整功能的替代机。

3.3.8 将固件添加到硬件生命周期

将固件添加到硬件生命周期是固件安全中的远超其他方面的最为重要的组成部分。在 NIST SP 800-147 中详细描述的生命周期可以被用于增强您已有的硬件生命周期。当前的硬件生命周期通常和安全性只有很少甚至没有关系。对于传统硬件生命周期的关注焦点就是将硬件财产作为资产严加管理。在这里,至多只有一种关于跟踪财产的关注,包括如有可能就防止或者监测一台诸如笔记本的硬件财产于何时完全被盗,或是由于事故或者疏忽而丢失。即使是在被盗或者丢失的情况下,关于一笔昂贵财产的损失的关注可能会压倒其潜在的 IT 安全启示。

将固件安全性添加到硬件生命周期应该不会带来显著的额外工作量。最为重要的事情是为每一台全新的系统在其开箱之后的最早的步骤中制作黄金镜像并且计算散列值。在理想情况下,这些散列值将能够与制造商所提供的散列值进行比对,尽管当前制造商并不能可靠地提供散列值以供比对。在这样一个至关重要的节点上,捕获一条基线仍是可能的。在系统上安装或者配置软件之后,尤其是将该系统连接到网络之后,它就肯定不可能再用作基线。

下一步的精炼是在硬件的生命周期内的不同时间点添加固件检查。由于系统固件事实上是软件,在理想情况下,它应该以相同于操作系统和应用程序的频率被检查,很像反病毒软件。这对于大部分情况在当前并不可行,尽管 PreOS Security 的软件应该很快就能为此提供帮助。与此同时,为何不在一台系统从外部重新回到 IT 部门的控制范围时就添加固件重新转储和扫描的步骤呢?每当一台系统受到过物理访问攻击或者怀疑发生过一次攻击时都添加这些检查特别重要。

尽管关于固件安全性的新的关注可能会突出显示当前硬件生命周期过程中的问题,记住,硬件生命周期如同大多数 IT 过程与实践那样,总是可以改进,并且通过改进它往往还能得到其他好处。如果您的首席财务官最近还没有就财产跟踪问题打扰您,您将不会知道他(她)何时将会开始,也许您会迎来一位坚持要求在一夜之间就如此做的新任首席财务官。为何不现在就开始遵循更佳实践呢?

3.4 NIST 指导意见总结

在同业界的顶尖专家共同工作的过程中,NIST 提供了一些关于固件安全性的优秀指南。这些文档比本书长得多,但是我们试图为您提供一段实用的总结。对于将来的阅读,推荐您阅读这些文档中的每一篇的摘要和执行摘要。如果您将要从头到尾地阅读其中一篇,从最新的开始,以及全面但仍处于草案阶段的 NIST SP 800-193。

3.4.1 NIST SP 800-147:BIOS 保护指南

发布于 2011 年的 NIST SP 800-147 的总体关注焦点是普遍应用于 x86 和 x86_64 PC 系统的老旧的 BIOS 固件。然而其建议可以被简单地延伸并且应用于任何平台固件,特别是那些允许就地更新的固件。

首先,BIOS 更新应该使用数字签名以防止安装不可信的 BIOS 升级镜像。其次,如果可能,可信的 BIOS 升级安装应该要求操作人员的物理存在。在 BIOS 内部或者周边应该存在完整性保护特性,以防止对 BIOS 进行无意或者恶意的更新,包括防止其他系统组件跳过认证更新机制。

此文档的关注焦点看起来完全是 OEM 和制造商,然而,保证所购买和使用的系统以这样一种方式与这些要求相兼容使得它们实际上能够被强制执行是系统管理员或者安全专业人士的责任。而系统操作人员也应该为将这些要求以这样一种方式整合进硬件生命周期负责,以使得例如 IT 员工能够足够经常地与移动系统进行物理接触,以便能够以一种及时的方式进行要求的更新。

3.4.2 NIST SP 800-147b:服务器 BIOS 保护指南

在 NIST SP 800-147 中,有关更加复杂的服务器的间隔由 NIST SP 800-147b 解决。这些更加复杂的服务器包括诸如带有服务处理器的刀片和网络设备,其每一个刀片及其机箱本身都拥有多级 BIOS 或者 UEFI 固件。作为简洁的总结,所有相同的保护措施都应当被应用到每一级,包括在每个系统组件之间阻止未经许可的更新。

3.4.3 NIST SP 800-155:BIOS 完整性测定指南

NIST SP 800-155 加入了可信根以及完整性测定的安全传输的概念。尽管此文档完全面向 OEM、操作系统厂商以及安全应用程序厂商,仍然值得理解系统的能力和限制,不论是从整体角度还是从您所管理的系统中所实现的角度。您可能还想理解这篇文档,以便就这些问题向您的系统厂商施压。

3.4.4 NIST SP 800-193:平台固件恢复能力指南

固件安全领域的最新文档,NIST SP 800-193,明确地概括了针对所有平台固件的讨论,并且包括了针对 OEM 和组件/设备提供商的指南,以保证所有系统固件都考虑并且实施了安全性的原则。再重复一遍——如果您将要只读一篇 NIST 指南,我们推荐您从 SP 800-193 开始。

第 4 章 防护工具和范例

4.1 工具:用于 UEFI、BIOS、SMM 和 ACPI 的 CHIPSEC

CHIPSEC 是由 Intel 安全高级威胁研究(Intel Security Advanced Threat Research)开发的开源软件,并且是平台固件安全领域中的权威解决方案之一。CHIPSEC 不仅允许转储固件镜像并且计算散列值,并且可以对复杂 UEFI 平台固件上的可加载模块、变量及其他攻击面进行深度检测。CHIPSEC 提供了深度测试套件,包括诸如模糊测试等蛮力安全技术。尽管 CHIPSEC 非常完整,它是高度依存于架构的,并且只在最近十几年生产的 Intel x86/x86_64 主板上工作得最好。

CHIPSEC 是一款任何整合或者贩卖基于 Intel 的系统的人都应该使用的工具,甚至一直到任何包装他们自己的系统的零售商。尽管不能指望百思买开箱一台来自 OEM 的系统并且在出售前使用 CHIPSEC 对其进行测试,VAR 应该能够验证一台全新的系统能够通过所有 CHIPSEC 测试。这不是当今所发生的事情,但却属于您作为购买(或者提供购买指南)者对于众多系统所能够坚持要求的事情。

CHIPSEC 可以用于在线和离线分析。如需进行离线分析,则需要一块 ROM 的副本(通常称为 ROM.bin 文件)。CHIPSEC 可以生成 ROM.bin 文件以用于离线分析,但是其他工具诸如 FlashROM、Google Pawn 和苹果的 eficheck 也可以。

CHIPSEC 是关于软件应该对于所有平台固件,尤其是那些设计为可更新而非烧入 ROM 的固件可用(以及开源)的一个良好范例。

4.2 工具:PCIe

对于 PCIe 固件而言,解决方案的选项开始变得杂乱。大多数 PCIe 固件称为“选项 ROM”或者“扩展 ROM”,并且如同它们的名称所暗示的那样,对于相对简单的 PCIe 板卡,它们通常是 ROM 芯片,并且只能通过完整地更换芯片来更新。对于系统的物理访问对于执行此类攻击是必需的。

随着系统变得更加集成化,诸如扩展卡之类的 PCIe 设备以及雷电设备抬高了价值链,并且成为了更加复杂的设备,通常具有可由软件更新的 ROM。无人愿意仅仅由于初始化 ROM 或者通常是复杂的设备操作固件中的一处代码错误就扔掉一块价值 1000 美元的 GPU。

在使用 Linux 时,可以利用 lspci 检查 PCIe 总线,以及利用 sysfs 转储 PCIe 选项 ROM。并且 Linux 上的 fwupd 和 Windows Update 固件更新是受管理的系统提供自动更新的开始。但是请注意,这些方法可能还远远谈不上完整——用以保证 GPU 在启动时能够工作的选项 ROM 只是现代 GPU 上的固件的很小一部分。当前只有来自 GPU 厂商的私有工具能够处理现代 GPU 上的固件,这也适用于网卡和 RAID 适配器。

4.3 更多工具

更多工具列出于我们的附录 Awesome Firmware Security 中,这是一部进化中的文档,因此请确保阅读它的最新版本以紧跟时代发展,或者考虑订阅更新。

第 5 章 帮助为每一个人改进固件安全性

作为一名系统管理员,或者其他 IT 业务的专业人士,您拥有独特的地位以在整个 IT 行业中改进固件安全性。当然,您可以并且应该帮助提升警觉性,以便在出现机会的时候教育同行 IT 专业和管理人士——也许甚至是通过分享本书。然而,撬动变革的最有力的杠杆还是您所持有的购买力。没有一位个人消费者可以同系统 VAR 和 OEM 进行那种您在常规基础上就能与之进行的对话。您所遇到的一般销售人员不一定能够明白您正在说什么,但是对于大多数采购,您将会有机会遇到一位更加技术型的销售工程师。这是您作为系统管理员的责任以引导您的雇主朝向最佳的 IT 采购方案,这也许不一定是可选项之中最便宜的。这是您的职责以平衡这其中涉及的所有因素,即高额采购是您的雇主的主要资本花费,而它将会被您的同事雇员使用多年。

我们在本书中所倡导的全部就是您应该考虑将硬件和固件层级的安全性作为众多购买决定因素之一,并且相应地询问问题以及利用杠杆对抗您的厂商。考虑向看重固件安全性的其他厂商开放您的流程,这些厂商可以采用提供校验散列值、通过标准化的机制(Windows Update LVFS fwupd)提供经过签名的更新,以及完全开源等方式。至少也要表达出对于您当前的厂商的硬件中所包含的所有闭源、不可验证的固件组件的担忧。

与 IT 专业人士所面临的众多问题相似,您也许不能一下子就为您自己的职业生涯或者工作环境带来改观。但是您可以为将来世界各地的 IT 专业人士,或者更宽泛地,为每个人作出一些积极的改变。今天也许没有这样的系统可供您购买,它们为其自带的所有固件完整地提供了软件工具、可验证性和安全性。但这并不一定还是若干年之后的情况。

制造商和 OEM 面临它们自身的挑战,其中最大的挑战就是计算机硬件的非常微薄的剩余价值。所有进步在某种程度上都必须从这些微薄的剩余价值中榨取。固件展现出了一个特别的挑战,由于制造商不愿意在其售出一台系统之后再次接触它,因此就地更新应当被支持。如果您开始要求变革,很可能会遇到一些挫折,但是仍然值得为之付出努力,并且这应当在您的剩余 IT 职业生涯中为您和您的同行 IT 专业人士带来回报。

第 6 章 结论

平台固件为攻击者提供了一个平台以便在当前传统的反病毒和恶意软件检测软件的视觉之外安装持久的恶意软件。固件的复杂度和能力不断增加,因此攻击面也在增加,而关于此问题的警觉性仍然较低。

作为一名系统或者网络管理员,或者一名蓝队成员,您已经提高了对此问题的警觉性,现在您可以帮助教育其他人,开始实现防护,以及向您的 VAR 和 OEM 施压以得到更加符合安全性的硬件。

6.1 PreOS Security 的安全性解决方案

第一步是在开箱之后立即将所有可能的平台固件的镜像及其散列值整合到您的硬件生命周期,并且在机器的寿命之内周期性地进行检查,特别是在疑似遭到物理攻击或者操作系统级别的恶意软件入侵之后。PreOS Security 通过我们的软件客户端和网络仪表盘使得这一过程更加简单了,并且我们将会与您一同工作以便将我们的客户端与您的单窗格选择系统整合到一起。

您也可以与固件安全领域的最新发展保持同步,通过我们的季度新闻简报中的一段简短总结:

https://preossec.com/newsletter

我们将会持续精炼本书的内容,因此如果您有任何反馈,通过以下邮件地址发送给我们:

editor@preossec.com

附录 A Awesome Firmware Security

https://github.com/PreOS-Security/awesome-firmware-security/

良好固件安全(Awesome Firmware Security)是一个关于平台固件资源的精选列表,其关注焦点是安全性和测试。它由 PreOS Security 创建。

免责声明:固件也是软件,但是即使您能够删除并且重新安装您的硬盘上的软件,当您处理固件时有可能使您的系统变砖。谨慎操作,并且自行承担风险。

注记:物联网/嵌入式操作系统的安全性并未被添加进来,除非它们刚好和平台安全性发生重叠,诸如 Intel AMT、AMD PSP、Redfish、IPMI、BMC、OpenBMC 等。已经有一些关于物联网/嵌入式操作系统的良好列表,例如 Awesome IoT。

技术和术语

这些技术中的每一项就其自身而言都是极好的,并且我们将会在某个时机为其制作一份独立的良好列表。此时,它们构成了我们的索引。

  • ACPICA——ACPI 组件架构项目(ACPICA)提供了一系列跨平台的 ACPI 工具,诸如 acpidump
  • ACPI——ACPI 是一种平台固件技术,它最初是要用于替代即插即用、MP 和高级电源管理。UEFI 论坛拥有其规范并且维护一份与 ACPI 相关的文档的良好列表
  • ACPICA——ACPI 组件架构项目(ACPICA)提供了一种参考实现以及一系列跨平台的 ACPI 工具,诸如 acpidump
  • ARC——ARC(高级计算环境)是一种用于早期的非 Intel 系统上的 Windows NT 的平台固件技术。ARC 的设计影响到了 UEFI 的设计:由变量指向位于一个硬盘分区上的固件镜像、
  • BIOS——BIOS 是一种最初用于基于 Intel 的 IBM PC 的平台固件技术。它是一种 8086 实模式技术。Intel 曾经表示它们将会在 2020 年结束基于 BIOS 的平台固件的生命周期,代之以 UEFI。Intel 和少数 IBV 拥有闭源的 BIOS 实现。BIOS 曾经是微软 Windows PC 的主要固件技术,直到 Windows 开始强制要求 UEFI
  • SeaBIOS——主要的开源 BIOS 实现
  • coreboot——coreboot 是一种最初称为 LinuxBIOS 的平台固件技术。它可以加载诸如 SeaBIOS、UEFI 及其他负载,广泛应用于嵌入式系统。coreboot 被用于 Google ChromeOS 系统,并且启用 coreboot 验证启动以获得更多安全性
  • 直接内存访问——DMA 允许某些硬件子系统,最为明显的是 PCIe 以访问主系统的内存,独立于中央处理器(CPU)。它可以被诸如 PCIleech 等恶意硬件攻击。主要的防护机制是 iommu 硬件和操作系统支持
  • Heads——Heads 是一种平台启动固件,它包括一个作为 coreboot 或者 LinuxBoot ROM 的负载而运行的最小化 Linux 以提供一种安全、灵活的启动环境
  • 独立 BIOS 厂商——独立 BIOS 厂商(IBV)为 OEM/ODM 提供集成式固件解决方案。随着 UEFI 取代 BIOS,某些 IBV 现在改称自己为 IFV(独立固件厂商)。某些 OEM 仍然将其消费者级别的设备固件外包给 IBV,而为其商用级设备制作自己的固件。范例包括:
  • Intel Boot Guard——Intel Boot Guard 是一种固件安全技术,它在 UEFI 安全启动发生之前帮助保护启动过程。一旦 Boot Guard 被启用,它将不能被禁用,并且将会阻止安装诸如 coreboot 等替代固件
  • JTAG——JTAG 是芯片的硬件接口以允许访问固件。它被固件工程师用于开发,以及被邪恶女仆攻击者在厂商在其消费者设备中将 JTAG 接口遗留为暴露状态时使用
  • LAVA——LAVA 是一种自动化的验证架构,主要目的是测试基于 ARM 设备上的 Linux 内核构建的系统的部署,特别是对于 ARMv7 及更新的设备
  • LinuxBoot——LinuxBoot 是一种平台固件启动技术,它将诸如 UEFI DXE 阶段的特定固件功能替换为 Linux 内核和运行时
  • 管理模式——管理模式是 UEFI 所使用的词语,用以指代 Intel SMM 和 ARM TrustZone,即 CPU 的一种特权执行模式
  • 管理系统实现于一块独立的处理器上,并且通常是在专用网络接口上,以有利于带外访问和控制。在诸如 Intel ME 和 AMD PSP 等某些情况下,管理处理器和主 CPU 位于同一块裸晶上。这些系统通常使用一种完全嵌入式的操作系统,诸如 BSD 或者 Linux
  • AMD PSP——AMD PSP(平台安全处理器)是 AMD 系统上的一块安全处理器,它可以运行诸如 fTPM 等固件应用程序
  • 苹果 T2——用于 iMac Pro 的加密存储和安全启动的系统管理控制器、影像信号处理器、固态硬盘控制器和安全飞地(secure enclave)
  • 基板管理控制器——BMC 是用于管理服务器固件,包括应用更新的接口。OpenBMC 是主要的开源 BMC 实现
  • DASH——DMTF DASH 是一组用于台式机的带外固件管理规范。Intel AMT 是一种符合 DASH 的实现,AMD SIMFIRE 也是
  • Intel AMT——Intel AMT 是 Intel 系统上的一种平台固件管理技术,它作为应用程序运行于 Intel ME 处理器上。AMT 提供诸如远程 KVM、电源控制、裸机操作系统恢复与重建镜像以及远程预警等服务
  • Intel ME——Intel ME 是 Intel 系统上的一块管理和安全处理器,它可以运行 Intel 主动管理技术(AMT)、高级风扇速度控制、Boot Guard 和安全启动、通过局域网的串口以及基于固件的 TPM(fTPM)。它看似运行一种 MINIX 的变体
  • IPMI——IPMI 是一种平台固件管理技术,通常位于 Intel 或者 AMD 的服务器系统上。通常被实现为一种嵌入式的 Linux 系统。尽管广泛使用,IPMI 的现代替代品是 Redfish
  • OpenBMC——OpenBMC 项目是一个用于拥有 BMC 的嵌入式设备的 Linux 发行版
  • Redfish——DMTF Redfish 是一种带外固件管理技术,用于取代 IPMI
  • SMASH——DMTF SMASH 是一组用户服务器的带外固件管理规范,与 DASH 相似
  • 测定启动——Intel 的技术,使用 TCG TPM 来保护启动过程
  • 微码——微码是一种用于 CPU 的固件形式,系统需要微码更新,如同它们需要平台固件更新以及操作系统更新那样
  • NIST——一家为美国政府服务的标准制定实体。它拥有若干关于固件的设计和操作安全性的文档、书籍和培训
  • 原始设备制造商——一家 OEM 构建并销售原始硬件
  • 原始设计制造商——一家 ODM 构建硬件并且将其销售给 OEM
  • 操作系统厂商——OSV 是一家操作系统厂商,它包括固件/操作系统的交互
  • 选项 ROM——选项 ROM,又称为扩展 ROM、OpROM、XROM,是一块 PCI/PCIe 设备上的固件 blob。选项 ROM 是来自 BIOS 时代的术语,当时一块板卡将会与 BIOS 平台固件挂钩,并且为新的板卡添加额外功能。选项 ROM 是位于该板卡的闪存中的 BIOS/UEFI 驱动程序。一块板卡可能需要多种驱动程序,分别用于每一种架构以及每一种平台固件类型(BIOS+x86_64、BIOS+ARM、UEFI+x86_64、UEFI+ARM 等)。选项 ROM 并不构成这样的设备上的全部固件,由于用于诸如 RAID 或者 TCP 工作量卸载等设备功能的操作固件可能是与之完全分离的
  • PCIe——PCIe 是 PC 主板的接口。PCIe 设备的固件包括选项 ROM。此设备可能拥有一块对于系统主板不可见的处理器,难以完全信任 PCIe 硬件
  • 安全启动——安全启动是一个经常与 UEFI 安全启动相关联的词语,后者是 UEFI 的一种可选安全特性,用于帮助防护启动过程,它并不需要 TPM。除了 UEFI 以外,其他固件技术也会使用安全启动这一词语,有时是小写。苹果的基于 EFI 的安全启动实现不同于用于 Windows/Linux 系统的安全启动技术
  • SMM——系统管理模式(SMM)是 Intel 和 AMD 系统中的一种处理器模式,区别于实模式和不同的保护模式,它赋予了对于处理器的完全控制权。由 SMM 托管的应用程序,诸如恶意软件,对于通常的基于保护模式的代码不可见
  • SPI——SPI 是一种用于访问固件的接口。它在开发过程中被厂商使用,并且也可以被攻击者使用,如果它在消费者产品中仍然保持开启状态
  • 可信执行环境——也称为安全执行环境(SEE)。它是虚拟机监视器或者其他技术的一个范例,通过限制固件以使其更加安全。ARM TrustZone 是 SEE 的一个范例
  • 雷电——由 Intel 和苹果开发的一种外部外设硬件接口,它合并了 PCIe、DisplayPort 和直流电源
  • Tianocore——Tianocore 是 UEFI 论坛的开源实现的起源,厂商将其代码同闭源驱动程序以及增值代码一起使用
  • TrustZone——TrustZone(TZ)是用于 ARM 系统的一种固件安全技术,它是一种形式的 TEE/SEE,后者被 UEFI 称为管理模式
  • TPM——TPM 是众多平台固件实现的可信根,诸如 Intel/AMD 的 BIOS 和 UEFI 系统。TPM 由可信计算小组(Trustworthy Computing Group,TCG)定义。有独立的 TPM 芯片,也有称为 fTPM 的“软”固件 TPM 实现,它们由诸如 Intel ME、AMD PSP 等实现
  • 可信启动——可信启动是一种来自可信计算小组的固件安全技术,它使用 TPM 来帮助防护启动过程
  • 可信计算小组——可信计算小组(Trustworthy Computing Group,TCG)是一个业界贸易组织,它控制着 TPM 及其相关规范
  • U-Boot——U-Boot 可以加载诸如 SeaBIOS、UEFI 等其他负载。U-Boot 和 coreboot 广泛应用于嵌入式系统
  • UEFI——UEFI 是一种最初由 Intel 创建,现在被 Intel、AMD、ARM 及其他系统所使用的平台固件技术,它最初是为 Intel Itanium 而设计并且作为 BIOS 的替代品的。UEFI 也是 EFI。基于 UEFI 的平台固件技术通常也称为 BIOS,其中的老旧 BIOS 称为传统模式(Legacy Mode)或者 CSM(兼容性支持模式,Compatibility Support Mode)
  • UEFI DBX——UEFI DBX UEFI 安全启动黑名单文件包含最新的 UEFI 安全启动 PKI 黑名单/过期密钥。检查您的厂商文档以查看您的系统厂商的工具如何工作以获取并应用此文件到您的系统;如果厂商并未提供工具,请要求它们提供
  • UEFI 论坛——UEFI 论坛是一个业界贸易组织,它控制着 UEFI 和 ACPI 规范以及 UEFI SCT 测试,并且提供开源的 UEFI 实现 Tianocore
  • USB——通用串行总线(USB)是一种用于外部外设的业界标准。USB 设备可以被配置为多种设备,并且诸如 Hak5 的 Rubber Ducky 等恶意 USB 硬件可以戏弄天真的操作系统
  • 验证启动——验证启动是一项来自 coreboot 的固件安全技术,它帮助防护启动过程,大致相当于安全启动
  • Android 验证启动——Android 版本的验证启动
  • ChromeOS 验证启动——ChromiumOS 和 ChromeOS 版本的验证启动

威胁

  • BadBIOS——BadBIOS 是由 Dragos 报告的疑似固件恶意软件
  • 邪恶女仆攻击——邪恶女仆攻击也许是最广为人知的固件攻击。在这里,受害者将其 sstem 置于无人值守状态,并且攻击者拥有一段可以物理访问该系统的时间,以供其安装固件层级的恶意软件。例如,某人外出晚餐时将其笔记本留在酒店客房,而攻击者装扮成酒店客房服务人员
  • Hacking Team 的 UEFI 恶意软件——Hacking Team 是一家向政府和其他实体出售漏洞的公司。在它们提供的东西当中有一种面向 Windows PC 的基于 UEFI 的固件攻击。Hacking Team 的恶意软件是为数不多的已知的被 CHIPSEC 列入黑名单的公开 UEFI
  • Fish2 IPMI 安全——关于不良和/或不安全的 IPMI 实现的信息编译
  • PCI Leech——PCILeech 是一种基于 PCI 的恶意硬件,用于攻击系统的 PCI 接口。防御措施是 iommu 配合操作系统的 iommu 支持
  • Rowhammer——Rowhammer 是一种针对系统的新型基于内存的安全攻击。防御方法是 ECC 内存
  • ThinkPwn——ThinkPwn 是一种最初以 ThinkPad 系统为目标的 UEFI 恶意软件 PoC。ThinkPwn 恶意软件是为数不多的已知的被 CHIPSEC 列入黑名单的公开 UEFI。thinkpwn.efi 包含在 FPMurphy 的 UEFI Utilities 之中。一个恶意软件二进制文件藏在其他有用工具之中,如需使用这些工具则请小心
  • USB Rubber Ducky——Rubber Ducky 是恶意 USB 硬件的一个范例,它使得使用者去配置系统,以戏弄天真的操作系统,使其认为它是任意数量的设备

工具

免责声明:阅读关于固件的内容是一件事,但是使用这些工具可能是危险的,您可能使您的设备变砖——谨慎操作并且自行承担风险。

开源的

注记:出于安全性的目的,开源软件是可审计和可验证的。但要注意,处理固件比处理那些安装在硬盘上的您可以删除和重新安装的软件更加危险。您可能使您的系统变砖!谨慎操作并且自行承担风险。

  • ACPICA 工具——提供工具和 ACPI 的一种参考实现
  • acpidump——来自 ACPICA 的跨平台、存在于操作系统中的(OS-present)工具以转储并且诊断 ACPI 表
  • BIOS 实现测试套件——Intel BIOS 实现测试套件(BITS)提供了一个可启动的预操作系统(pre-OS)环境以测试 BIOS,特别是它们对 Intel 处理器、硬件和技术的初始化。它包括一个编译为原生 BIOS 应用程序的 CPython
  • DarwinDumper——DarwinDumper 是一个开源项目,它是一系列脚本和工具,以提供一种便捷的方法来快速采集关于您的 OS X 系统的系统概要
  • Eclipse UEFI EDK2 向导插件——此 Eclipse 插件帮助 EDK2 开发者使用带有 CDT 的 Eclipse 集成开发环境以进行 UEFI 开发
  • EFIgy——Duo Security 的 EDIgy 是一个以苹果 Mac 为中心的开源工具,以检查系统是否拥有最新的 EFI 固件
  • Firmadyne——Firmadyne 是一个自动化的可扩展系统,用于对基于 Linux 的嵌入式固件进行模拟和动态分析
  • Firmware.re——Firmware.RE 是一个免费的服务,它可以解包、扫描并且分析几乎任何固件包,并且有助于快速监测漏洞、后门和所有类型的嵌入式恶意软件
  • GRUB——GRUB 是一种多重启动的引导程序。它被编译为 BIOS 或者 UEFI 应用程序
  • Linux Shim——Shim 是一种 UEFI 引导程序,它会加载另一个 UEFI 引导程序,可能具有不同的许可证,或者由其他厂商签名。有多种已公开的 Shim 分叉
  • Fedora 关于 UEFI 安全启动 Shim 的指南
  • Linux Stub——Linux 内核可以被如此构建,以使得它同时是 BIOS 和 UEFI 引导程序
  • CHIPSEC——CHIPSEC 是一种由 Intel 创建的安全工具,以测试 Intel BIOS/UEFI 的安全状态。它是当前唯一能够检查多种公开的固件安全漏洞的工具
  • eficheck——很遗憾,缺少指向它的一个良好的链接,由于此工具仅存于最近版本的 macOS 中,并且没有在 https://apple.com 以文档形式记载。它可以验证 UEFI 完整性和安全性
  • 固件测试套件——固件测试套件(FWTS)是由 Ubuntu Linux OSV,Canonical 创建的一系列固件测试工具,以帮助测试系统中将会导致 Ubuntu 出现问题的缺陷。FWTS 是用于多种技术的数十种测试的套件。UEFI 论坛推荐 FWTS 作为主要的 ACPI 测试资源。FWTS 是一个用于 Linux 的命令行工具,并且包括可选的 CURSES UI 以及可选的 FWTS-live live 启动发行版。FWTS 包含在 Intel 的 LUV Linux 发行版中
  • FlashROM——FlashROM 是一个以 Linux/BSD 为中心的工具,用于识别、读取、写入、验证和擦除闪存芯片。它被设计为烧录主板、网卡、显卡、存储控制器其他不同编程设备上的 BIOS/EFI/coreboot/固件/选项 ROM 镜像等。有对于 Windows 的部分支持
  • 黄金镜像——黄金镜像是厂商的原始固件二进制文件。这一词语也被用于操作系统镜像。更好的厂商提供镜像和工具以便将使用过的硬件或是购自灰色市场的硬件重置为一种已知状态。在信任任何下载到的二进制文件,诸如黄金镜像之前,它应该同散列值进行比对。大多数厂商并不提供它们的镜像的散列值
  • Linux UEFI Validation——LUV 是一种由 Intel 创建的 Linux 发行版以测试 OEM 的 UEFI 实现。它捆绑了 CHIPSEC、FWTS 及其他固件测试。LUV 可通过 LUV-live 的二进制形式获得,这是一个 live 启动的发行版
  • Linux 厂商固件服务——也称为 LVFS 或者 fwupd,是一种用于 Linux OEM 的固件更新服务,它极好地提供了一种标准化的系统。使用它的 OEM 正在严肃地对待 Linux 的兼容性和安全性。在微软 Windows 上,一种类似的机制通过 Windows Update 来工作
  • 微软 Windows Update——令人惊讶的是——Windows Update 是极好的!除了提供操作系统软件层级的更新以外,Windows Update 还可以通过标准化的胶囊提供固件更新。这些更新必须被固件/硬件厂商验证,并且可以被 EV 签名
  • Pawn——Google Pawn 是一种以 Linux 为中心的在线固件工具,它可以将平台固件镜像转储为文件,以供以后进行离线分析
  • PhoenixTool——PhoenixTool 是一种第三方免费软件以操作(U)EFI 和少数基于传统 BIOS 的固件 blob
  • rEFInd——rEFInd 是 rEFIt 的继任者,一种允许您选择多种操作系统的 UEFI 引导程序
  • RU.EFI——RU.EFI 是一种拥有多种功能的第三方免费固件工具,它以类似 MS-DOS 或者 UEFI Shell 工具的方式工作
  • RWEverything——RWEverything(RWE)是一种拥有多种功能的第三方免费固件工具。此工具工作在 Windows 上。如果 CHIPSEC 的 Windows 内核驱动程序未被加载,则 CHIPSEC 工具可以使用 RWE 内核驱动程序
  • Sandsifter——Sandsifter 是一种 x86 模糊测试工具
  • UEFI Utilities——UEFI Utilities 是一系列 UEFI Shell 工具的集合,以提供系统诊断信息(它也包含一份 ThinkPwn.efi 副本,当心)
  • UEFI 固件语法解释器——UEFI 固件语法解释器检查固件 blob,主要是 UEFI 的固件 blob
  • UEFITool——UEFITool 是一种对固件 blob 进行语法检查的图形用户界面程序,主要是对于 UEFI 固件 blob。除了 UEFITool Qt 图形用户界面工具以外,UEFITool 源代码项目也包括若干非图形用户界面的命令行工具,包括 UEFIDump。注意,UEFITool 拥有两棵源代码树,master 和新引擎
  • Visual UEFI——Visual UEFI 是 Visual Studio 的一种插件,使得 Visual Studio 用户能够进行 UEFI EDK2 开发而无需知道 EDK2 的构建过程细节,而这种构建过程与 Visual Studio 并不相似
  • zenfish IPMI 工具——由 SATAN fame 的 Dan Farmer 提供的 IPMI 安全测试工具

闭源的

特别注记:闭源软件是不可审计的,也不是可验证地安全的。恶意软件存在的风险较高,而对于固件,使您的系统变砖的风险总是存在。可能有潜在地“良好”的工具,但是这个列表并不成为使用建议。谨慎操作并且自行承担风险。

文档、书籍和培训

  • Beyond BIOS——Beyond BIOS: Developing with the Unified Extensible Firmware Interface(超越 BIOS:利用统一可扩展固件接口进行开发),第三版,这是由 Intel 和其他 UEFI 论坛成员创作的关于 UEFI 的书籍。最初由 Intel 出版社出版
  • Darkreading Firmware Security Tips——这篇含有来自 Intel 的 CHIPSEC 团队的输入内容的文章给出了对于固件安全的基本高级指南。从这篇文章开始,然后再深入研究 NIST 文档
  • Firmware Security Blog——关于固件安全和开发的新闻和信息的开源,其关注焦点是以 UEFI 为中心的平台固件(免责声明:awesome-firmware 的作者之一,以及 PreOS Security 的雇员之一是此 Firmware Security 博主)
  • Firmware Security Twitter List——Jacob Torrey 在 Twitter 上托管此列表,它包含众多核心固件安全研究人员
  • Hardware Security Training——Hardware Security Training 公司是多种硬件/固件安全培训人员的集合
  • Harnessing the UEFI Shell——Harnessing the UEFI Shell: Moving Platform Beyond DOS(治理 UEFI Shell:推进平台超越 DOS),第二版,由 Intel 及其他 UEFI 论坛成员创作的关于 UEFI 的书籍,最初由 Intel 出版社出版
  • Intel Security Training——由位于 Intel Security 的 Intel 高级威胁研究(ATR)团队的 CHIPSEC 团队提供的培训。其文档是关于 Intel 硬件/固件安全威胁的信息的极好的来源,其关注焦点为 UEFI 及其相关技术
  • IPMI Security Best Practices——来自 Dan Farmer 的 IPMI 最佳安全实践。它需要更新。其大部分内容也可适用于 Redfish 或者任何 OOB 管理技术
  • Linux Foundation Workstation Security——Linux 基金会拥有一系列用于 Linux 系统的 IT 策略,它包括某些固件安全指南
  • Linux on UEFI——Linux on UEFI Roderick W. Smith 拥有一部带有关于 UEFI 和 Linux 的信息的在线书籍,展示了如何使用多种引导程序
  • Low Level PC Attack Papers——关于硬件/固件安全研究的极好的时间表
  • NIST——固件指南文档。它们是极好的。从 SP 800-193 开始
    • SP 800-147:一部比较老旧的文档,它主要面向 BIOS
    • SP 800-147b:对 SP 800-147 的补充,特别针对服务器
    • SP 800-155:注意,此文档仍处于草案状态,但已经非常可用
    • SP 800-193:注意,此文档仍处于草案状态,但已经非常可用,并且是所有文档当中最新的。从这里开始
  • NSA Common Criteria for PC BIOS Protection——这是关于 PC 固件的标准保护概要(PP)的 2013 年的通用判据。它解决了这样一种主要威胁:一位对手将会更改或者替换一台 PC 客户端设备的 BIOS 并且以一种持久的方式攻击 PC 客户端环境。并没有任何固件解决方案能够满足此概要,但是对此威胁模型的解读是有用的知识背景
  • One-Stop Shop for UEFI Links——由 UEFI 技术社区维护的关于 UEFI/BIOS 规范和工具的一站式解决方案
  • Open Security Training Intro to BIOS & SMM——关于 BIOS 和 SMM 的课程材料的介绍
  • Rootkits and Bootkits——这是当时唯一关于固件安全性的书籍,由固件安全专家编写

附录 B 企业平台固件安全指南总结检查列表

此部分为关于本书文本和参考资料,特别是对于适用的 NIST 标准的检查列表总结。当您拾起此列表时,您将会在某种程度上贯穿您当前的所有硬件的_硬件生命周期_。我们建议您简单地开始从头实现(策略和程序),并且将此整个列表应用到您的下一批自然发生的硬件采购中来。然后,如果时间允许,为旧硬件贯穿实施此过程,从最为敏感的位置的硬件开始,例如:

  • 官员、财务和法务部门的笔记本
  • 符合 PCIHIPAA 等标准的服务器

这可能会由于安全性的原因触发某些计划外的采购,然而旧硬件可以在不那么敏感的应用中重复使用。


元问题:策略和程序

  • 复查并更新现存的公司安全策略以使其包括固件安全
  • 复查并更新现存的公司安全程序以使其包括固件安全

采购前调研阶段

将硬件和固件包含到威胁模型中来。宽泛地考虑固件。一台计算机包含多种固件镜像:微码、多种平台固件镜像(UEFI 或 BIOS、ACPI 等)、每一块适配器板卡上的固件、每一件外设及其适配器线缆中的固件。除了裸机固件以外,虚拟化技术还拥有同样可以受到攻击的虚拟固件驱动程序。虚拟固件存在其自身的一套攻击方式,有些同裸机固件相同,有些是 VMM 实现所特有的,还有些与传统的应用程序层级的攻击相同。除了存储于闪存和 NVRAM 中的固件 blob 以外,UEFI 将固件作为文件存储在基于 FAT 的磁盘分区上,即 EFI 系统分区(ESP),这在不带 ACL 的 FAT 卷上可以潜在地被攻击者编辑。

计划采购安全的和可以防护的系统,并且在所有层级上防护整个系统:硬件、固件和软件。阅读整篇指南文档并计划实施。

教育技术员工有关固件威胁的内容。为非技术用户防护系统,并且训练他们关于邪恶女仆攻击的内容——特别是对于拥有移动计算设备的用户。

将固件添加到硬件生命周期:系统管理员应该整合 NIST 147,它提供了安全固件生命周期,以增强现存的企业硬件生命周期。数字取证与事故响应(DFIR)团队应该扩展他们的检查列表以包括联系固件厂商、OEM 和 IBV。NIST 147 是一个起始点。

确保厂商特定固件工具的可获得性,测试并且学习使用它们,包括黄金镜像散列值,以及经过签名的更新。

更新对于固件的新闻和培训资源,包括普通的 bug 修复,以及重要安全更新。保证这种覆盖度,以及更新适合于目的。

请求来自厂商的安全数据。自行搜索这些数据,例如,获得一台新型号的样机并且确认它通过了 CHIPSEC 安全测试。

设置公司策略:

  • 关于所购买的新系统必须拥有的安全特性,例如,安全启动、验证启动、TPMv2、CHIPSEC 测试等
  • 拒绝购自灰色市场的硬件
  • 关于新系统所必须配置的安全特性

考虑当前已部署的系统。它们能否满足目的?是应该加速新硬件的采购呢,还是将旧系统部署到不那么敏感的应用中呢?


供货阶段

基于公司的安全策略配置固件安全设置,例如,启用或禁用 VT/TPM/TXT、唤醒特性、固件/BIOS 口令、固件的网络能力、安全启动等。

确保所有厂商固件为最新,带有最新的密钥用于任何经过签名的代码。

在系统清单中注册终端机身份和 BIOS 完整性信息。

在最初的系统采购过程中,制作您自己的平台固件初始黄金镜像,保存该文件作为初始基线以用于将来的比对。如果厂商提供了它们自己的黄金镜像,将您的镜像或者散列值同它们的进行比对。

使用内建的硬件/固件安全特性:使用现存的厂商固件安全特性、TPM、UEFI 安全启动、验证启动、测定启动、可信启动、Heads 等。

使用经过签名的固件镜像:对于 UEFI,除了安全启动以外,仅使用经过适当签名的固件。理解代码签名过程以及哪里可能存在空当——例如,某些证书被赋予闭源的二进制文件并且不允许源代码审计。


操作和维护阶段

保持固件为最新:除了操作系统和应用程序外,也进行固件更新,理想情况是通过经过签名的、自动化的机制,例如 Windows Update、Linux fwupdLVFS)等。

应用来自 uefi.org 或者 microsoft.com 的最新安全启动黑名单密钥数据库。

利用散列值验证固件更新。

执行周期性的固件安全扫描。下载固件 blob 并且利用散列值检查意外的更改。

将 IT 人员同最终用户设备之间的“亲手操作”互动视为运行自动化的固件层级安全测试的机会。

监视固件传出/传入的所有网络流量。

审计那些建议固件更新的操作系统层级代码。如果正在加固操作系统/应用程序,考虑将执行固件更新的工具限制为只有认证帐户才能访问。

在安全事故中,使用传统恶意软件分析技术以查找固件层级的恶意软件,并且添加固件专用工具,诸如 UEFITool、ACPItool 等。

在安全事故中,响应措施应当包括重新获取固件镜像以及重新运行固件安全测试(CHIPSEC 等),以便同之前的镜像/结果进行比对。

查询供应链中的所有厂商的厂商安全咨询站点以获得关于安全性的建议,以及可供使用的新的检测工具,包括主 CPU、TPM 厂商、操作系统厂商、OEM 以及所有 IHV 等。


恢复(事故响应)阶段

使用取证工具比较当前的 ROM 镜像和之前的扫描结果以查找更改。

重新运行安全测试,同最后一次已知正确的结果进行比对,以查找攻击者留下的记号。例如,SPI 保护曾经被禁用,但是现在被启用了。

如果系统被操作系统/应用程序层级的恶意软件攻击,它可能已经更新了固件。验证整个系统,进行固件和操作系统层级的测试。利用固件和操作系统的黄金镜像恢复系统。

安全事故之后,事故响应(IR)团队将会需要额外的时间以清除一台系统中的固件层级的恶意软件。在某些情况下,系统可能会变砖并且不能恢复。

安全事故之后,IR 团队的事后分析报告应该包含哪些厂商未能提供足够的工具/镜像以用于固件恢复,并且丢弃那些系统,或者将其重新部署到相对次要的应用中。


废弃处理阶段

废弃处理之前,将固件恢复至出厂状态。废弃处理一台系统之前,除了清除磁盘介质外,将固件重设至一种已知正确的状态,使用厂商的黄金镜像。

废弃处理之前,清除固件中的任何 PII。废弃处理一台系统之前,确保存储于固件中的任何 PII、用户认证数据、TPM 机密等都被重置。询问厂商如何恢复任何由固件存储的 PII。

附录 C 作者传记

Paul English

Paul English 是 PreOS Security Inc. 的首席执行官。Paul 于 1998 年获得伍斯特理工学院的计算机科学学士学位。自 1996 年起,Paul 成为了一名 UNIX 和 Linux 系统管理员并且戴过很多其他 IT 帽子。其后他管理过少数人,而同时仍然偶尔管理服务器。在 2014~2017 年,Paul 曾经是专业系统管理员联盟(https://lopsa.org)的一名委员会成员,该组织是一个非盈利性的专业协会,以推动系统管理实践的进步。

LinkedIn:https://www.linkedin.com/in/englishpaul/

Twitter:@penglish_PreOS

Lee Fisher

Lee 是 PreOS Security Inc. 的首席技术官。他的 IT 职业生涯始于担任一名 VAX/VMS 和 AT&T Unix 系统管理员,彻夜工作以支持其完成大学学业。Lee 曾在微软的多个系统产品团队度过了多年,包括发布“Debugging Tools for Windows”(新的 Windbg)、“Windows NT HAL Kit”以及“Windows NT IFS Kit”。Lee 和他人共同运营了微软移植实验室(Microsoft Porting Lab),他在此帮助了大多数 OEM 和 IHV 将其驱动程序移植到 Windows NT。Lee 将众多开源项目——诸如 NCSA Mosaic——带到微软总部以帮助它们将其代码移植到 Windows。Lee 在 IT 行业中曾经以多种角色工作,但是更加倾向于使用 C 语言编写安全/系统工具。在创办 PreOS 之前,他正在为少数朋友的公司咨询少数特别的内核驱动程序。

Lee 曾在几十场会议中做报告,包括 Security BSides Portland ‘16、LinuxFest NorthWest、ToorCon Seattle 和微软 WinHEC 等。

Lee 的个人博客可以在这里找到:https://FirmwareSecurity.com/

LinkedIn:https://www.linkedin.com/in/lee-fisher-b80b14143/

Twitter:@leefisher_PreOS

附录 D 勘误

勘误

改进

  • 更多插图和示意图
  • 带有指向所有攻击向量的名称/箭头的主板
  • 硬件生命周期流程图
  • 增加直接连接 PCI、USB、JTAG 的攻击向量范例