第5章 可信PC 可信PC是最早开发,并已经得到实际应用的可信计算平台。在中国国家标准GB/T 29827—2013《信息安全技术可信计算规范可信平台主板功能接口》中,根据TPM 是否 早于PC主CPU 先启动,TPM 是否能对PCBootROM 引导代码先进行可信度量,将可 信PC分为兼容型和增强型可信PC。本章主要介绍可信PC的系统结构、中国可信PC 实现实例和操作系统安全增强。 5.1 可信PC的系统结构 兼容型可信PC通常在普通PC的主板上利用已有总线接口,集成TPM,对主板硬件 结构基本上不做调整。增强型可信PC需对主板硬件结构进行一定调整,以实现TPM 早 于PC主CPU 先启动,完成对PCBootROM(BIOS/EFI)启动代码的完整性度量。兼容 型和增强型可信PC在系统结构上有所差异。 5.1.1 兼容型可信PC 的主板结构 TCG在其发布的可信PC规范里提出了兼容型可信PC的组成结构。兼容型可信 PC的主要特征是在主板上嵌有可信构建模块(TrustedBuildingBlock,TBB),它包括可 信度量根核(CoreRootofTrustforMeasurement,CRTM)和TPM,以及它们与主板之 间的连接,如图5-1所示。基于TBB和信任链机制,就可实现可信性的度量、存储、报告 机制,确保系统重要资源的完整性和平台的安全可信,为用户提供可信服务。在兼容型可 信PC里,TPM 通常通过LPC(LowPinCount)、I2C(InterIC)、SPI(SerialPeripheral Interface)、EPI(ExtendedPeripheralInterface)等总线与ICH(IO ControllerHub)或 PCH(PlatformControllerHub)芯片相连接。兼容型可信PC的TPM 与PC主CPU 同 时启动,CRTM 就是BootROM(BIOS/EFI)的起始代码。 5.1.2 增强型可信PC 的主板结构 中国国家标准GB/T29827—2013《信息安全技术可信计算规范可信平台主板功能 接口》提出了增强型可信PC的主板结构。增强型可信PC的主板由TPM 和其他通用部 件组成,以TPM 可信根为核心部件实现完整性的度量、存储、报告机制,并实现平台可信 第5章可信PC 图5-1 兼容型可信PC 主板结构 引导功能,如图5-2所示。TPM 包括TPM 硬件与固件系统,以及对外提供的驱动程序等 实体。增强型可信PC 主板是基于TPM 模块的计算机主板,包括CPU 、动态存储器、显 示控制器、总线、TPM 硬件设备、BootROM 固件层支撑模块及其设备驱动程序和TPM 嵌入式系统等实体。计算机主板构建原则需确保TPM 模块与主板的一一对应绑定关系。 图5-2 增强型可信PC 的主板结构 增强型可信PC 主板与兼容型可信PC 主板的主要不同是,控制时序要确保计算机上 电启动时TPM 先执行最初的可信度量,然后主CPU 再执行后续的度量。 129 可信计算 增强型可信PCTPM 与计算机主板其他部件的协作关系满足如下要求: ① TPM 先于计算机主板其他部件启动,包括主CPU,为实现(RootofTrust Measure,RTM)度量BootROM(BIOS/EFI)的初始引导代码EMM1(扩展度量模块)构 造必要条件。 ② TPM 能够通过物理电路连接,可靠地读取主机BootROM 的初始引导代码 EMM1,并对其实施完整性度量和PCR扩展存储操作。 增强型可信PC的RTM 度量EMM1的完整性过程如下。 ① TPM 可靠装载RTM 程序代码。 ② RTM 通过主板和TPM 物理总线连接可靠地读取BootROM 中指定地址区间的 EMM1代码。 ③ RTM 对EMM1执行哈希计算,并将结果扩展存储在TPM 的PCR里。 ④ TPM 确保能在EMM2请求下将RTM 度量EMM1得到的结果发送给EMM2 处理。 5.1.3 可信根 TPM 模块是PC的可信根(RT),包括可信度量根(RTM)、可信存储根(RTS)和可信 报告根(RTR)。 ① 可信度量根(RTM):RTM 是对平台进行可信度量的基点。兼容性可信PC 的 RTM 是BootROM 的起始代码,用于对计算机系统资源进行最初的可信度量,它又被称 为CRTM。增强型可信PC的RTM 是TPM 嵌入式系统中用于度量BootROM 程序起 始代码的执行部件。 ② 可信存储根(RTS):RTS是对可信度量值进行安全存储以及维护密钥树和保证数 据安全的基点。它由TPM 中的一组平台配置寄存器(PlatformConfigurationRegister,PCR) 和存储根密钥(StorageRootKey,SRK)或主存储密钥(PrimaryStorageKey,PSK)共同 组成。③ 可信报告根(RTR):RTR 是平台向访问客体提供平台可信性状态报告的基点。 它由TPM 中的PCR和EK的派生密钥AIK(AttestationIdentityKey)或受限签名密钥 (RestrictedSignKey,RSK)共同组成。 5.1.4 信任链和可信启动 无论是兼容型可信PC还是增强型可信PC,在RTM 完成对EMM1的可信度量后, 均由可信扩展度量模块完成后续的信任链建立及可信启动过程。可信PC的BootROM 主要有传统BIOS和扩展固件接口(ExtendedFirmwareInterface,EFI)两种形式,下面分 别进行描述。 1. BIOS 完整性度量 在使用BIOS的可信PC里,EMM1是BIOS启动块,EMM2是BIOSMainBlock,如 图5-3所示。 130 第5章可信PC PC 启动时,BIOS 启动块还不能使用PC 的主内存,只能 使用主CPU 的寄存器。BIOS 启动块需要校验BIOSMain Block的完整性,若BIOS 启动块直接用PC 主CPU 进行计 算,由于不能使用PC 主内存,效率会很低,校验BIOSMain Block的完整性会花费较长时间,整个可信PC 的启动时间也 会增加。为加快BIOS 启动块对BIOSMainBlock的完整性 校验,BIOS 启动块将BIOSMainBlock传送给TPM(在 图5-3BIOSEMM1EMM2 BIOS 中加入TPMMA 驱动), 由TPM 完成哈希计算,如存储示意图 图5-4所示。 图5-4BIOS 完整性度量 与PC 主CPU 相比,TPM 的处理器的频率较低,不适宜进行大数据量的哈希运算, 故BIOS 启动块只将BIOSMainBlock初始部分代码传送给TPM 进行哈希计算(BIOS 中加入TPMMP 驱动), 该初始部分只包括PC 主内存初始化模块、哈希引擎,以及调用 哈希引擎对BIOSMainBlock剩余部分进行完整性度量模块三部分。 BIOS 启动块利用TPM 度量完BIOSMainBlock初始部分的完整性后,便将平台主 CPU 的控制权转交给BIOSMainBlock的初始部分。BIOSMainBlock初始部分就直接 调用哈希引擎使用PC 主CPU 和主内存度量BIOSMainBlock剩余部分的完整性,之后 将PC 主CPU 的控制权转交给BIOSMainBlock的剩余部分。BIOSMainBlock剩余部 分再调用哈希引擎度量如下对象:PC 配置信息和配置事件、CPU 升级微码、Option ROM 代码、配置数据、初始程序装载器(InitialProgramLoader,IPL)代码和配置数据 等。在PC 进行状态转换时,主CPU 的控制权返回给BIOSMainBlock,完成对平台状态 转换事件的度量。 BIOS 平台有关的度量对象以及该部分是否为必须度量见表5-1。 BIOSMainBlock需要调用TPMPCR 扩展等功能,需在BIOS 中增加MP(内存可 用)驱动。BIOS 将TPM 设备映射到一个基地址,负责与TPM 进行通信。 MP 驱动的内存模式:MP 驱动的内存模型必须是保护模式。代码是浮动地址代码, 不得对EIP 的值做任何规定。 MP 驱动的基本函数如下。 131 可信计算 表5-1 BIOS平台有关的度量对象以及该部分是否为必须度量 序号度量对象必须/可选 0 BIOSBootBlock版本标识符必须度量 POSTBIOS代码必须度量 SMM(系统管理模式)代码和建立系统管理模式的程序必须度量 ACPIFlash数据必须度量 EmbeddedOptionROM:由主板厂商控制并维护的主板固件代码镜像必须度量 1 CPU 升级微码必须度量 主机平台配置事件必须度量 ESCD、CMOS和其他NVRAM 数据可选度量 SMBIOS结构可选度量 2 被BIOS调用的OptionROM Code 必须度量 针对BIOS不可见的OptionROM Code部分必须度量 固化在主机平台的主板上,但由非设备制造商控制的OptionROM Code 必须度量 4 OptionROM 的配置信息必须度量 OptionROM 的静态数据必须度量 5 平台状态转换事件:系统从S4(休眠)和S5(关机)状态返回到S0(全速运 行)状态的状态转换事件 必须度量 ① MPInitTPM,对TPM 和驱动进行初始化。 ② MPCloseTPM,关闭对TPM 设备的连接。 ③ MPGetTPMStatusInfo,从TPM 设备读取当前错误和状态信息。 ④ MPTPMTransmit,从输入缓冲向TPM 传送数据,并向输出缓冲读取TPM 的响应。 2. UEFI 完整性度量 在使用EFI的可信PC里,EMM1是BootCore,为EFI执行的第一条指令到TPM 图5-5 EFIEMM1EMM2 存储示意图 驱动加载完毕之间的代码,通过插入在EFIBIOS中的GUID 标识EMM1代码的结束位置;EMM2是EFI主启动代码,如 图5-5所示。 EMM1和EMM2 之间包含MAP1,MAP2,…,MAPi, EMM2等多个度量代理点。EMM1负责对后续加载的代码 MAP1进行度量,然后将控制权传递给MAP1,MAP1再按照 上述方法向后传递,信任链依此方式建立。MAP完成对平台 硬件配置信息、EFIBIOS重要数据结构、核心代码等部件的完 整性度量。各部分都度量完毕后,EMM2度量IPL(EMM3), 并传递控制权,如图5-6所示。 132 第5章可信PC 图5-6 EFI 度量结构图 EFI 平台有关的度量对象以及该部分是否为必须度量见表5-2。 表5- 2 EFI平台有关的度量对象以及该部分是否为必须度量 序号度量对象必须/可选 PC 厂商提供的EFI 固件必须度量 0 嵌入在系统ROM 中的EFI 驱动程序可选度量 静态ACPI 表必须度量 1 其他数据表可选度量 影响系统配置的EFI 变量可选度量 2 适配器中EFI 引导服务驱动程序必须度量 适配器或外部存储中EFI 引导服务应用程序必须度量 3 EFI 变量可选度量 EFI 运行时应用程序(EFIOS 装载器) 必须度量 4 EFI 运行时应用程序(HBA 系统配置工具OS 装载器) 必须度量 EFI 运行时应用程序(EfiChkDsk.efi或Diskpart.efi) 必须度量 EFI 引导变量BootOrder 必须度量 5 GPT 表必须度量 EFI 规范或私人定义的EFI 静态变量可选度量 133 可信计算 EFI需调用TPMPCR扩展等功能,在UEFI里增加调用TPM 的接口UEFI_TPM_ PROTOCOL,该Protocol符合UEFI相关规范。 UEFI_TPM_PROTOCOL定义如下: GUID #define UEFI_TPM_PROTOCOL_GUID {0xf541796d, 0xa62e, 0x4954, 0xa7, 0x75, 0x95, 0x84, 0xf6, 0x1b, 0x9c, 0xdd} typedef struct { UEFI_TPM_STATUS_CHECK StatusCheck; UEFI_TPM_HASH_ALL HashAll; UEFI_TPM_LOG_EVENT L ogEvent; UEFI_TPM_PASS_THROUGH_TO_TPM PassThroughToTPM; UEFI_TPM_HASH_LOG_EXTEND_EVENT HashLogExtendEvent; } UEFI_TPM_PROTOCOL; UEFI_TPM_PROTOCOL成员描述见表5-3。 表5-3 UEFI_TPM_PROTOCOL成员描述 数 据描 述 StatusCheck 反映TPM 当前状态的服务 HashAll 哈希计算服务 LogEvent 进行事件日志记录服务 PassThroughToTPM 访问TPM 的命令通道服务 HashLogExtendEvent 服务:进行哈希计算、将结果扩展到TPMPCR中、记录事件日志 EventLog描述详细的完整性度量日志,在可信验证时需要使用EventLog。pre-OS 阶段度量日志保存在ACPI表中。EventLog的一条记录的结构如下。 typedef struct { TPM_PCRINDEX PCRIndex; TPM_EVENTTYPE EventType; TPM_DIGEST Digest; UINT32 EventSize; UINT8 Event[n]; } TPM_PCR_EVENT; TPM_PCR_EVENT成员描述见表5-4。 表5-4 TPM_PCR_EVENT成员描述 数 据描 述 PCRIndex PCR序号 EventType 记录类型 134 续表 第5章 可信PC 数 据描 述 Digest 程序或数据哈希值 EventSize 记录内容的大小 Event[n] 所记录事件的内容 UEFI_TPM_STATUS_CHECK typedef EFI_STATUS (EFIAPI * UEFI_TPM_STATUS_CHECK) ( IN struct _UEFI_TPM_PROTOCOL *This, OUT TPCM_BOOT_SERVICE_CAPABILITY *ProtocolCapability, OUT UINT32 *TPMFeatureFlags, OUT UEFI_PHYSICAL_ADDRESS *EventLogLocation OUT UEFI_PHYSICAL_ADDRESS *EventLogLastEntry ); 该服务用于获取TPM 当前状况的信息以及EventLog相关内容。UEFI_TPM_ STATUS_CHECK函数参数描述见表5-5。 表5-5 UEFI_TPM_STATUS_CHECK 函数参数描述 数 据描 述 This 指向UEFI_TPM_PROTOCOL的指针 ProtocolCapability 返回当前TPM 的状态信息 TPMFeatureFlags 用于指示Feature EventLogLocation 指示EventLog位置的指针 EventLogLastEntry 指示内存中最后一个Entry的起始地址 UEFI_TPM_HASH_ALL typedef EFI_STATUS (EFIAPI * UEFI_TPM_HASH_ALL) ( IN struct _UEFI_TPM_PROTOCOL *This, IN UINT8 *HashData, IN UINT64 HashDataLen, IN TPM_ALGORITHM_ID AlgorithmId, IN OUT UINT64 *HashedDataLen, IN OUT UINT8 **HashedDataResult ); 该服务用于提供哈希操作。UEFI_TPM_HASH_ALL函数参数描述见表5-6。 135 可信计算 表5-6 UEFI_TPM_HASH_ALL函数参数描述 数 据描 述 This 指向UEFI_TPM_PROTOCOL的指针 HashData 指向将要被哈希的数据缓冲区的指针 HashDataLen 用于哈希计算的数据缓冲区的长度 AlgorithmId 哈希算法标识 HashedDataLen 哈希结果的长度 HashedDataResult 指向哈希结果的指针 UEFI_TPM_LOG_EVENT typedef EFI_STATUS (EFIAPI *UEFI_TPM_LOG_EVENT) ( IN struct _UEFI_TPM_PROTOCOL *This, IN TPM_PCR_EVENT *TPMLogData, IN OUT UINT32 *EventNumber, IN UINT32 Flags ); 该服务用于提供LogEvent功能的操作,并将结果添加到EventLog的入口。UEFI_ TPM_LOG_EVENT函数参数描述见表5-7。 表5-7 UEFI_TPM_LOG_EVENT函数参数描述 数 据描 述 This 指向UEFI_TPM_PROTOCOL的指针 TPMLogData 指向内存中TPM_PCR_EVENT数据结构的首地址的指针 EventNumber 刚刚被Log的Event的数目 Flags 标志位 UEFI_TPM_PASS_THROUGH_TO_TPM typedef EFI_STATUS (EFIAPI *UEFI_TPM_PASS_THROUGH_TO_TPM) ( IN struct _UEFI_TPM_PROTOCOL *This, IN UINT32 TpmInputParameterBlockSize, IN UINT8 *TpmInputParameterBlock, IN UINT32 TpmOutputParameterBlockSize, IN UINT8 *TpmOutputParameterBlock ); 该调用用于以字节流形式向TPM 发送命令,以字节流形式返回TPM 的结果。 UEFI_TPM_PASS_THROUGH_TO_TPM 函数参数描述见表5-8。 136 第5章 可信PC 表5-8 UEFI_TPM_PASS_THROUGH_TO_TPM 函数参数描述 数 据描 述 This 指向UEFI_TPM_PROTOCOL的指针 TpmInputParameterBlockSize TPM 输入参数块的大小 TpmInputParameterBlock 指向TPM 输入参数块的指针 TpmOutputParameterBlockSize TPM 输出参数块的大小 TpmOutputParameterBlock 指向TPM 输出参数块的指针 UEFI_TPM_HASH_LOG_EXTEND_EVENT typedef EFI_STATUS (EFIAPI *UEFI_TPM_HASH_LOG_EXTEND_EVENT) ( IN struct _UEFI_TPM_PROTOCOL *This, IN UEFI_PHYSICAL_ADDRESS HashData, IN UINT64 HashDataLen, IN TPM_ALGORITHM_ID AlgorithmId, IN OUT TPM_PCR_EVENT *TPMLogData, IN OUT UINT32 *EventNumber OUT UEFI_PHYSICAL_ADDRESS *EventLogLastEntry ); 该函数用于提供哈希以及ExtendsEvent的功能。UEFI_TPM_HASH_LOG_ EXTEND_EVENT函数参数描述见表5-9。 表5-9 UEFI_TPM_HASH_LOG_EXTEND_EVENT函数参数描述 数 据描 述 This 指向UEFI_TPM_PROTOCOL的指针 HashData 指向将要被哈希的数据缓冲区的指针 HashDataLen 将要被哈希的数据缓冲区的长度 AlgorithmId 哈希算法标识 TPMLogData 指向物理地址中包含TPM_PCR_EVENT结构起始位置的指针 EventNumber 刚被Log的Event的数目 EventLogLastEntry 指向物理地址中刚刚放置的EventLog首字节的指针 TPM EFI驱动,由TPM 厂商提供给EFIBIOS厂商。 该驱动实现的PROTOCOL的GUID定义如下。 #define EFI_TPM_TDD_PROTOCOL_GUID \ { \ 0xe5d3c9db, 0x21b1, 0x4d0f, 0x93, 0xe6, 0xb3, 0x80, 0x68, 0xef, 0x5f, 0x1b \ } 137