仅用一个字节攻击 Titan M
字数 1621 2025-08-22 12:22:36
Titan M安全芯片漏洞分析与利用技术详解
1. Titan M安全芯片概述
Titan M是谷歌自Pixel 3起在其智能手机中引入的安全芯片,主要特性包括:
- 独立的片上系统(SoC),通过SPI总线与应用处理器通信
- 基于嵌入式控制器(EC)的轻量级开源操作系统
- 静态内存布局,无动态内存分配(无堆)
- 内存保护单元(MPU)防止同一内存区域同时具有写和执行权限
- 安全启动机制,加载固件前执行签名检查
- 仅使用堆栈canary作为基本防护,缺乏现代漏洞缓解技术
2. 漏洞发现方法
2.1 黑盒模糊测试
- 使用自定义客户端
nosclient直接与芯片通信 - 通过返回码推断芯片状态
- 使用libprotobuf-mutator变异Protobuf消息
- 对非Protobuf消息使用Radamsa生成测试用例
- 优点:设置简单,真实环境测试
- 缺点:只能检测导致崩溃的漏洞,测试覆盖有限
2.2 基于仿真的模糊测试
- 使用Unicorn仿真器引擎和AFL++框架
- 模拟执行固件指令,提供覆盖率反馈
- 自定义变异器和钩子函数
- 针对Keymaster、Identity和Weaver任务进行测试
- 挑战:
- 硬件相关函数难以模拟
- 只能检测导致仿真错误的漏洞
- 缺乏完整系统仿真
3. CVE-2022-20233漏洞分析
3.1 漏洞细节
- 影响Keymaster任务的ImportKey功能
- 类型:单字节越界写
- 触发条件:处理带有DIGEST标签(0x20005)的KeyParameter时
- 漏洞代码特征:
if (((nugget_app_keymaster_KeyParameter *)(offset + -1))->tag == 0x20005) { masked = *offset & 0xff; if ((4 < masked) || ((1 << masked & 0x15U) == 0)) { return 0x26; } *(undefined *)(buffer + *offset) = 1; // 越界写漏洞 *param_3 = *param_3 + 1; *param_4 = offset; } - 写入限制:只能写入0x01,偏移量最低有效字节限制为0x0、0x2或0x4
3.2 漏洞利用条件
- 需要能够向芯片发送任意命令(root设备或物理访问SPI总线)
- 需要访问Android文件系统上的密钥块(root或绕过文件加密)
4. 漏洞利用开发
4.1 初始利用
- 通过特定偏移(0xa204)覆盖KEYMASTER_SPI_DATA结构中的指针
- 将默认指针0x192c8改为0x101c8,导致后续请求写入错误位置
4.2 UART控制台访问
- 方法1:使用SuzyQable调试电缆
- 方法2:焊接主板上的UART引脚
- 用途:获取调试日志,验证利用进展
4.3 执行流劫持
- 发送556字节载荷后放置有效地址可跳转到任意函数
- 推测覆盖了idle任务的返回地址
4.4 ROP利用
- 内存保护机制阻止直接执行shellcode
- 利用gadget链实现堆栈转移:
sub sp, #0x20; mov r4, r0; ldr r3, [r0]; add.w r5, r4, #0x70; ldr r3, [r3, #8]; blx r3; - 多阶段ROP链:
- 多次抬升堆栈指针
- 替换Keymaster DestroyAttestationIds处理程序
- 在Keymaster堆栈上布置跳板gadget
- 最终ROP链实现内存读取
4.5 内存泄露原语
- 通过memcpy将目标内存复制到SPI响应缓冲区
- 绕过memcpy的0x0地址检查:直接跳转到复制操作的基本块
5. 攻击影响
5.1 可获取的敏感信息
- 芯片存储的所有秘密数据
- Boot ROM内容
- StrongBox保护的加密密钥
5.2 密钥泄露过程
- 从Android系统读取密钥块
- 发送包含密钥块的BeginOperation请求
- 芯片解密密钥并存储到特定内存
- 利用漏洞泄露内存中的明文密钥
5.3 实际攻击演示
- 创建StrongBox保护的AES密钥
- 使用密钥加密字符串
- 通过漏洞获取密钥并离线解密
6. 缓解措施
6.1 官方修复
- 谷歌在2022年6月Pixel安全更新中发布补丁
6.2 增强防护建议
- 使用身份验证绑定的密钥(KeyGenParameterSpec.setUserAuthenticationRequired(true))
- 密钥块使用用户密码派生的密钥进行二次加密
7. 研究总结
- 逆向工程Android与芯片通信协议
- 开发开源工具nosclient
- 通过黑盒和仿真模糊测试发现漏洞
- 利用静态内存布局等特性实现代码执行
- 突破StrongBox最高级别保护