17. Intel(R) TXT 概述

英特尔用于更安全计算的技术——英特尔(R) 可信执行技术(Intel(R) Trusted Execution Technology,简称 Intel(R) TXT),定义了平台级别的增强功能,为构建可信平台提供了基础模块。

Intel TXT 以前的代码名称是 LaGrande 技术 (LT)。

Intel TXT 简介

  • 提供动态度量信任根(DRTM)

  • 非正常关机情况下的数据保护

  • 对启动环境的度量和验证

Intel TXT 是 vPro(TM) 品牌的一部分,也可用于某些非 vPro 系统。它目前可用于基于 Q35、X38、Q45 和 Q43 Express 芯片组的台式机系统(例如 Dell Optiplex 755、HP dc7800 等)以及基于 GM45、PM45 和 GS45 Express 芯片组的移动系统。

有关更多信息,请参阅 http://www.intel.com/technology/security/。该网站还提供指向《Intel TXT MLE 开发者手册》(Intel TXT MLE Developers Manual)的链接,该手册已针对新发布的平台进行了更新。

在过去的几年里,Intel TXT 已在各种活动中进行了介绍,其中包括:

17.1. 可信启动项目概述

可信启动(Trusted Boot,简称 tboot)是一个开源的内核/VMM 前置模块,它使用 Intel TXT 对操作系统内核/VMM 执行度量和验证启动。

它托管在 SourceForge 上:http://sourceforge.net/projects/tboot。其 mercurial 源码仓库位于:http://www.bughost.org/ repos.hg/tboot.hg。

Tboot 目前支持启动 Xen(自 v3.2 起支持 TXT 的开源 VMM/hypervisor),现在也支持启动 Linux 内核。

17.2. Linux 的价值主张或“为什么你应该关心?”

虽然有许多产品和技术试图度量或保护正在运行的内核的完整性,但它们都假设内核最初是“好的”。完整性度量架构(IMA)和 Linux 完整性模块接口就是此类解决方案的例子。

要在不使用 Intel TXT 的情况下获得对初始内核的信任,必须使用静态信任根。这以系统重置时开始的 BIOS 信任为基础,并且需要度量从系统重置到内核引导完成之间执行的所有代码以及该代码使用的数据对象。对于 Linux 内核,这意味着所有的 BIOS、任何选项 ROM、引导加载程序和引导配置。在实践中,这是大量的代码/数据,其中许多代码在每次引导之间都可能会发生变化(例如,更换网卡可能会更改选项 ROM)。如果没有参考哈希,这些度量变化很难评估或确认为良性。此过程也不提供 DMA 保护、内存配置/别名检查和锁定、崩溃保护或策略支持。

通过使用 Intel TXT 提供的基于硬件的信任根,可以缓解许多此类问题。具体而言:许多启动前组件可以从信任链中移除,为所有已启动的组件提供 DMA 保护,执行大量的平台配置检查并锁定其值,在非正常关机的情况下为任何数据提供保护,并且支持基于策略的执行/验证。与不使用该技术的情况相比,这提供了更稳定的度量以及更高保证的系统配置和初始状态。由于 tboot 项目是开源的,信任链几乎所有部分的源代码都是可用的(SMM 和英特尔提供的固件除外)。

