try ai
科普
编辑
分享
反馈
  • 度量启动

度量启动

SciencePedia玻尔百科
核心要点
  • 度量启动通过使用可信平台模块(TPM)在每个软件组件执行前对其进行哈希计算,从而创建一份不可伪造的启动顺序记录。
  • 与阻止未授权代码运行的安全启动(Secure Boot)不同,度量启动报告加载的确切软件,为检测和证明提供证据。
  • 关键应用包括远程证明(服务器向验证者以加密方式证明其完整性)和TPM密封(将加密密钥锁定到已知的良好启动状态)。
  • 度量启动为数字取证提供了一个强大的工具,允许调查人员根据TPM的度量值,以加密方式验证系统启动日志的完整性。

引言

我们如何能确定一个计算机系统从开机那一刻起就是值得信赖的?在一个充斥着复杂恶意软件和远程云基础设施的时代,盲目信任一台机器的软件栈是一种巨大的风险。度量启动(Measured Boot)正是为了解决这个可验证完整性的根本问题,它用加密证明取代了盲目的信任。它提供的不是一个阻止攻击的盾牌,而是一个记录下究竟运行了哪些软件的、无法被腐蚀的见证者。本文将探讨这一强大的安全方法。

第一章 ​​“原理与机制”​​ 将深入探讨其核心技术,解释可信平台模块(TPM)如何构建一条不可伪造的信任链,并区分这种基于报告的方法与安全启动(Secure Boot)的强制执行模型。第二章 ​​“应用与跨学科联系”​​ 将展示这一信任基础如何在云计算安全、数字取证等关键领域得到应用,甚至会将其与科学探究中的验证原则进行类比。

原理与机制

你如何能确定一台计算机正在运行它声称正在运行的软件?这不是一个哲学问题。当银行的服务器处理你的交易,或者云服务提供商运行你的代码,或者你自己的笔记本电脑解锁你的加密文件时,你都对从开机那一刻起的整个软件栈的完整性寄予了巨大的信任。但在一个充斥着复杂恶意软件的世界里,这种信任除了盲目信仰之外还能是什么呢?

​​度量启动(Measured Boot)​​ 提供了一个异常优雅的答案,它不是通过阻止坏事发生,而是通过创建一个不可伪造的记录来证明坏事确实发生了。它用加密证明取代了盲目的信任。要理解这一点,我们必须首先深入了解现代计算机核心处的一块特殊的、防篡改的芯片:​​可信平台模块(TPM)​​。

一条牢不可破的链环

想象你有一个小型的、可信的保险库——TPM。在这个保险库里,有一些特殊的日志簿,称为​​平台配置寄存器(PCRs)​​。与普通日志簿不同,一旦条目被写入,你就无法擦除或修改它。你只能以一种非常特殊的方式添加新条目,这个过程被称为​​扩展(extending)​​。

扩展操作是度量启动的加密核心。假设一个PCR当前持有的值为 poldp_{old}pold​,我们想要记录一个新事件,即一次“度量” mmm。新的值 pnewp_{new}pnew​ 的计算方式如下:

pnew←H(pold∥m)p_{new} \leftarrow H(p_{old} \parallel m)pnew​←H(pold​∥m)

在这里,HHH 是一个加密哈希函数(如 SHA-256),而 ∥\parallel∥ 仅仅表示我们在进行哈希计算前,将旧的PCR值和新的度量值连接(或“粘合”)在一起。这个简单的公式带来了深远的影响。

首先,这是一条​​单行道​​。由于哈希函数 HHH 具有抗原像攻击性,因此从计算上来说,不可能通过 pnewp_{new}pnew​ 推算出 poldp_{old}pold​ 和 mmm 是什么。你只能前进。

其次,​​顺序决定一切​​。度量的顺序至关重要。先度量事件A再接着度量事件B,得到 H(H(pinitial∥A)∥B)H(H(p_{initial} \parallel A) \parallel B)H(H(pinitial​∥A)∥B),与先度量B再接着度量A,得到 H(H(pinitial∥B)∥A)H(H(p_{initial} \parallel B) \parallel A)H(H(pinitial​∥B)∥A),产生的结果完全不同。因此,一个PCR的最终值是记录在案的确切有序事件序列的唯一、敏感的指纹。任何偏差,无论多么微小——单个度量值中的一个比特翻转——都会雪崩式地导致一个完全不同的最终PCR值。

这种机制使得计算机能够构建一条证据链,其中每个链环都以加密方式绑定下一个链环。

构建信任链:从芯片到操作系统

