Skip to content

6x00 - TrustZone and TEE

TrustZone是ARM硬件辅助的安全隔离技术,将处理器分为Normal World (REE)和Secure World (TEE),是Android高价值资产保护的核心机制。

TEE漏洞的研究价值在于:

  • 高价值目标:密钥、生物识别数据、DRM机密
  • 攻击难度大但回报高:突破TEE意味着绕过最后防线
  • 厂商差异大:每家SoC的TEE实现完全不同

1. TrustZone架构

1.1 分层模型

text
┌─────────────────────────────────────────────┐
│        Normal World (REE)                    │
│  ┌──────────────────────────────────────┐   │
│  │  Android Framework & Applications    │   │
│  └──────────────────────────────────────┘   │
│  ┌──────────────────────────────────────┐   │
│  │  Linux Kernel                        │   │
│  └──────────────────────────────────────┘   │
├═════════════════════════════════════════════┤ ← Secure Monitor (EL3)
│        Secure World (TEE)                    │
│  ┌──────────────────────────────────────┐   │
│  │  Trusted Applications (TAs)          │   │
│  │  - 指纹认证 TA                        │   │
│  │  - DRM TA                            │   │
│  │  - Keymaster/KeyMint TA             │   │
│  └──────────────────────────────────────┘   │
│  ┌──────────────────────────────────────┐   │
│  │  Trusted OS (Trusty/QSEE/Teegris)   │   │
│  └──────────────────────────────────────┘   │
└─────────────────────────────────────────────┘

1.2 核心组件

Secure Monitor (EL3)

  • 世界切换的看门人
  • 响应SMC (Secure Monitor Call)指令
  • 保护TEE免受REE直接访问

Trusted OS

  • Trusty (Google开源,Pixel等设备)
  • QSEE (Qualcomm Secure Execution Environment)
  • Teegris (三星)
  • OP-TEE (开源实现)

Trusted Application (TA / Trustlet)

  • 运行在TEE内的应用逻辑
  • 每个敏感功能一个独立TA

1.3 通信机制

REE → TEE调用流程

text
1. REE应用/服务调用Client API
2. 通过特殊驱动(/dev/trusty等)发起请求
3. 触发SMC指令进入EL3
4. Secure Monitor切换到Secure World
5. Trusted OS调度对应TA
6. TA执行并返回结果
7. 切换回Normal World

共享内存

  • REE与TEE通过共享内存传递大数据
  • 需严格校验边界与权限

2. 历史重大TEE漏洞

2.1 Qualcomm QSEE漏洞

根因:QSEE Widevine TA命令处理缺陷

c
// Widevine TA伪代码
int handle_command(uint32_t cmd_id, void *req, size_t req_len) {
    if (cmd_id == CMD_LOAD_KEY) {
        // ❌ 未校验req_len
        memcpy(key_buffer, req, req_len);  // 缓冲区溢出
    }
}

影响

  • Widevine L1密钥泄露
  • TEE内存破坏
  • 可能实现TEE代码执行

根因:QSEE内核驱动与TA通信的验证不足

攻击链

text
恶意REE应用 → 构造恶意共享内存
→ QSEE驱动未充分验证
→ TEE内存破坏
→ 控制TA执行流
→ 导出密钥/绕过认证

位置:Keymaster TA命令处理

根因:整数溢出导致堆溢出

c
// 简化的漏洞代码
uint32_t num_params;  // 来自REE
size_t total_size = num_params * sizeof(param_t);  // 整数溢出

void *buffer = malloc(total_size);  // 分配过小
// 后续拷贝导致堆溢出

影响

  • 硬件支持的密钥可能被导出
  • 设备认证(Attestation)可被伪造

2.2 Samsung Teegris漏洫

根因:Teegris内核内存管理漏洞

影响

  • TEE内核代码执行
  • 影响Samsung Galaxy S10/S20等旗舰机
  • 可绕过Knox安全

位置:指纹识别TA

触发:构造畸形指纹模板数据

影响

  • 指纹认证绕过
  • 可能泄露已注册指纹数据

2.3 Google Trusty漏洞

位置:Trusty IPC消息处理

根因

c
// Trusty IPC handle释放后使用
struct ipc_port *port = get_port(port_id);
if (!port) return ERR_NOT_FOUND;

// ❌ 异步操作中port可能被释放
async_send_msg(port, msg);  // UAF

影响

  • Trusty内核内存破坏
  • 可能实现TEE RCE

根因:Gatekeeper TA整数溢出

触发:构造特殊的密码验证请求

影响

  • 锁屏密码验证绕过
  • Pixel 3/4受影响

2.4 OP-TEE开源实现漏洞

根因:TA加载过程中内存管理错误

位置:ELF loader

影响:加载恶意TA可导致TEE代码执行

2.5 厂商特有问题

联发科TrustZone

华为可信执行环境

3. 攻击面分析

3.1 REE → TEE接口

高危命令类型

  • 内存分配/释放相关
  • 加载/卸载TA
  • 密钥导入/导出
  • 认证相关操作

典型问题

c
// 危险模式1: 信任REE提供的长度
void tee_handle_command(uint32_t cmd_id, 
                       void *shared_mem, 
                       size_t len) {
    // ❌ len来自不可信的REE
    char local_buf[256];
    memcpy(local_buf, shared_mem, len);  // 栈溢出
}

// 危险模式2: 未验证共享内存边界
void tee_process_buffer(struct shared_buf *buf) {
    // ❌ 未检查buf->offset + buf->size
    void *data = buf->base + buf->offset;
    process(data, buf->size);  // 可能越界
}

