基于静态可信根(SRTM)的Bitlocker的工作原理是什么? 2021-10-08 操作系统 暂无评论 2502 次阅读 ![SRTM-01.jpg](https://blog.moper.net/usr/uploads/2021/10/2029836732.jpg) 前文介绍了bitlocker的大致工作流程: 老狼:Bitlocker、TPM和系统安全 大家应该了解了Windows上保证系统数据安全的Bitlocker的大致原理。本文将深入探讨它背后的工作原理:基于静态可信根(SRTM,Static Root of Trust for Measurements)的静态信任链(static chain of trust)是如何建立起来的。 #TPM和平台配置寄存器PCR 静态信任链的建立离不开TPM和其中的平台配置寄存器:PCR。那么什么是TPM和PCR呢? TPM(Trusted Platform Module,可信平台模块)是根据国际行业标准组织可信计算组(TCG,其中包括微软、英特尔和惠普等公司)规范制作的模块,可以是dTPM真实硬件也可以是fTPM等由固件模拟的软件模块。TPM 1.2最早大规模商用,现在TPM2.0也开始广泛使用了。 ![SRTM-02.jpg](https://blog.moper.net/usr/uploads/2021/10/3998015191.jpg) 基于LPC接口的TPM 1.2模块 TPM的主要作用是利用安全的经过验证的加密密钥带来强大的设备安全性。TPM功能的核心是签注密钥,这是在生产过程中内置到TPM硬件的加密密钥。这个签注密钥的私钥部分绝不会出现在TPM外部或暴露给其他组件、软件、程序或个人。另一个关键密钥是存储根密钥,该密钥也存储在TPM内;它被用来保护其他应用程序创建的TPM密钥,使这些密钥只能由TPM通过被称为绑定的过程来解密,TPM也是通过该过程锁定数据到设备。与签注密钥不同,只有当TPM设备第一次被初始化或新用户获得所有权时,存储根密钥才会被创建。 TPM的接口最开始是LPC接口,随着LPC接口的淘汰,现在越来越多的TPM 2.0模块采用速度更快的SPI总线来和南桥芯片通讯。 平台状态寄存器(PCR)是用来记录系统运行状态的寄存器,TCG规范要求实现的一组寄存器,至少有16个(TCG 1.1规范),每个20个字节;TCG 1.2规范中引进了8个额外的平台状态寄存器用于实现动态可信根(DRTM);在TPM 2.0之后,引入了多bank的概念。 PCR是TPM的核心器件,为了防止PCR值被恶意代码随便篡改或伪造,TPM限制对平台状态寄存器的操作,不能像普通寄存器那样通过MMIO来随意进行读写操作,平台状态寄存器位于TPM内部,其内部数据受到TPM的保护。对PCR内容的读取是不受限制的,但对其写入只有一种,那就是Extend。Extend操作大致如下: ``` New PCR value = SHA-1 hash (Current PCR value || new SHA-1 hash) ``` 也就是在原有的20字节PCR后面加上新Hash的SHA-1的值,组成40个字节,然后再对这40个字节进行SHA-1的Hash,再次得到新的20个字节的PCR。 这个Extend操作全部由TPM芯片完成,外部只能提供新的SHA-1的值。扩展操作是不可逆的,即先扩展度量值A再扩展度量值B所得到的PCR值跟先扩展B再扩展A的结果是不同的。而且知道了新的PCR的值和老的PCR的值,也不能倒推出新的SHA-1的值。 通过扩展,PCR能够记录一个无限长的度量值序列,这一系列度量值组成的序列反应了系统状态的变迁 ,这个扩展序列中的某一个度量值被改变了,之后的度量序列都会受到影响。虽然理论上来说,一个PCR维护的度量序列就能够记录整个平台的状态值,但实际应用中,PCR被TCG定义为多个寄存器组,并且越来越多。每个寄存器都被赋予不同的度量对象: ![SRTM-03.jpg](https://blog.moper.net/usr/uploads/2021/10/1539592107.jpg) 有很多工具可以方便的Dump PCR的内容,我推荐参考资料1中的开源UEFI工具。在UEFI Shell下Dump一个典型的TPM 2.0的PCR结果如下: ![SRTM-04.jpg](https://blog.moper.net/usr/uploads/2021/10/3497926494.jpg) PCR的内容在reset的时候会被清空。PCR 0~7是被支持TPM的BIOS根据TCG标准,Hash 不同的内容Extend的结果,PCR 8~16为空是因为在Shell下这些OS bootloader和OS需要填写的内容还没有生成。而PCR 17~22为FF是因为Shell没有权限读取动态信任跟DRTM才能读取的PCR。 #静态信任链(static chain of trust)的建立 有了PCR的帮忙,我们就可以开始建立静态信任链。所谓静态,是因为它需要一个核心信任根(CRTM)。这个CRTM是先验的可以信任的基础,有了它,整个信任链条才可以建立。CRTM开始的时候,被设定是UEFI BIOS的PEI阶段的FV,认为它是不会被修改的,它是可信的。但是因为对BIOS的攻击越来越多,甚至包括物理攻击,即用BIOS工程师常用的烧写工具直接烧写BIOS,这对直接使用PEI作为CRTM提出了挑战。于是CRTM被前置到Boot Guard ACM中,关于Boot Guard不在本文的范围内,我们今后再讲,这里权且相信它的安全性。有了CRTM的安全,下面的链条就可以建立起来了: ![SRTM-05.jpg](https://blog.moper.net/usr/uploads/2021/10/1140548579.jpg) 由CRTM mearsure BIOS PEI FV的hash值,并且extend到PCR中;PEI再Hash后面的阶段,extend到PCR中,如此往复,直到OS最后阶段来检查PCR的值和预设值是否相同,来判断整个平台的状态和预设的状态是否一致。Bitlocker在开启后会记录下当时的PCR的内容,以后reboot后通过检查PCR和记录值是否一致来判断是否被入侵过。这一切都建立在PCR的特性上: 1. 只能Extend 2. 顺序相关 3. 不可逆和不可倒退 #结论 Bitlocker不仅仅使用了PCR还用了TPM的另一个功能,key的管理: ![SRTM-06.jpg](https://blog.moper.net/usr/uploads/2021/10/2675007127.jpg) SRK和PVEK的关系我们下节介绍。同时和SRTM相关的DRTM,也就是大名鼎鼎的可信执行技术(Trusted Execute Technology,TXT),它和SRTM的关系如下: ![SRTM-07.jpg](https://blog.moper.net/usr/uploads/2021/10/46274373.jpg) 它的详细内容因为篇幅的原因,也只能另文介绍了。 参考资料: UEFI Utility to Read TPM 2.0 PCRs https://blog.fpmurphy.com/2017/03/uefi-utility-to-read-tpm-2-0-pcrs.html 转自https://zhuanlan.zhihu.com/p/33858479 标签: Bitlocker, SRTM 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。