代码和数据完整性检查由受信任的供应商修改和提供。例如,Windows多年来一直采用驱动程序签名。一些较新的版本更进一步,使用硬件和软件安全功能的组合来锁定计算机,确保它只运行受信任的代码/应用程序——微软称之为“DeviceGuard”的过程。即使是特权恶意软件也无法轻易允许未经授权的应用程序运行,因为检查应用程序是否允许运行的机制驻留在硬件辅助虚拟化环境中。大多数代码签名解决方案将数字签名与操作系统扩展相关联,允许操作系统检查代码的完整性以及供应商是否合法。类似的过程通常用于更新。但是如何检查签名代码以及操作系统本身——我们确定它没有被恶意启动工具包篡改吗?确保在引导过程中加载的系统软件的完整性涉及许多步骤,主要与引导过程本身的多个步骤有关。从最早的商用计算机开始,启动涉及多个阶段。即使是早年流行的IBM701电脑,安装次数多达19次,也已经有了这样的多阶段启动过程,首先按下一个特殊的“加载”按钮,使系统加载单个36位单词通常来自打孔卡片。它将(部分地)执行加载更多指令的字,然后开始作为“引导加载程序”执行这些指令。通常,安全引导设备以启动引导过程的初始“信任根”开始,并且通常是基于硬件的,例如从内部不可变存储器或内部闪存执行软件的微控制器,根本无法重新编程,或者只能通过严格的身份验证和授权检查。例如,现代Apple计算机使用单独的处理器T2安全芯片,为安全启动等功能提供硬件信任根,Google也为此开发了名为Titan的定制处理器。我们现在将讨论硬件信任根如何帮助验证系统是否安全启动。引导通用计算机通常从固件开始,固件会启动一系列阶段,最终形成完全引导的系统。例如,固件可以加载一个特殊的引导加载程序,然后加载操作系统内核,而内核又可以加载额外的引导驱动程序,直到操作系统最终完全初始化并准备好与用户或应用程序交互。所有这些阶段都需要保护。例如,统一可扩展固件接口(UEFI)可以通过安全启动保护第一阶段(即验证引导加载程序的完整性)。安全启动验证引导加载程序是否使用适当的密钥签名,即使用与固件中存储的密钥信息相匹配的密钥。这将防止没有适当签名的加载程序和驱动程序获得系统的控制权。引导加载程序现在可以在加载之前验证操作系统内核的数字签名。接下来,内核会在启动之前验证操作系统的所有其他组件,例如引导驱动程序和可能集成的反恶意软件。通过在其他驱动程序之前启动反恶意软件程序,它可以检查所有这些后续组件并将信任链扩展到完全初始化的操作系统。下一个问题是:我们怎么知道是这种情况?换句话说,我们怎么知道系统确实安全启动,并且我们可以信任屏幕?这里的技巧是使用证据证明对我们系统所做的任何更改都可以被(远程)方检测到。远程证明通常使用特殊硬件,例如充当信任根的可信平台模块(TPM),并涉及逐步验证系统是否加载了“正确”类型的软件。特别是,TPM是一种加密硬件模块,支持一系列加密功能、密钥生成和管理、安全存储(例如,密钥和其他安全敏感信息)以及重要的完整性测量。如需进一步讨论,请参阅硬件安全CyBOK知识区[65]。对于完整性测量,TPM有一组称为PCR-0、PCR-1的平台配置寄存器。..,在每次启动时都设置为已知值。这些寄存器不是用来直接写的,而是用来扩展的。因此,如果PCR-0寄存器的当前值是X,而我们想用Y扩展它,TPM计算hash(X,Y)并存储PCR-0的结果。现在,如果我们想进一步扩展它,比如使用Z,TPM将再次计算Z的散列和当前在其中的值,并将结果存储在PCR-0中。换句话说,它将计算hash(Z,hash(X,Y))。我们现在可以进一步扩展它并创建一个任意长的“哈希链”。PCR中的值可以作为系统处于可信状态的证据。具体来说,系统启动时执行的第一个代码是固件启动代码,有时称为测量信任核心根(CRTM)或BIOS启动块。此代码将通过生成其内容的哈希值来“测量”完整固件,它在开始执行之前将其发送到TPM以扩展PCR-0。接下来,现在正在执行的固件将测量引导过程的下一个组件,并在执行之前将值再次存储在TPM中(例如,通过扩展PCR-0)。经过多个阶段后,PCR寄存器包含系统启动时采取的所有步骤的哈希链。远程方现在可以通过向TPM请求“报价”来验证系统是否可安全启动:使用TPM的PCR中当前的一组PCR值的报告(连同远程方提供的随机数)私有证明标识密钥签名是使用一个永远不会离开TPM的密钥完成的(并且派生自制造时创建的硬编码密钥)。由于公钥是已知的,任何人都可以验证该提议是否来自TPM。在收到提议并验证它来自TPM并且它是最新的之后,远程方知道引导过程只能遵循在PCR中创建这些散列的步骤。如果它们对应于已知和可信代码的哈希值,则远程方才可以知道系统已经安全启动。代码和数据完整性检查可能会在运行时继续进行。例如,管理程序可以提供对其虚拟机进行自省的能力:代码是否仍然相同,数据结构是否仍然有意义?该技术称为虚拟机检查(VMI)。VMI功能可能驻留在管理程序本身中,尽管它可能位于单独的应用程序中。除了代码,在VMI解决方案中检查的常见内容是进程列表(是否有任何rootkit试图隐藏?)、系统调用表(是否有人劫持了特定的系统调用?)、中断向量表等。异常检测监视器,是否在管理程序或操作系统中,还可以用来监视系统中的异常事件——异常检测。例如,连续崩溃数百次的系统可能会受到试图破坏系统地址空间布局随机化的人的攻击。当然,在没有确凿证据的情况下,仅仅因为出现异常并不意味着发生了攻击。异常检测系统必须在发出太多错误警报(处理起来代价高昂)和发出太少(这意味着它会错过实际攻击)之间取得平衡。
