二进制漏洞分析-1.华为Security Hypervisor漏洞
二进制漏洞分析-2.揭示华为安全管理程序(上)
二进制漏洞分析-3.揭示华为安全管理程序(下)
二进制漏洞分析-4.华为安全监控漏洞(SMC SE 工厂检查 OOB 访问)
二进制漏洞分析-5.华为安全监控漏洞(SMC MNTN OOB 访问)
二进制漏洞分析-6.Parallels Desktop Toolgate 漏洞
二进制漏洞分析-7.华为TrustZone Vsim_Sw漏洞
二进制漏洞分析-8.Huawei TrustZone VprTa漏洞
二进制漏洞分析-9.华为TrustZone TEE_Weaver漏洞
二进制漏洞分析-10.华为TrustZone TEE_SERVICE_VOICE_REC漏洞
二进制漏洞分析-11.华为TrustZone TEE_SERVICE_MULTIDRM漏洞(上)
二进制漏洞分析-12.华为TrustZone TEE_SERVICE_MULTIDRM漏洞(下)
二进制漏洞分析-13.华为TrustZone TEE_SERVICE_FACE_REC漏洞(一)
二进制漏洞分析-14.华为TrustZone TEE_SERVICE_FACE_REC漏洞(二)
二进制漏洞分析-15.华为TrustZone TEE_SERVICE_FACE_REC漏洞(三)
二进制漏洞分析-16.华为TrustZone TEE_SERVICE_FACE_REC漏洞(四)
二进制漏洞分析-17.华为TrustZone Tee_Fido_Main漏洞
二进制漏洞分析-18.华为TrustZone TEE_EID漏洞
二进制漏洞分析-20.TrustZone Task_Phone_Novelchd漏洞(上)
二进制漏洞分析-20.TrustZone Task_Phone_Novelchd漏洞(下)
此通报包含有关以下漏洞的信息:
-
CVE-2021-40023 漏洞 使用 TALoader 信息的通用 ASLR 旁路
通用 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 failedn");
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 symbolsn");
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
ALSR 滑轨泄漏¶
根据经验并利用过去漏洞利用的知识,我们观察到引用受信任应用程序二进制文件的条目始终是第 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 = %xn", 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 日 - 我们定期交换有关公告发布的信息。
-
原文始发于微信公众号(安全狗的自我修养):二进制漏洞分析-21.华为TrustZone TALoader信息泄露
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论