qualcomm: https://www.qualcomm.com/company/product-security/bulletins/october-2020-security-bulletin
google: https://source.android.com/security/bulletin/2020-10-01
0x00 CVE-2020-11125
发生位置:
mhi_main.c的mhi_process_data_event_ring()函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=146e6bb29827f0d3d1fb05ed980400bb53af13c2
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=5e62fe09e56dd7dca54335ca8d4eb2be5c62cc37
触发方法:
对mhi_tre结构体中的dword[1]进行伪造,大于mhi_cntrl的max_chan时就会出现越界读取。
漏洞成因:
由MHI_TRE_GET_EV_CHID可知,chan的范围为0~255,但是max_chan是由驱动控制的最大支持通道数量,一般小于255,所以当MHI_TRE_GET_EV_CHID拿到的chan大于max_chan时会出现越界访问。
修复方法:
第一个链接增加了chan和max_chan的判断,第二个则避免了chan和max_chan的判断导致的while死循环。
时间:
2018-06-05至2020-03-31
是什么:
调制解调器驱动接口(MHI)
0x01 CVE-2020-11162
发生位置:
mhi_main.c的parse_rsc_event()函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=d37bbae685207dbc67f31bc7f4ad0c6a7545abcf
触发方法:
使用恶意的MHI 设备,发送EOT事件,同时设置其对应的event结构体的dword[0]字段为0xffff,会导致mhi_result的bytes_xferd被设置为0xffff,导致了多个函数出现越界读写操作(例如qcom_mhi_ipc_router_dl_callback等,主要是根据驱动的不同)。
漏洞成因:
没有对EOT事件时event结构体中的dword[0]字段进行限制,从而导致控制该字段会导致越界读写。
修复方法:
从buf_info->len和evnet的dword[0]中选择小的字段来进行判断。
时间:
2018-12-11至2020-05-18
是什么:
调制解调器驱动接口(MHI)
0x02 CVE-2020-11173
发生位置:
adsprpc.c的fastrpc_internal_munmap(),fastrpc_internal_munmap_fd()和fastrpc_internal_mmap()
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=99d604642ea81f1596bb3734d82896da19f29ede
触发方法:
尝试用两个线程分别调用fastrpc_internal_mmap()和fastrpc_internal_munmap_fd(),如果fastrpc_internal_mmap过了fastrpc_mmap_create()的互斥变量保护之后,fastrpc_internal_munmap_fd将map释放掉,就会造成UAF。
漏洞成因:
fastrpc_internal_munmap_fd()函数用的互斥变量和其他两个函数的不同,导致fastrpc_internal_mmap()只有fastrpc_mmap_create()函数被调用时有互斥变量保护,过了这个保护之后可以被race condition。
修复方法:
为fastrpc_internal_munmap_fd()增加internal_map_mutex作为另一个互斥变量。
时间:
2017-11-22至2020-05-19
是什么:
FastRPC驱动,主要用于cpu数据迁移到DSP
0x03 CVE-2020-11174
发生位置:
adsprpc.c的多个函数。
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=cd83646c66cdfecb5168a5585498fdcab8e65944
触发方法:
以fastrpc_mmap_create为例,伪造fastrpc_file 的cid字段大于8即可造成数组溢出,会造成一个非法的地址被认定为struct fastrpc_channel_ctx结构体,导致接下来对该结构体的访问出错。
漏洞成因:
没有对cid进行边界检查,导致fastrpc_file 的cid字段可以造成数组向下溢出,多个函数受到影响。
修复方法:
在所有用到fastrpc_file的cid字段的位置增加对cid的范围控制。
时间:
2016-12-16至2020-04-30
是什么:
DSP服务
0x04 CVE-2020-3693
发生位置:
qseecom.c的__qseecom_update_cmd_buf_64()函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=563b5263fa9615575afcb07b0ff3e8b2b2897494
触发方法:
当req的cmd_req_len 大于 sizeof(uint32_t)小于sizeof(uint_64_t)时就可以绕过检测,ifd_data[i].cmd_buf_offset的大小在cmd_req_len - sizeof(uint64_t)和cmd_req_len - sizeof(uint32_t)之间可以绕过第二个检测,同时这会导致偏移过大。
漏洞成因:
在使用64位的app使用的地址是64位的地址,但是使用__boundary_checks_offset时,计算偏移的时候使用的是uint32_t,会导致偏移计算的地址过小,判断不准确。
修复方法:
新增判断函数__boundary_checks_offset_64(),把原先的uint32_t修改为uint64_t,同时修改原先判断函数。
时间:
2017-04-11至2019-08-19
是什么:
QSEECOM接口漏洞
0x05 CVE-2020-3694
发生位置:
qseecom.c的__qseecom_update_qteec_req_buf()函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=3f960fc89a7d4d91a6c89c085582d2f00331640e
触发方法:
当req->req_len大于sizeof(uint32_t),(req->ifd_data[i].cmd_buf_offset小于req->req_len - sizeof(uint32_t)但是大于req->req_len - sizeof(struct qseecom_param_memref)。
漏洞成因:
由下方对update指针进行设置时使用了sizeof(struct qseecom_param_memref),如果上面判断是sizeof(uint32_t)会导致覆盖不完整个qseecom_param_memref结构体。
修复方法:
修改sizeof(uint32_t)为 sizeof(struct qseecom_param_memref)
时间:
2017-04-11至2019-07-31
是什么:
QSEECOM接口漏洞
0x06 CVE-2020-3696
发生位置:
ipc_router_security.c的msm_ipc_config_sec_rules()函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit?id=8e1cdd1062c76fb8a5198d6f26e7cd067b4d98dc
触发方法:
尝试使用msm_ipc_add_default_rule增加一个新的default rule,两个线程同时调用msm_ipc_config_sec_rules()和msm_ipc_check_send_permissions()时,如果msm_ipc_check_send_permissions先取到rule,msm_ipc_config_sec_rules再释放可能会出现UAF。
漏洞成因:
对service_id == ALL_SERVICE的rule进行了释放。
修复方法:
删除service_id == ALL_SERVICE的rule释放代码,并且判断为该id直接返回失败。
时间:
2016-11-11至2020-02-26
是什么:
高通ipc通信相关。