// 危险模式3: TOCTOU竞态
int tee_verify_and_use(struct request *req) {
    if (req->magic == MAGIC) {  // Check
        // ⏱️ REE可在此期间修改req->magic
        use_request(req);  // Use - 可能绕过检查
    }
}

3.2 TA间通信

风险

  • 不同TA间的IPC
  • 共享资源访问
  • 权限混淆

典型场景

  • 低权限TA调用高权限TA
  • TA间共享内存管理错误

3.3 硬件交互

敏感硬件访问

  • 指纹传感器
  • 安全密钥存储(efuse)
  • 加密引擎
  • 随机数生成器

问题

  • TA访问硬件时的权限检查
  • 硬件返回数据的验证

4. 漏洞挖掘方法

4.1 静态分析

获取TA二进制

bash
# Trusty TA位置
adb pull /vendor/firmware/
adb pull /vendor/app/mcRegistry/  # (某些设备)

# QSEE TA位置
adb pull /firmware/image/
adb pull /vendor/firmware/

# 查找.mdt/.mbn文件(QSEE格式)
find . -name "*.mdt" -o -name "*.mbn"

逆向分析

bash
# 使用IDA Pro/Ghidra
# QSEE TA通常是ELF格式
file widevine.mdt

# Trusty TA是自定义格式
# 需要专用工具解析

审计重点

  • 命令处理函数(command dispatcher)
  • 内存拷贝操作(memcpy/memmove/strcpy)
  • 整数运算(size计算)
  • 指针解引用

4.2 动态测试

模糊测试策略

c
// REE侧fuzzer示例
#include <trusty/tipc.h>

void fuzz_trusty_ta() {
    int fd = tipc_connect("/dev/trusty-ipc-dev0", "com.android.trusty.keymaster");
    
    for (int i = 0; i < 100000; i++) {
        struct keymaster_message msg;
        msg.cmd = rand() % 256;
        msg.payload_len = rand() % 4096;
        
        // 随机填充payload
        fill_random(msg.payload, msg.payload_len);
        
        tipc_send(fd, &msg, sizeof(msg));
        tipc_recv(fd, &response, sizeof(response));
    }
}

监控崩溃

bash
# Trusty崩溃日志
adb logcat | grep -i "trusty\|trust\|panic"

# QSEE崩溃日志(需要特殊方法获取)
# 通常需要JTAG或特殊固件

4.3 侧信道攻击

缓存侧信道

  • 利用CPU缓存行为推测TEE执行流
  • Flush+Reload / Prime+Probe技术

功耗分析

  • 通过功耗特征推测密钥操作

时序攻击

  • 通过响应时间差异推测内部状态

5. 利用技术

5.1 共享内存利用

Double Fetch漏洞

c
// TEE侧代码
struct request *req = (struct request *)shared_mem;

// 第一次读取(检查)
if (req->size > MAX_SIZE) {
    return ERR_INVALID;
}

// ⏱️ REE在这里修改req->size

// 第二次读取(使用)
memcpy(local_buf, req->data, req->size);  // 越界

利用方法

  • REE侧多线程持续修改共享内存
  • 竞态窗口内改变关键字段

5.2 堆风水(Heap Feng Shui)

目标:控制TEE堆布局

步骤

  1. 喷射大量对象占据堆空间
  2. 触发漏洞释放目标对象
  3. 分配可控对象占据释放空间
  4. 利用UAF/OOB影响可控对象

5.3 ROP in TEE

挑战

  • TEE二进制通常启用ASLR
  • 需要信息泄露
  • gadget数量有限

绕过方法

  • 利用TA加载地址泄露
  • 利用错误消息泄露地址

6. 防御建议

6.1 TA开发安全实践

输入验证

c
// ✅ 安全的命令处理
int ta_handle_command(uint32_t cmd_id,
                     struct shared_mem *smem) {
    // 1. 验证共享内存指针
    if (!is_valid_shared_mem(smem)) {
        return ERR_INVALID_PTR;
    }
    
    // 2. 验证命令ID范围
    if (cmd_id >= CMD_MAX) {
        return ERR_INVALID_CMD;
    }
    
    // 3. 验证长度字段
    if (smem->len > MAX_BUFFER_SIZE ||
        smem->offset + smem->len < smem->offset) {
        return ERR_INVALID_SIZE;
    }
    
    // 4. 拷贝到本地缓冲区(防止TOCTOU)
    char local_buf[MAX_SIZE];
    memcpy(local_buf, smem->base + smem->offset, smem->len);
    
    // 5. 基于本地副本处理
    return process_command(cmd_id, local_buf, smem->len);
}

避免TOCTOU

  • 将共享内存数据拷贝到TA本地
  • 基于本地副本做所有检查和处理

最小权限

  • 每个TA只访问必要的硬件资源
  • 限制TA间通信权限

6.2 平台加固

ATF (ARM Trusted Firmware)

  • 现代ARM设备使用ATF实现Secure Monitor
  • 提供标准化的安全服务接口

TA签名验证

  • 仅加载经过签名的TA
  • 验证TA完整性

内存隔离

  • 不同TA运行在隔离的内存空间
  • 防止TA间互相攻击

7. 研究价值评估

持续高价值

  • Keymaster/KeyMint TA - 密钥管理核心
  • Gatekeeper/Weaver TA - 认证与密码验证
  • DRM TA (Widevine) - 内容保护
  • 指纹/人脸识别TA - 生物识别

中等价值

  • ⚠️ Trusted OS内核 - 需要更深入的利用链
  • ⚠️ 厂商特有TA - 影响范围有限

价值下降

  • 已被移除的老旧TA - 新设备不再使用

参考资源

AOSP官方

开源实现

研究资源