仅用一个字节攻击 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链:
    1. 多次抬升堆栈指针
    2. 替换Keymaster DestroyAttestationIds处理程序
    3. 在Keymaster堆栈上布置跳板gadget
    4. 最终ROP链实现内存读取

4.5 内存泄露原语

  • 通过memcpy将目标内存复制到SPI响应缓冲区
  • 绕过memcpy的0x0地址检查:直接跳转到复制操作的基本块

5. 攻击影响

5.1 可获取的敏感信息

  • 芯片存储的所有秘密数据
  • Boot ROM内容
  • StrongBox保护的加密密钥

5.2 密钥泄露过程

  1. 从Android系统读取密钥块
  2. 发送包含密钥块的BeginOperation请求
  3. 芯片解密密钥并存储到特定内存
  4. 利用漏洞泄露内存中的明文密钥

5.3 实际攻击演示

  • 创建StrongBox保护的AES密钥
  • 使用密钥加密字符串
  • 通过漏洞获取密钥并离线解密

6. 缓解措施

6.1 官方修复

  • 谷歌在2022年6月Pixel安全更新中发布补丁

6.2 增强防护建议

  • 使用身份验证绑定的密钥(KeyGenParameterSpec.setUserAuthenticationRequired(true))
  • 密钥块使用用户密码派生的密钥进行二次加密

7. 研究总结

  • 逆向工程Android与芯片通信协议
  • 开发开源工具nosclient
  • 通过黑盒和仿真模糊测试发现漏洞
  • 利用静态内存布局等特性实现代码执行
  • 突破StrongBox最高级别保护
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时 漏洞代码特征: 写入限制:只能写入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链实现堆栈转移: 多阶段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最高级别保护