二进制漏洞分析-5.华为安全监控漏洞(SMC MNTN OOB 访问)
二进制漏洞分析-10.华为TrustZone TEE_SERVICE_VOICE_REC漏洞
此通报包含有关以下漏洞的信息:
CVE-2021-40023 漏洞 使用 TALoader 信息的通用 ASLR 旁路
TALoader
¶我们发现了一个影响 TALoader 二进制文件的漏洞,任何受信任的应用程序都可以利用该漏洞来泄露其基址以及与其内存映射相关的其他信息。
在加载受信任的应用程序期间,TALoader 二进制文件将使用与受信任应用程序内存映射相关的信息填充固定地址的页面。如果攻击者能够在 trustlet 的地址空间中任意读取内存,他们就可以泄露其基址,从而以通用和确定性的方式击败 ASLR。
TALoader 二进制文件调用的函数,用于将受信任的应用程序二进制文件映射到内存中。然后,将 TA 的基址传递给函数,该基址是随机的,使攻击者更难破坏 TA。e9b92e05c2ff09e8
mmap
5342f1ac85e313fa
int e9b92e05c2ff09e8(int a1, int a2, int a3, int a4) {
// [...]
ta_base_addr = mmap(0, size, 3, 0x22, 0xFFFFFFFF, offset);
if (ta_base_addr == 0xFFFFFFFF) {
std_log("ERROR", "*", 0x92A, "map failed\n");
goto MAP_FAILED;
}
// [...]
ret = 5342f1ac85e313fa(ta_base_addr, ta_size, dyn_info);
// [...]
}
该函数将在地址0x70000000处填充包含有关 TA 内存映射信息的条目。我们可以看到二进制文件的基址在偏移0x20写入其中一个条目中。5342f1ac85e313fa
int 5342f1ac85e313fa(int ta_base_addr, int ta_size, uint32_t *dyn_info) {
// [...] if (ta_base_addr == 0 || dyn_info == 0) {
std_log("ERROR", "*", 0x65, "input is invalid!");
return -1;
}
infoleak = 0x70000000;
while (*(uint64_t *)infoleak) {
infoleak += 0x28;
if (infoleak == 0x70000FF0)
return 0;
}
syment_count = *(uint32_t *)(ta_base_addr + dyn_info[DT_HASH] + 4);
symtab_addr = dyn_info[DT_SYMTAB];
if (syment_count > (ta_size - symtab_addr) >> 4) {
std_log("ERROR", "*", 0x72, "too many symbols\n");
return -1;
}
syment_size = dyn_info[DT_SYMENT];
*(uint32_t *)(infoleak + 0) = ta_base_addr + symtab_addr;
strtab_addr = dyn_info[DT_STRTAB];
strtab_size = dyn_info[DT_STRSZ];
*(uint32_t *)(infoleak + 4) = 0;
*(uint64_t *)(infoleak + 8) = syment_size * syment_count;
*(uint32_t *)(infoleak + 0x10) = ta_base_addr + strtab_addr;
*(uint32_t *)(infoleak + 0x14) = 0;
*(uint32_t *)(infoleak + 0x18) = strtab_size;
*(uint32_t *)(infoleak + 0x1C) = 0;
*(uint32_t *)(infoleak + 0x20) = ta_base_addr;
*(uint32_t *)(infoleak + 0x24) = 0;
return 0;
}
我们开发漏洞利用的设备是运行固件更新的P40 Pro。二进制文件的 MD5 校验和如下:ELS-LGRP4-OVS_11.0.0.196
$ md5 taloader.elf
MD5 (taloader.elf) = fb1fc3669eb5fd100891b30e104bfdea
根据经验并利用过去漏洞利用的知识,我们观察到引用受信任应用程序二进制文件的条目始终是第 5 个,因此 TA 基址始终位于 。0x70000000 + 4 * 0x28 + 0x20 = 0x700000c0
为了演示此漏洞,我们使用了 TA_SignTool 漏洞利用。通过使用以下代码调整此漏洞,我们将能够泄漏目标受信任应用程序的基址:
// Demonstrate the arbitrary read by dumping trustlet memory
uint32_t ta_base_addr;
signtool_read(fd, &context, 0x700000c0, 4, &ta_base_addr);
printf("ta_base_addr = %x\n", ta_base_addr);
漏洞利用输出确实显示了预期的结果:
ta_base_addr = 380d000
我们已验证该漏洞是否影响了以下设备:
麒麟990:P40 专业版 (ELS)
请注意,其他型号可能已受到影响。
名字 | 严厉 | CVE漏洞 | 补丁 |
---|---|---|---|
通用 ASLR 旁路使用 的信息TALoader | 中等 | CVE-2021-40023 漏洞 | 2022 年 9 月 |
2021年10月08日 - 向华为PSIRT发送漏洞报告。
2021年10月19日 - 华为PSIRT询问了我们的逆向工程流程(即TEE镜像和TA文件是如何解密的),以及如何绕过正常世界的内核验证与安全世界进行通信。
2021年10月19日 - 向华为PSIRT发送响应。
2021年10月25日 - 华为PSIRT确认该漏洞报告。
2022年9月1日 - 华为PSIRT表示,这些问题已在2022年9月的更新中修复。
从 2022 年 11 月 30 日至 2023 年 7 月 19 日 - 我们定期交换有关公告发布的信息。
二进制漏洞(更新中)
其它课程
windows网络安全防火墙与虚拟网卡(更新完成)
windows文件过滤(更新完成)
USB过滤(更新完成)
游戏安全(更新中)
ios逆向
windbg
恶意软件开发(更新中)
还有很多免费教程(限学员)
更多详细内容添加作者微信