DRTM动态度量信任根的POC概念验证
安全之安全(security²)博客目录导读
目录
一、组件说明
二、为Arm FVP平台构建PoC
动态度量信任根(DRTM) 通过度量并执行受保护的负载,启动一个新的可信执行环境。
目前由 TF-A 使用的 静态度量信任根(SRTM)/度量引导(Measured Boot) 实现,会覆盖所有固件,从启动 ROM 一直到非安全世界的引导加载程序(bootloader)。作为一个整体,它们构成了系统的 TCB(可信计算基)。这些启动过程的度量可以用于证明系统上正在运行的软件,并用于强制执行安全策略。
然而,随着启动链变长或固件变得可动态扩展,构建一个可证明的 TCB 变得更加困难。DRTM 提供了解决方案:它允许在任意时刻启动一条新的度量链。由于这些度量是与启动时度量分离存储的,它们可以缩小 TCB 的范围,从而减少攻击面和不可信代码执行的风险,以防系统安全被破坏。
一、组件说明
-
DCE-Preamble(DCE 前导程序):
DCE-Preamble 准备平台以支持 DRTM,包括必要的配置、加载目标负载镜像(DLME),并准备 DRTM 所需的输入参数。最后,它通过触发 DL 事件来启动动态加载过程。 -
D-CRTM(动态信任根):
D-CRTM 是 DRTM 启动序列的信任锚(即信任根),动态启动从这里开始。D-CRTM 必须作为系统中的可信代理实现。它初始化用于 DRTM 的 TPM,准备执行下一阶段的 DRTM,即 DCE。D-CRTM 会对 DCE 进行度量、验证其签名,并将控制权移交给 DCE。 -
DCE(动态配置执行环境):
DCE 在应用处理器核上执行。它会验证系统状态,对系统的关键安全属性进行度量,准备目标负载的内存区域,对该负载进行度量,并最终将控制权移交给负载。 -
DLME(动态加载的度量环境):
受保护的负载被称为 DLME(Dynamically Launched Measured Environment)。DLME 在一个安全状态下启动,具有单线程执行、DMA 保护及中断禁用等特性。DCE 向 DLME 提供系统配置信息,供其自我验证使用。
在此概念验证中:
-
DCE 与 D-CRTM 实现在 BL31
-
DCE-Preamble 与 DLME 实现在 UEFI 应用
-
DCE-Preamble 通过 SMC(安全监控调用) 触发一个 DL 事件,由 D-CRTM 处理,进而通过 DCE 启动 DLME。
该手册提供了如何使用预构建的 EDK2 和 DRTM UEFI 应用构建 TF-A 代码的相关指南。
二、为Arm FVP平台构建PoC
1、使用下面的命令克隆TF-A源代码
git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
2、在prebuilts-drtm-bins中有执行DRTM实现所需的预构建二进制文件。下载EDK2 FVP_AARCH64_EFI.fd和UEFI DRTM应用程序test-disk.img。从prebuilts-drtm-bins中获取二进制文件。
3、使用下面的命令构建TF-A代码
$ make CROSS_COMPILE=aarch64-none-elf- ARM_ROTPK_LOCATION=devel_rsaDEBUG=1 V=1 BL33=</path/to/FVP_AARCH64_EFI.fd> DRTM_SUPPORT=1MBEDTLS_DIR=</path/to/mbedTLS-source> USE_ROMLIB=1 all fip
三、在Armv8-A AEM FVP上运行DRTM UEFI应用程序
为了在BL31中运行DRTM测试应用程序和DRTM实现,您需要一个FVP模型。请使用TF-A文档中宣传的FVP_Base_RevC-2xAEMvA模型的版本。
FVP_Base_RevC-2xAEMvA \
--data cluster0.cpu0=</path/to/romlib.bin>@0x03ff2000 \
--stat \
-C bp.flashloader0.fname=<path/to/fip.bin> \
-C bp.secureflashloader.fname=<path/to/bl1.bin> \
-C bp.ve_sysregs.exit_on_shutdown=1 \
-C bp.virtioblockdevice.image_path=<path/to/test-disk.img> \
-C cache_state_modelled=1 \
-C cluster0.check_memory_attributes=0 \
-C cluster0.cpu0.etm-present=0 \
-C cluster0.cpu1.etm-present=0 \
-C cluster0.cpu2.etm-present=0 \
-C cluster0.cpu3.etm-present=0 \
-C cluster0.stage12_tlb_size=1024 \
-C cluster1.check_memory_attributes=0 \
-C cluster1.cpu0.etm-present=0 \
-C cluster1.cpu1.etm-present=0 \
-C cluster1.cpu2.etm-present=0 \
-C cluster1.cpu3.etm-present=0 \
-C cluster1.stage12_tlb_size=1024 \
-C pctl.startup=0.0.0.0 \
-Q 1000 \
"$@"
来自uart1的输出的底部应该如下所示,表示最后一个取消内存保护的SMC已成功触发。
...INFO: DRTM service handler: version
INFO: ++ DRTM service handler: TPM features
INFO: ++ DRTM service handler: Min. mem. requirement features
INFO: ++ DRTM service handler: DMA protection features
INFO: ++ DRTM service handler: Boot PE ID features
INFO: ++ DRTM service handler: TCB-hashes features
INFO: DRTM service handler: dynamic launch
WARNING: DRTM service handler: close locality is not supported
INFO: DRTM service handler: unprotect mem