17.3. 它是如何工作的?

  • Tboot 是一个由引导加载程序作为“内核”(引导加载程序执行的二进制文件)启动的可执行文件。

  • 它执行确定平台是否支持 Intel TXT 所需的所有工作,如果支持,则执行初始化动态信任根的 GETSEC[SENTER] 处理器指令。

    • 如果 tboot 确定系统不支持 Intel TXT 或配置不正确(例如 SINIT AC 模块不正确),它将直接启动内核,而不对任何状态进行更改。

    • Tboot 会将有关其进度的各种信息输出到终端、串口和/或内存日志中;输出位置可以通过命令行开关进行配置。

  • GETSEC[SENTER] 指令将把控制权交还给 tboot,然后 tboot 会验证环境的某些方面(例如 TPM NV 锁定、e820 表没有无效条目等)。

  • 它将把应用处理器(AP)从 GETSEC[SENTER] 指令使它们进入的特殊睡眠状态中唤醒,并将其置于等待 SIPI 状态。

    • 由于在 TXT 环境中处理器不会响应 INIT 或 SIPI,因此有必要为 AP 创建一个小型 VT-x 客户机。当它们在该客户机中运行时,它们将简单地等待 INIT-SIPI-SIPI 序列(这会导致 VMEXIT),然后禁用 VT 并跳转到 SIPI 向量。与必须在内核的 MP 唤醒序列中插入特殊代码相比,这种方法似乎是一个更好的选择。

  • 然后,tboot 应用(可选的)用户定义的启动策略来验证内核和 initrd。

    • 此策略根植于 TPM NV,并在 tboot 项目中有说明。tboot 项目还包含用于创建和配置该策略的工具代码。

    • 策略完全由用户控制,如果不提供策略,则将启动任何内核。

    • 策略操作是灵活的,可以包括在失败时停止或者只是记录它们并继续运行。

  • Tboot 调整引导加载程序提供的 e820 表,以便在内存中保留其自己的位置以及保留某些其他与 TXT 相关的区域。

  • 作为其启动的一部分,tboot 对所有 RAM 进行 DMA 保护(使用 VT-d PMR)。因此,必须使用 ‘intel_iommu=on’ 引导内核,以便移除这种全局保护并使用 VT-d 的页级保护。

  • Tboot 将在共享页中填充一些关于它自身的数据,并在转移控制权时将其传递给 Linux 内核。

    • 共享页的位置作为物理地址通过 boot_params struct as 传递。

  • 内核将查找 tboot 共享页地址,如果存在,则将其映射。

  • 作为 TXT 提供的检查/保护之一,它在内存的 DMA 保护区域中制作 VT-d DMAR 的副本,并验证其正确性。VT-d 代码将检测内核是否通过 tboot 启动,并使用此副本而不是 ACPI 表中的副本。

  • 此时,在关机(S<n>)之前,tboot 和 TXT 就不再起作用了

  • 为了在 TXT 启动后将系统置于任何睡眠状态,必须首先退出 TXT。这是为了防止攻击者试图使系统崩溃以便在重新启动时获得控制权并窃取留在内存中的数据。

    • 内核将执行其所有睡眠准备工作,并在共享页中填充将平台置于所需睡眠状态所需的 ACPI 数据。

    • 然后,内核通过共享页中指定的向量跳转到 tboot 中。

    • Tboot 将清理环境并禁用 TXT,然后使用内核提供的 ACPI 信息实际将平台置于所需的睡眠状态。

    • 对于 S3 的情况,tboot 还将注册自己为恢复向量。这是必要的,因为它必须在恢复时重新建立度量环境。一旦恢复了 TXT 环境,它将恢复 TPM PCR,然后将控制权交还给内核的 S3 恢复向量。为了在整个 S3 过程中保持系统完整性,内核为 tboot 提供了一组内存范围(e820 表中的 RAM 和 RESERVED_KERN,但不包括 BIOS 在 S3 转换期间可能更改的任何内存),tboot 将对其计算 MAC(消息认证码),然后使用 TPM 进行封存。在恢复时且一旦重新建立了度量环境,tboot 将重新计算 MAC 并针对封存的值进行验证。tboot 的策略决定了如果验证失败会发生什么。请注意,带有新 MAC 代码的 tboot c/s 194 支持此功能。

TXT 支持的大致情况就是这样。

17.4. 配置系统

此代码适用于 32 位、32 位 PAE 和 64 位(x86_64)内核。

在 BIOS 中,用户必须启用:TPM、TXT、VT-x、VT-d。并非所有 BIOS 都允许单独启用/禁用它们,并且找到它们的界面因 BIOS 而异。

需要修改 grub.conf 如下

title Linux 2.6.29-tip w/ tboot
  root (hd0,0)
        kernel /tboot.gz logging=serial,vga,memory
        module /vmlinuz-2.6.29-tip intel_iommu=on ro
               root=LABEL=/ rhgb console=ttyS0,115200 3
        module /initrd-2.6.29-tip.img
        module /Q35_SINIT_17.BIN

用于启用 Intel TXT 支持的内核选项位于“Security”(安全)顶级菜单下,称为“Enable Intel(R) Trusted Execution Technology (TXT)”。它被认为是实验性的(EXPERIMENTAL),并且依赖于通用的 x86 支持(以允许内核构建选项具有最大灵活性),因为 tboot 代码将检测平台是否实际支持 Intel TXT,从而决定是否执行任何内核代码。

Q35_SINIT_17.BIN 文件是 Intel TXT 所称的认证代码模块(Authenticated Code Module)。它特定于系统中的芯片组,也可以在 Trusted Boot 网站上找到。它是由英特尔签名的(未加密)模块,用作 DRTM 过程的一部分,用于验证和配置系统。它经过签名是因为它在系统中的运行特权级别高于任何其他宏代码,并且其正确运行对于建立 DRTM 至关重要。确定系统正确的 SINIT ACM 的过程记录在 tboot SourceForge 网站上的 SINIT ACM 下载目录下的 SINIT-guide.txt 文件中。