二进制漏洞分析-17.华为TrustZone Tee_Fido_Main漏洞
2023-12-5 08:22:32 Author: 安全狗的自我修养(查看原文) 阅读量:14 收藏

 

二进制漏洞分析-5.华为安全监控漏洞(SMC MNTN OOB 访问)

二进制漏洞分析-10.华为TrustZone TEE_SERVICE_VOICE_REC漏洞

此通报包含有关以下漏洞的信息:

  • HWPSIRT-2021-67370 UnwrapKeyHandle 中的堆栈缓冲区溢出

堆栈缓冲区溢出UnwrapKeyHandle

该函数解析存储在 中的 TLV 对象。完成对预期对象的解析后,如果有剩余对象,则将其存储到 type 的变量中。UnwrapKeyHandlepKeyHandlesInpTagsak_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_tpTags->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;
};

该函数是从在堆栈上声明结构的函数调用的。UnwrapKeyHandleSignak_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 字节。pKeyHandlesInUnwrapKeyHandleExtractInputArgsTEE_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

  • 恶意软件开发(更新中)

  • 还有很多免费教程(限学员)

  • 更多详细内容添加作者微信


文章来源: http://mp.weixin.qq.com/s?__biz=MzkwOTE5MDY5NA==&mid=2247490334&idx=1&sn=97ded74f9d5ea40b98b355bbfdd4e833&chksm=c13f2857f648a14172c800cdedff9dd790f8e417b903dd07c1fba95fca583e6d5304e50c6ad7&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh