二进制漏洞分析-5.华为安全监控漏洞(SMC MNTN OOB 访问)
二进制漏洞分析-10.华为TrustZone TEE_SERVICE_VOICE_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
恶意软件开发(更新中)
还有很多免费教程(限学员)
更多详细内容添加作者微信