当前位置: 首页 > news >正文

TPM之VMK密封

本篇文章主要介绍基于TPM的Bitlocker全盘加密时,VMK密钥的密封(Seal)流程,至于TPM、Bitlocker、密钥保护器、VMK密钥等这些东西是什么,这里不做解释,需要自己脑补一下(╮(╯▽╰)╭)。

首先看看一张结构图(来自网络),了解一下TPM加密的基本框架与流程:

04a5ce19a1a946c2bfbee76d6281f543.jpeg

同样,基于TPM的安全启动链也不做过多解释,简单说就是当电脑通过TPM进行全盘加密后,后期对电脑的改动影响系统启动,PCR校验不通过时,触发输入恢复密钥的“蓝屏”。

2005b1517d7f4612bed1831b5f8c915f.png

 在Windows中,用户层与内核层的交互通常使用DeviceIOControl这个API来进行。同样的,具备TPM芯片的电脑,在系统中存在一个\Device\TPM的设备以及对应的TPM驱动程序,所以,当对系统进行基于TPM芯片的Bitlocker加密时,存在DeviceIOControl的交互,下面通过抓包来窥探这一过程。

“工欲善其事,必先利其器”,这里介绍一个抓包工具IRPMon,获取不到的你可能需要一个“梯子”。

IRPMon安装完成后,打开软件,在菜单项中选择“Action”->“Select drivers / devices...”,随后弹出“Hook Drivers and Devices”对话框,在该对话框的右侧树形控件中,下拉寻找“\Driver\TPM”项,如下图所示,右击“\Driver\TPM”项,在右键菜单中选择“Hooked”,同时选中“Data”选项,这样在随后的抓包中才能看到抓包的数据内容。

右键菜单项 

f45f1e29eb744c03b4a45ad61ac4b063.jpeg

最终配置 

启用基于TPM的Bitlocker加密,之后便可以抓到一堆IRP通信的数据包,可以对抓取到的数据包做一些过滤,仅保留感兴趣的数据。

c7a75839917a4b7399b555eb93de7362.jpeg

设置过滤条件 

3bf2df0f7561407f84107b715d42ee5e.jpeg

过滤后的数据详情 

直接通过IRPMon查看抓取的数据比较麻烦,这里通过导出抓取的数据,在编辑器gvim中查看。同时,IRPMon支持自己开发插件来解析抓取的数据,如果有时间的话,可以自己开发一个插件,用来解析TPM的数据包。

在菜单项中,选择“Action” -> “Save..”,在弹出的对话框中选择文件格式为“JSON Array [*.json]”格式,最后将其按json格式保存到文件。

通过分析保存的json格式的文件,分析时,只关注“Major Function”的值为“DeviceIOControl”的数据包,并且“Data0”的数据为“0201”或“0202”开头的数据包。在追踪完一些文件句柄以及句柄关联的数据后,最终确定该句柄(0xFFFFAF0BB990187B0)就是密封VMK密钥时,与TPM设备通信的文件句柄。

9233d89027284cbabc69014fa1d50b80.png

 图中的Data0字段后的十六进制值是发送到TPM的数据包,可以通过在线工具tpmstream对Data0的数据进行翻译,转换为按TPM协议结构方式展示(这里需要将“0201”或“0202”修改为“8001”或“8002”才能正确展示),TPM通过协议可以参考这里和这里。

c3c827c7accf4cada30d917911b82802.png

 通过对整个会话数据包的分析,得到与TPM交互的如下VMK密封创建过程,最后的TPM_CC_Create交互包含VMK明文密钥以及加密后的信息,存储在FVE metadata结构中。

7756f6bd8530444897ba8a07a2c942c1.png

PCR校验位图解释如下

fa95cbb095f64ee29f7b73ea96d628a0.png

这里的预期的Hash值计算公式如下

预期Hash = Hash(PCR0 || PCR2 || PCR4 || PCR11)

5002d969d01c45b1b15bb7304baf1279.jpeg

这里的PCR11之所以设定为0,来自微软的解释。

9fb8978b14914ddb94512fbe58cef669.png

随后,该预期Hash值存储在加密后的磁盘上,位于FVE metadata中,解封VMK密钥时用到此值

4bacc2adc5ff4721a6efec2862593f0f.jpeg

下图是执行TPM的TPM_CC_Create命令时包含的即将密封的VMK密钥

通过该VMK密钥,可实现提取TPM加密磁盘的恢复密钥,这里通过我开发的恢复密钥提取工具实现

下图为TPM_CC_Create命令执行后的Response结果,其中的一些数据最后保存在加密磁盘的FVE metadata数据中,在解封时用于解密VMK密钥

TPM_CC_Create命令返回的Response部分数据 

Response中数据存储在磁盘中的FVE 

http://www.lryc.cn/news/360079.html

相关文章:

  • Fastjson 反序列化漏洞[1.2.24-rce]
  • 【面试宝藏】Go基础面试题其一
  • python如何安装pyqt4
  • 调用上传文件接口出现格式错误
  • leetcode148. 排序链表,归并法,分治的集大成之作
  • 一维时间序列信号的小波模极大值分解与重建(matlab R2018A)
  • 五分钟“手撕”栈
  • MAC也能玩转3A大作 Crossover使用指南 crossover运行战地5
  • docker私有镜像仓库的搭建及认证
  • simCSE句子向量表示(1)-使用transformers API
  • 网络运维的重要性
  • 还不会使用多线程优化代码执行效率?codefun教你在业务场景中使用CompletableFuture进行优化!
  • 数据结构-堆(带图)详解
  • React Native 之 react-native-share(分享)库 (二十三)
  • JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测
  • 游戏心理学Day01
  • 错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。
  • 005 CentOS 7.9 RabbitMQ安装及配置
  • Xcode 15 libarclite 缺失问题
  • 绘画智能体分享
  • 7_2、C++程序设计进阶:数据共享
  • d2-crud-plus 使用小技巧(五)—— 搜索时间(或下拉列表)后,点击X清除按钮后返回值为null,导致异常
  • ChatGPT成知名度最高生成式AI产品,使用频率却不高
  • R19 NR移动性增强概况
  • C语言:如何写文档注释、内嵌注释、行块注释?
  • Turtle中circle用法详解
  • stack和queue(1)
  • 前端3剑客(第1篇)-初识HTML
  • 植被变化趋势线性回归以及可视化
  • 大话设计模式学习笔记