Trusty TEE (可信执行环境) 通过IPC (进程间通信) 接口与Rich OS (如Android) 进行通信,这些接口是潜在的攻击面。
攻击者可能发送超长消息或精心构造的畸形数据,试图触发缓冲区溢出漏洞。
不当的整数处理可能导致内存分配错误或边界检查绕过。
消息解析时类型处理不当可能导致内存破坏或信息泄露。
| Fuzz策略 | 描述 | 工具示例 |
|---|---|---|
| 基于变异的Fuzz | 对正常IPC消息进行随机变异 | AFL, libFuzzer |
| 基于生成的Fuzz | 根据协议规范生成测试用例 | Peach Fuzzer |
| 覆盖引导的Fuzz | 使用代码覆盖率反馈优化测试 | AFL++, Honggfuzz |
// 安全的IPC消息处理示例
int handle_ipc_message(const struct ipc_msg* msg) {
// 1. 验证消息头
if (msg == NULL || msg->header.magic != IPC_MAGIC) {
return ERR_INVALID_ARGS;
}
// 2. 验证消息长度
if (msg->header.length > MAX_IPC_MSG_SIZE) {
return ERR_MSG_TOO_LONG;
}
// 3. 验证消息类型
if (msg->header.type >= MAX_MSG_TYPE) {
return ERR_INVALID_MSG_TYPE;
}
// 4. 处理消息内容
switch (msg->header.type) {
case MSG_TYPE_A:
return handle_type_a(msg);
// ...
default:
return ERR_UNKNOWN_MSG_TYPE;
}
}
Trusty TEE中处理敏感数据(如加密密钥)时,可能通过以下侧信道泄露信息:
分支条件不应依赖秘密数据
数组索引不应依赖秘密数据
选择/复制/比较操作应恒定时间
int unsafe_memcmp(const void* s1, const void* s2, size_t n) {
const unsigned char* p1 = s1;
const unsigned char* p2 = s2;
for (size_t i = 0; i < n; i++) {
if (p1[i] != p2[i]) {
return 1; // 提前返回
}
}
return 0;
}
int constant_time_memcmp(const void* s1, const void* s2, size_t n) {
const unsigned char* p1 = s1;
const unsigned char* p2 = s2;
int result = 0;
for (size_t i = 0; i < n; i++) {
result |= p1[i] ^ p2[i]; // 累积差异
}
return ((result - 1) >> 8) & 1; // 恒定时间返回
}
| 防御措施 | 实现方式 | 适用场景 |
|---|---|---|
| 恒定时间算法 | 加解密、比较、选择操作 | 密码学操作 |
| 内存访问模式隐藏 | 预加载数据到缓存 | 查表操作 |
| 随机化执行顺序 | 操作顺序随机排列 | 并行处理 |