计算机的启动过程是一系列阶段,每个阶段加载并执行下一个阶段。度量启动将这个过程变成了一套严谨的度量仪式。

  1. ​​最初的火花​​:当你按下电源按钮时,最先执行的代码并非位于你的硬盘上,而是蚀刻在处理器的芯片中或主板上的只读存储器(ROM)芯片里。这段不可变的代码就是​​可信度量根(CRTM)​​。它的可信度是绝对的,因为它无法被更改。它的首要任务,在做任何其他事情之前,就是通过计算下一个启动阶段(UEFI固件)的哈希值来度量它。然后,它将这个度量值“扩展”到一个PCR中。

  2. ​​传递接力棒​​:CRTM随后将控制权交给UEFI固件。固件因已被度量而获得信任,于是它接过了责任。在从磁盘加载操作系统引导加载程序之前,它会度量该引导加载程序,并扩展同一个PCR。

  3. ​​链条延续​​:引导加载程序继而度量操作系统内核,然后再执行它,并再次扩展PCR。内核甚至可以继续这个过程,度量驱动程序和关键的配置文件。

请注意这里发挥作用的关键原则:​​度量先于执行​​。每个软件组件在它仅仅是磁盘上的数据时就被度量,此时它还没有被赋予运行和可能作恶的能力。这就创建了一条​​信任链​​,锚定在物理上不可变的CRTM中,链上的每个环节通过度量下一个环节来为其完整性作证。PCR中的最终值是这整个链条的顶点,是一个代表整个启动历史的单一数字。

报告而非监管:度量启动 vs. 安全启动

将度量启动与其近亲​​安全启动(Secure Boot)​​区分开来至关重要。它们服务于不同但互补的目的。

把​​安全启动​​想象成一个有着严格访客名单的俱乐部保镖。它会检查每一段启动软件的数字签名。如果签名不在名单上(即未经微软或硬件供应商等可信机构签名),它就会被拒绝进入。安全启动强制执行一项策略;它主动阻止未授权代码运行。

而​​度量启动​​则像一个高分辨率的安保摄像头系统,它一丝不苟地记录下进入的每一个人及其顺序。它不会在门口阻拦任何人,但它会生成一份关于谁在何时进入的、完美的、不可伪造的记录。它报告发生了什么。

考虑一个简单的攻击:恶意行为者无法更改签名的内核文件,但他们设法编辑了一个配置文件以禁用一项关键的安全功能。这就像一个持有有效身份证件的客人携带了一个可疑的包裹。

  • ​​安全启动​​会检查内核的签名,发现其有效,并允许系统启动。保镖检查了身份证,看到它是有效的,但没有检查包裹。
  • ​​度量启动​​,如果配置如此,不仅会度量内核,还会度量该配置文件。由于配置已更改,度量值也不同,最终的PCR值将会有所不同。安保摄像头记录下了该客人进入时携带那个特定包裹的情景。

安全启动提供预防性强制执行。度量启动为检测和响应提供证据。一个真正安全的系统两者都会使用。

裁决:远程证明与本地密封

那么,我们有了这个强有力的证据,这个PCR指纹。我们能用它做什么呢?主要有两个应用。

远程证明

想象一个云服务,只有当它能信任你的计算机没有被攻破时,才会授予你访问敏感数据的权限。你不能只让你的计算机说:“我很好,相信我。”你需要证据。

这就是​​远程证明(remote attestation)​​发挥作用的地方。云服务(“验证者”)向你的计算机发送一个挑战。作为回应,你的TPM会生成一个​​引用(quote)​​:一份包含当前PCR值的、经过数字签名的声明。这个签名是使用一个锁定在TPM内部且永远无法被提取的特殊密钥创建的。

验证者收到这个引用。它首先检查签名以确认其来自一个真实的TPM。然后,它将引用中的PCR值与它所知的一组对应于干净、可信启动状态的“黄金”值进行比较。如果匹配,验证者就授予访问权限。如果不匹配——就像我们配置文件攻击的例子中那样——它就知道出了问题,并可以拒绝访问或发出警报。

TPM 密封

度量启动的力量并不仅限于向他人证明其状态。它还可以用于自我保护,即使在完全离线的情况下。这是通过​​TPM密封(TPM sealing)​​实现的。

想想你的全盘加密密钥。你希望它受到保护。通过TPM密封,你可以将这个密钥锁在一个与特定PCR值集合绑定的数字保险库中。TPM只有在当前机器中的PCR值与已知良好启动状态的PCR值完全匹配时,才会“解封”(释放)该密钥。

