二进制漏洞分析-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漏洞(四)
此通报包含有关以下漏洞的信息:
-
HWPSIRT-2021-67370 UnwrapKeyHandle 中的堆栈缓冲区溢出
堆栈缓冲区溢出UnwrapKeyHandle
¶
该函数解析存储在 中的 TLV 对象。完成对预期对象的解析后,如果有剩余对象,则将其存储到 type 的变量中。UnwrapKeyHandle
pKeyHandlesIn
pTags
ak_tlvs_t
cal_handle_t UnwrapKeyHandle(
createKeyHandleArgs_t *pArgs,
cal_blob_t *pTransactionContent,
cal_blob_t *pKeyHandlesIn,
ak_byte_t nKeyHandlesInNum,
ak_byte_t *usernamesin,
cal_blob_t *usernamesOut,
cal_blob_t **pKeyHandlesOut,
ak_byte_t *nKeyHandlesOutNum,
ak_tlvs_t *pTags)
{
// ...
InBLOB = pKeyHandlesIn[i];
OutBLOB.pData = 0;
OutBLOB.length = 0;
UnwrapData(&InBLOB, &OutBLOB, 0, 1);
pTemp = OutBLOB.pData;
remainingLen = OutBLOB.length;
// ...some parsing...
pTags->numTags = 0;
while (remainingLen >= 4) {
tag = &pTags->tlvs[pTags->numTags];
pTemp = AK_GetWord(tag->tag, pTemp, &remainingLen);
pTemp = AK_GetWord(tag->length, pTemp, &remainingLen);
if (!tag->tag) { /* ... */ }
if (remainingLen < tag->length) { /* ... */ }
tag->value = nnl_malloc(tag->length);
if (!tag->value) { /* ... */ }
pTemp = AK_GetBytes(tag->value, tag->length, pTemp, &remainingLen);
++pTags->numTags;
}
// ...
}
该结构可以包含固定数量 (10) 的额外对象。但是,即使对象超过 10 个,该函数也会继续存储对象,从而导致数组的缓冲区溢出。ak_tlvs_t
pTags->tlvs
struct ak_tlvs_t
{
ak_word_t numTags;
ak_tlv_t tlvs[10];
};
struct ak_tlv_t
{
ak_word_t tag;
ak_word_t length;
ak_byte_t *value;
};
该函数是从在堆栈上声明结构的函数调用的。UnwrapKeyHandle
Sign
ak_tlvs_t
ak_result_t Sign(
ak_internal_info_t *pAKInfo,
input_args_t *pInputArgs,
ak_byte_t *pResponse,
ak_word_t *pResponseLength)
{
// ...
ak_tlvs_t pKHTags;
// ...
hUauthKey = UnwrapKeyHandle(
&createKHArgs,
&pInputArgs->transactionContent,
pInputArgs->keyHandles,
pInputArgs->keyHandlesNum,
usernames,
signRespArgs.usernames,
signRespArgs.pKeyHandles,
&signRespArgs.keyHandleNum,
&pKHTags);
// ...
}
的参数完全由用户控制,来自函数。此函数将处理第一个输入缓冲区中的 TLV 对象。唯一的限制是密钥句柄小于或等于 0x200 字节。pKeyHandlesIn
UnwrapKeyHandle
ExtractInputArgs
TEE_Param
int ta_cmd_handler(
uint32_t *ibuf0_addr,
uint32_t ibuf0_size,
uint32_t *obuf3_addr,
uint32_t obuf3_size)
{
// ...
UAF_AK_Process(ibuf0_addr, request_length, khaccesstoken, obuf3_addr, &obuf3_size);
// ...
}
ak_result_t UAF_AK_Process(
int pRequest,
int requestLength,
int a3,
ak_byte_t *pResponse,
ak_word_t *pResponseLength)
{
// ...
ExtractInputArgs(pRequest, requestLength, &inputArgs);
switch (inputArgs.operationType) {
case 0x3403:
// ...
Info = Sign(&gAKInfo, &inputArgs, pResponse, pResponseLength);
break;
}
// ...
}
ak_result_t ExtractInputArgs(const ak_byte_t *pRequest, ak_word_t requestLength, input_args_t *pInputArgs) {
// ...
ptr = pRequest;
remainder = requestLength;
// ...some parsing...
while (remainder > 0) {
// ...
ptr = AK_GetTlv(&tlv, ptr, &remainder);
// ...
if (tlv.tag == 0x2801) {
if (tlv.length > 0x200) { /* ... */ }
if (pInputArgs->keyHandlesNum > 0xF) { /* ... */ }
keyHandlesNum = pInputArgs->keyHandlesNum;
pInputArgs->keyHandles[keyHandlesNum].length = tlv.length;
pInputArgs->keyHandles[keyHandlesNum].pData = tlv.value;
pInputArgs->keyHandlesNum = keyHandlesNum + 1;
}
// ...
}
// ...
}
由于的堆栈帧与我们可以溢出的大小相比太大,因此我们没有找到利用此漏洞的方法。因此,我们没有尝试触发它。Sign
受影响的设备¶
我们已验证该漏洞是否影响了以下设备:
-
麒麟990:P40 专业版 (ELS)
请注意,其他型号可能已受到影响。
补丁¶
名字 | 严厉 | CVE漏洞 | 补丁 |
---|---|---|---|
堆栈缓冲区溢出UnwrapKeyHandle |
低 | 不适用 | 固定 |
时间线¶
-
2021年12月14日 – 向华为PSIRT发送漏洞报告。
-
2022年1月12日 – 华为PSIRT确认该漏洞报告。
-
从 2022 年 11 月 30 日至 2023 年 7 月 19 日 – 我们定期交换有关公告发布的信息。
-
二进制漏洞(更新中)
-
其它课程
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
-
windows文件过滤(更新完成)
-
USB过滤(更新完成)
-
游戏安全(更新中)
-
-
ios逆向
-
windbg
-
恶意软件开发(更新中)
-
-
还有很多免费教程(限学员)
-
-
-
-
更多详细内容添加作者微信
-
-
-
原文始发于微信公众号(安全狗的自我修养):二进制漏洞分析-17.华为TrustZone Tee_Fido_Main漏洞