如果攻击者设法在你的引导加载程序中安装了一个rootkit,启动过程将生成不同的PCR值。当操作系统稍后请求TPM解封磁盘密钥时,TPM会检查PCR,发现不匹配,并予以拒绝。攻击者最终只能得到一个加密的、无用的硬盘。系统利用了篡改的证据来保护自己。

附加说明:边界与盲点

与任何安全技术一样,度量启动并非万能。了解其局限性与了解其优势同样重要。

  • ​​信任之信问题(The Trusting Trust Problem)​​:整个信任链都锚定在CRTM——即运行的第一个代码片段上。如果那段代码本身被攻破了呢?一个高明的攻击者可以安装恶意固件(“bootkit”),对TPM撒谎,扩展“良好”的度量值,而实际上加载恶意代码。如果信任的根基被污染,整个链条就毫无价值。

  • ​​检查与使用之间的间隙(TOCTOU)​​:度量是时间上的一个快照。攻击可能发生在组件被度量之后、被执行之前的微小窗口期。例如,一个具有​​直接内存访问(DMA)​​能力的恶意外部设备,可以在引导加载程序已经度量过合法内核之后,在内存中将其覆盖。这就是为什么TCB,即​​可信计算基​​,有时不仅要包括引导加载程序代码,还要包括管理这类强大硬件的驱动程序。当计算机从睡眠(S3挂起到内存)中恢复时,也存在类似的漏洞。PCR值与睡眠前保持不变,但具有物理访问权限的攻击者可能已经篡改了活动内存。

  • ​​运行时盲点​​:标准的度量启动主要保护启动过程。对于系统启动并运行后发生的事情,它提供的保证很少。Web浏览器中的漏洞、恶意文档,或由JIT(即时)编译器动态生成的代码,都是启动时度量无法捕获的运行时事件。虽然像Linux的​​完整性度量架构(IMA)​​这样的技术将度量扩展到文件加载时,但它们仍然无法捕获一个运行中进程的动态、瞬时行为。

  • ​​完整性 vs. 机密性​​:度量启动提供完整性——保证你的软件是你所期望的样子。它本身并不提供内存中数据的机密性。​​冷启动攻击(cold boot attack)​​,即攻击者物理地冷冻并提取RAM芯片的内容,可以窃取像活动加密密钥这样的秘密。度量启动无法阻止这种物理上的数据窃取;它只能证明机器在下一次启动时是干净的。

综上所述,度量启动是一个深刻而强大的概念。它通过创建一个无法被腐蚀的现实记录,为构建可信系统提供了一个坚实的、加密安全的基础。虽然它并非万灵丹,但它是一个基本的构建模块,一个美妙的机制,使我们第一次能够从盲目地信任我们的计算机,转向可验证地了解它们。

应用与跨学科联系

我们花了一些时间来理解度量启动的机制——加密哈希、平台配置寄存器(PCR)以及“扩展”操作的单向性。这是一项精巧而简洁的工程设计。但它究竟有何用途?它能解决我们真正关心的问题吗?换一种方式问,既然我们已经在计算机内部构建了这个精确无比且无法腐蚀的见证者,它能提供什么样的证词,又会有谁对听取这些证词感兴趣呢?

事实证明,它的证词对现代计算的根基至关重要。从驱动云服务的庞大数据中心到你桌上的笔记本电脑,度量启动提供了一种基本能力:能够向一台机器提问,“用加密证明向我展示,你今天究竟是如何启动的。”这个简单的问题在众多领域都具有深远的影响。

云的基石:在服务器的海洋中建立信任

想象一下云。它不是天空中某种飘渺的存在;它是一个装满了别人电脑的物理仓库。当你启动一个虚拟机(VM)时,你本质上是在借用陌生人硬件的一部分。你怎么可能信任它?你如何知道管理你虚拟机的宿主程序——虚拟机监控程序(hypervisor)——没有被攻破?你如何知道你想要运行的虚拟机镜像就是实际启动的那个?

这就是度量启动在名为​​远程证明​​的过程中扮演核心角色的地方。在一个新的虚拟机被允许加入敏感网络或接收加密密钥等机密信息之前,一个编排器——即主控制器——会向它发出挑战。“证明你的完整性,”它要求道。虚拟机利用其虚拟TPM,呈现一个“引用”:一份经过签名的、无可否认的PCR值声明。

编排器就像一个高级俱乐部门口无情的保镖。它有一份宾客名单——一份清单,精确记录了哪些固件、引导加载程序、内核和初始RAM磁盘是被允许的。它已经为这唯一一个被批准的配置预先计算出了确切的最终PCR值。如果虚拟机的证明PCR值与名单完美匹配,它就被允许进入。如果差了哪怕一个比特——也许是因为使用了另一个(但仍然有效)版本的内核——它就会被拒绝。在这个世界里,没有“差不多就行”。一台使用各种被批准部件混搭启动的机器,一个“弗兰肯斯坦”配置,与一台带有公然恶意代码的机器同样不可信,因为这些不同组件之间的交互是未经测试和验证的。

这整个过程依赖于一个精心设计的安全架构。仅仅让虚拟机发送其PCR值是不够的;整个对话都必须是安全的。验证者发送一个随机的、一次性的数字,一个随机数(nonce)(我们称之为N\mathcal{N}N),TPM必须将其包含在签名的引用中。这确保了证明是新鲜的,而不是对过去某个良好状态的重放。此外,vTPM的身份必须以加密方式锚定到主机的物理硬件,并绑定到特定的虚拟机实例,以防止攻击者将受损虚拟机的身份与良好虚拟机的身份互换。只有一个结合了硬件信任根、度量启动和安全证明协议的完整的、端到端的设计,才能提供向虚拟机释放机密所需的高保证。

这一原则甚至可以扩展到最恶劣的环境中,比如通过本地网络启动一台无盘服务器。传统的网络启动协议,如PXE和TFTP,是出了名的不安全,好比在一个拥挤的房间里大声喊出你的请求,并相信任何回应。网络上的攻击者可以轻易地拦截这些请求,并提供一个恶意的操作系统。我们如何在这里建立信任?通过分层防御。首先,我们使用安全启动来确保初始的网络引导程序是经过签名且真实的。然后,这个受信任的程序会放弃不安全的TFTP协议,转而通过像TLS这样的安全加密通道来获取真正的操作系统。在每一步中,度量启动都在观察,记录网络引导加载程序的哈希值、它连接到的服务器的证书,以及它下载的内核的哈希值。这就创造了一个完整、可验证的故事,证明这台机器不仅启动了真实的代码,而且是从正确、受信任的来源获取的,而这一切都是在一个不受信任的网络海洋中完成的。

超越启动:一个活体系统的完整性

信任链并不会在操作系统内核出现在屏幕上时就结束。如果操作系统做的第一件事就是执行一个恶意脚本,那么一个完美的、安全的启动过程也无济于事。这在云计算中是一个非常现实的问题,虚拟机通常在首次启动时使用从元数据服务中获取的脚本(如cloud-init)进行配置。如果攻击者能够影响那个元数据服务,他们就可以在机器证明其完整性后不久就将其攻破。

唯一的解决方案是扩展信任链。度量启动的理念必须应用于这些“首日”配置。任何将被执行的脚本或动态数据也必须被验证,例如,要求它必须由组织的编排器进行数字签名。首次启动框架必须作为信任链中的下一个环节,拒绝执行任何缺乏有效签名的配置 [@problemid:3673393]。

这揭示了度量启动更深层次的角色:它不仅仅是关于保护启动过程,而是关于建立一个​​可信基础​​,其他安全服务可以基于此运作。度量启动确保操作系统内核及其关键安全模块未被篡改。在Linux中,这样的一个模块就是完整性度量架构(IMA)。当度量启动监控引导加载程序和内核时,IMA可以被配置为继续这个过程,在每个应用程序和库文件被执行或加载到内存之前对其进行度量。

当然,这本身也带来了挑战。如果你度量每一个文件,你就需要一个庞大的已知良好哈希值的白名单。当你应用一个安全更新时会发生什么?成百上千的文件会改变,它们的哈希值将不再与白名单匹配。系统会陷入停滞,阻止合法的程序运行。这意味着白名单必须与系统补丁同步更新。在这里,我们看到了纯粹的加密理论与混乱的运维现实相遇的边界。度量启动无法解决白名单管理的问题,但它保证了执行白名单的机制(操作系统内核和IMA)本身是值得信赖的。

一个数字飞行记录仪:取证、攻击和你的个人电脑

让我们把这些想法带回到一个更熟悉的设备上:一台可以双启动Windows和Linux的个人电脑。这种常见的设置极好地说明了安全启动和度量启动互补但截然不同的角色。安全启动是执行者;它检查引导加载程序(如GRUB)的签名,如果它不是由受信任的密钥签名的,就拒绝运行它。这是一种预防性控制。

度量启动是记录者。它不阻止任何东西运行。它只是用加密的不可磨灭的墨水,记下发生了什么。如果你配置你的GRUB引导加载程序以禁用对Linux内核的签名检查,安全启动已经完成了它的工作——它验证了GRUB——而强制执行的链条现在断了。攻击者可以插入一个恶意的内核,它将会运行。但度量启动仍然在观察。它会尽职地记录下恶意内核的哈希值,最终的PCR值将会不同。度量链没有断裂,但如果没有后续的强制执行步骤(比如解封磁盘加密密钥),这个度量就只是一个没人会读的日志中的一条记录。

当我们考虑到复杂的​​回滚攻击​​时,这种“度量但不强制执行”的能力变得至关重要。想象一下,一个攻击者获得了你机器的访问权限,并将你新的、已打补丁的引导加载程序替换为一个旧版本。这个旧版本仍然由供应商完美签名,所以安全启动允许它毫无怨言地运行。然而,这个旧版本包含一个已知的漏洞,攻击者现在可以利用它。安全启动对这种攻击是盲目的。度量启动则不然。它会检测到旧版本不同的哈希值,结果PCR值会改变。一个有着严格策略——只允许最新版本——的远程证明验证者会立即将该系统标记为不合规。这表明,度量比单独的签名检查提供了更细粒度的系统完整性视图。

这种创建启动过程完美、不可变记录的能力,使度量启动成为​​数字取证​​的强大工具。在安全事件发生后,调查人员面对的是一台被攻破的机器。他们无法信任硬盘上的任何文件——包括任何日志文件,因为攻击者可以轻易地修改它们。他们如何重建事件经过?他们求助于TPM。

把TPM想象成飞机的飞行记录仪,而磁盘上的事件日志则是飞行员的纸质笔记本。笔记本可能被伪造。但飞行记录仪是防篡改的。调查员首先挑战TPM,以获得一份签名的PCR值引用——这是来自飞行记录仪的真实数据。然后,他们拿起磁盘上不可信的事件日志——飞行员的笔记本——并以数学方式“重放”它。他们从零开始,执行日志中描述的相同PCR扩展序列。如果他们计算出的最终值与TPM引用的值匹配,他们就以加密方式证明了磁盘上的日志是启动过程的真实、忠实的记录。如果不匹配,他们就知道日志是假的。因为哈希函数是单向的,所以不可能从PCR值反向推算出被篡改的日志应该是什么样的。一旦验证通过,这个日志就为调查人员提供了一个精确、可信的时间线,记录了操作系统接管前加载的每一个组件,使他们能够精确定位被攻破的时刻。

一个统一的原则:科学中的信任链

我们已经看到,度量启动是用于在计算机系统中建立可验证信任链的工具。但这个想法仅限于计算领域吗?让我们退后一步,看看更大的图景。我们真正谈论的是,基于一个从可信基础开始的证据链,来建立对某个结果的信心的过程。这不是一个新想法;它正是科学探究的本质。

考虑一个化学实验室正在测量水样中污染物浓度 CCC。最终的数值是由一台连接到分析仪器的复杂计算机产生的。这台计算机可以使用度量启动来提供一个加密日志,证明其操作系统和数据采集软件未被篡改。但这是否就意味着数值 CCC 是可信的呢?并非如此。

整个实验就是一条信任链。计算机对电信号的测量是与来自校准标准的信号进行比较的。校准标准的浓度是通过在分析天平上称量微量的纯化学品,并用容量瓶将其溶解在精确体积的水中来确定的。整个过程都被计时和记录。

那么,这整个科学实验的​​可信计算基(TCB)​​是什么?它不仅仅是计算机的固件和TPM。它还包括​​分析天平​​和​​容量瓶​​,它们是物理测量的“信任根”。它也是​​系统时钟​​,是时间的信任根。在实验开始之前,这些基础工具必须经过校准和认证。它们的正确性被假定,就像TPM的完整性被假定一样。从这个基础上,一条信任链被建立起来。天平和玻璃器皿保证了标准的准确性。标准被用来校准仪器。而计算机,其自身的完整性由度量启动保证,记录了仪器的信号。

通过这个视角来看,度量启动不仅仅是一项小众的安全技术。它是一个普适原则的美妙实现。它相当于科学家的校准仪器和一丝不苟的实验记录本的数字版本。它是一种机制,确保我们复杂世界中至少有一部分——计算机的启动过程——是建立在可验证真理的基础之上,使我们能够充满信心地在其上构建更高、更复杂的系统。