CORE/SERVICES/WMA/wma.c的wma_apfind_set_cmd函数
https://source.codeaurora.org/quic/le/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=b5549a556a9ce60b514ea20dc62f9499a97857a2
使用netlink sock套接字向qcacld发送type类型为WDA_APFIND_SET_CMD的消息,同时设置信息的bodyptr的字段超过0xffff大小,来触发越界拷贝。
使用了u_int16_t来存储request_data_len,所以alloc申请时,一定小于0xffff,所以再执行vos_mem_copy时出现可能出现越界拷贝。
修改长度相关的定义,把u_int16_t转换为size_t。
2014-11-25至2019-10-11
wlan模块,驱动qcacld-2.0
wlan_cmn_ieee80211.h的wlan_parse_rsn_ie()函数
https://source.codeaurora.org/quic/qsdk/platform/vendor/qcom-opensource/wlan/qca-wifi-host-cmn/commit/?id=fe1e85068c57d8c4e4557ed6b265ac6b9694c3a1
伪造wlan_rsn_ie 结构体的pkmid_count字段大于4
没有对rsn的pmkid_count最大值进行限制,会导致qdf_mem_copy()出现越界拷贝。导致rsn的mkpid二维数组字段出现越界拷贝。
增加对rsn的pmkid_count字段的限制。
2018-01-16至2020-07-10
CNSS WLAN主机驱动
qcedev.c的qcedev_ioctl()函数
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=a480ed6e37d2dc2c7f56371365cdac7d5358b50c
直接使用ioctl cmd为QCEDEV_IOCTL_MAP_BUF_REQ,设置arg参数为qcedev_map_buf_req 结构体并且让其中的num_fds字段大于16。
没有对map_buf的num_fds字段进行限制,会导致接下来fd,fd_offset,fd_size的数组出现越界访问。
在使用num_fds字段前增加对该字段的大小验证。
2018-05-15至2020-04-01
qcedev驱动(qce),用于用户态访问加密硬件
packet_fragmenter.c的reassemble_and_dispatch()函数
https://source.codeaurora.org/quic/le/platform/system/bt/commit/?id=cfdb42d512704965acd551b9ffb6de37aac51bf7
https://source.codeaurora.org/quic/la/platform/system/bt/commit/?id=a741d8d2f59b2a090694be71cd538c821cf95ce5
构造满足2*packet->len - 4大于l2cap_length + 8和l2cap_length + 8 - packet->len小于4的L2CAP的数据包。
在计算第二部分packet重构的长度时,增加HCI_ACL_PREAMBLE_SIZE的长度4。
2015-03-16至2020-04-03
蓝牙模块
wlan_vdev_mgr_tgt_if_rx_api.c的tgt_vdev_mgr_get_response_timer_info()函数
https://source.codeaurora.org/quic/qsdk/platform/vendor/qcom-opensource/wlan/qca-wifi-host-cmn/commit/?id=227ff6c08ac997241a5a0513ad25f89072096d02
构造vdev_id大于WLAN_UMAC_PSOC_MAX_VDEVS。
没有对vdev_id进行验证,导致psoc_mlme_obj结构体中的psoc_vdev_rt数组可能出现数组越界访问。
增加对vdev_id的验证。
2019-02-05至2020-04-21
wlan通信模块
q6afe.c的多个位置
https://source.codeaurora.org/quic/la/platform/vendor/opensource/audio-kernel/commit/?id=b8630beb74fab51dbb5b7c769fecfa9534d12b4a
sp_make_afe_callback()创建完合适的指针之后,afe_get_spv4_th_vi_v_vali_data(),afe_get_spv4_th_vi_ftm_data(),afe_get_spv4_ex_vi_ftm_data(),afe_get_sp_v4_rx_tmax_xmax_logging_data()中的一个可能利用race condition来抢占释放指针,这会导致另一个函数使用时出现,UAF甚至double free的风险。
sp_make_afe_callback中申请了spv4_get_param_resp_ptr指针指向spv4_rcvd_param_size大小的空间,之后afe_get_spv4_th_vi_v_vali_data(),afe_get_spv4_th_vi_ftm_data(),afe_get_spv4_ex_vi_ftm_data(),afe_get_sp_v4_rx_tmax_xmax_logging_data()都使用了该指针,同时在函数的最后会释放该指针,这会导致UAF。
重构了整个逻辑结构。
NON至2020-08-05
高通声卡驱动qdsp6v2
cam_context_utils.c的多个函数
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=fc1343a0ff5dc4e3c7fb75daea8b0bc3023c78de
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=bb2f6bfe06ddcf35d5cec90b0ad6b52e875f2fc3
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=3d49d8c63e077aff1a99b37a2fdc9e994bde984e
https://source.codeaurora.org/quic/la/platform/vendor/opensource/camera-kernel/commit/?id=7f7032a632ca9610f76229adfed65f7c3e2a5525
sync_obj大于CAM_SYNC_MAX_OBJS,或者通过记录已经释放的对象的id和非法的对象的id,来访问不合法的对象。
没有验证同步id的合法性,直接使用cam_sync_register_callback和cam_context_putref来使用同步id,会导致非法同步对象访问。
增加了cam_sync_check_valid来验证id的合法性。
未知,多个版本时间不同步
高通相机驱动
cam_ife_hw_mgr.c的cam_ife_mgr_check_and_update_fe
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=060905ca27ee5ab7894d73ab847157b4ea7d771a
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=698ee3d9270b5435e87020ad6fd7ee45658c4d6f
https://source.codeaurora.org/quic/la/platform/vendor/opensource/camera-kernel/commit/?id=ebf9a16afa94444f28277f4c981e1c7482fb46e2
伪造cam_isp_acquire_hw_info结构体中的input_info_offset大于input_info_size或者data+input_info_offset+cam_isp_in_port_info结构体大小大于acquire_info_size。
没有对来自UMD的数据(struct cam_isp_acquire_hw_info)大小进行验证,直接使用,可能会导致越界访问。
增加了对上诉的范围进行验证,同时新增当前acquire_info_size来表明输入的硬件信息的大小。
2018-12-03至2020-5-5
高通的相机驱动(读取UMD的部分)
msm_cvp.c的msm_cvp_register_buffer()
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=770620ffcc7ce7e23848952acb2062014cb4ef5f
https://source.codeaurora.org/quic/la/platform/vendor/opensource/video-driver/commit/?id=e543a787241afd850a6509e814a936d84ccd4b74
msm_cvp_unregister_buffer()和msm_cvp_register_buffer()针对cbuf->list对象进行race condition,可能会造成UAF甚至double free。
msm_cvp_register_buffer()函数在list_add_tail()和list_del()中间,可能会由于race condition导致cbuf->list被释放,从而造成UAF。
不在msm_cvp_register_buffer中释放cbuf->list对象,仅仅在该函数执行必定成功时,利用list_add_tail(),避免因为时间出现race condition。
2018-02-24至 2020-04-21
高通的媒体驱动。
wlan_cmn_ieee80211.h的wlan_parse_rsn_ie()函数
https://source.codeaurora.org/quic/qsdk/platform/vendor/qcom-opensource/wlan/qca-wifi-host-cmn/commit/?id=fe1e85068c57d8c4e4557ed6b265ac6b9694c3a1
伪造wlan_rsn_ie 结构体的pkmid_count字段大于4
没有对rsn的pmkid_count最大值进行限制,会导致qdf_mem_copy()出现越界拷贝。导致rsn的mkpid二维数组字段出现越界拷贝。
增加对rsn的pmkid_count字段的限制。
2018-01-16至2020-07-10
CNSS WLAN主机驱动
qcedev.c的qcedev_ioctl()函数
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=a480ed6e37d2dc2c7f56371365cdac7d5358b50c
直接使用ioctl cmd为QCEDEV_IOCTL_MAP_BUF_REQ,设置arg参数为qcedev_map_buf_req 结构体并且让其中的num_fds字段大于16。
没有对map_buf的num_fds字段进行限制,会导致接下来fd,fd_offset,fd_size的数组出现越界访问。
在使用num_fds字段前增加对该字段的大小验证。
2018-05-15至2020-04-01
qcedev驱动(qce),用于用户态访问加密硬件
packet_fragmenter.c的reassemble_and_dispatch()函数
https://source.codeaurora.org/quic/le/platform/system/bt/commit/?id=cfdb42d512704965acd551b9ffb6de37aac51bf7
https://source.codeaurora.org/quic/la/platform/system/bt/commit/?id=a741d8d2f59b2a090694be71cd538c821cf95ce5
构造满足2*packet->len - 4大于l2cap_length + 8和l2cap_length + 8 - packet->len小于4的L2CAP的数据包。
在计算第二部分packet重构的长度时,增加HCI_ACL_PREAMBLE_SIZE的长度4。
2015-03-16至2020-04-03
蓝牙模块
wlan_vdev_mgr_tgt_if_rx_api.c的tgt_vdev_mgr_get_response_timer_info()函数
https://source.codeaurora.org/quic/qsdk/platform/vendor/qcom-opensource/wlan/qca-wifi-host-cmn/commit/?id=227ff6c08ac997241a5a0513ad25f89072096d02
构造vdev_id大于WLAN_UMAC_PSOC_MAX_VDEVS。
没有对vdev_id进行验证,导致psoc_mlme_obj结构体中的psoc_vdev_rt数组可能出现数组越界访问。
增加对vdev_id的验证。
2019-02-05至2020-04-21
wlan通信模块
q6afe.c的多个位置
https://source.codeaurora.org/quic/la/platform/vendor/opensource/audio-kernel/commit/?id=b8630beb74fab51dbb5b7c769fecfa9534d12b4a
sp_make_afe_callback()创建完合适的指针之后,afe_get_spv4_th_vi_v_vali_data(),afe_get_spv4_th_vi_ftm_data(),afe_get_spv4_ex_vi_ftm_data(),afe_get_sp_v4_rx_tmax_xmax_logging_data()中的一个可能利用race condition来抢占释放指针,这会导致另一个函数使用时出现,UAF甚至double free的风险。
sp_make_afe_callback中申请了spv4_get_param_resp_ptr指针指向spv4_rcvd_param_size大小的空间,之后afe_get_spv4_th_vi_v_vali_data(),afe_get_spv4_th_vi_ftm_data(),afe_get_spv4_ex_vi_ftm_data(),afe_get_sp_v4_rx_tmax_xmax_logging_data()都使用了该指针,同时在函数的最后会释放该指针,这会导致UAF。
重构了整个逻辑结构。
NON至2020-08-05
高通声卡驱动qdsp6v2
cam_context_utils.c的多个函数
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=fc1343a0ff5dc4e3c7fb75daea8b0bc3023c78de
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=bb2f6bfe06ddcf35d5cec90b0ad6b52e875f2fc3
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=3d49d8c63e077aff1a99b37a2fdc9e994bde984e
https://source.codeaurora.org/quic/la/platform/vendor/opensource/camera-kernel/commit/?id=7f7032a632ca9610f76229adfed65f7c3e2a5525
sync_obj大于CAM_SYNC_MAX_OBJS,或者通过记录已经释放的对象的id和非法的对象的id,来访问不合法的对象。
没有验证同步id的合法性,直接使用cam_sync_register_callback和cam_context_putref来使用同步id,会导致非法同步对象访问。
增加了cam_sync_check_valid来验证id的合法性。
未知,多个版本时间不同步
高通相机驱动
cam_ife_hw_mgr.c的cam_ife_mgr_check_and_update_fe
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=060905ca27ee5ab7894d73ab847157b4ea7d771a
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=698ee3d9270b5435e87020ad6fd7ee45658c4d6f
https://source.codeaurora.org/quic/la/platform/vendor/opensource/camera-kernel/commit/?id=ebf9a16afa94444f28277f4c981e1c7482fb46e2
伪造cam_isp_acquire_hw_info结构体中的input_info_offset大于input_info_size或者data+input_info_offset+cam_isp_in_port_info结构体大小大于acquire_info_size。
没有对来自UMD的数据(struct cam_isp_acquire_hw_info)大小进行验证,直接使用,可能会导致越界访问。
增加了对上诉的范围进行验证,同时新增当前acquire_info_size来表明输入的硬件信息的大小。
2018-12-03至2020-5-5
高通的相机驱动(读取UMD的部分)
msm_cvp.c的msm_cvp_register_buffer()
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=770620ffcc7ce7e23848952acb2062014cb4ef5f
https://source.codeaurora.org/quic/la/platform/vendor/opensource/video-driver/commit/?id=e543a787241afd850a6509e814a936d84ccd4b74
msm_cvp_unregister_buffer()和msm_cvp_register_buffer()针对cbuf->list对象进行race condition,可能会造成UAF甚至double free。
msm_cvp_register_buffer()函数在list_add_tail()和list_del()中间,可能会由于race condition导致cbuf->list被释放,从而造成UAF。
不在msm_cvp_register_buffer中释放cbuf->list对象,仅仅在该函数执行必定成功时,利用list_add_tail(),避免因为时间出现race condition。
2018-02-24至 2020-04-21
高通的媒体驱动。
ip6mr.c的ip6_mroute_setsockopt和ip6_mroute_getsockopt
https://github.com/torvalds/linux/commit/99253eb750fda6a644d5188fb26c43bad8d5a745
传入任意sock类型不为SOCK_RAW和协议不为IPPROTO_ICMPV6的,都可以获取到。
当一个sock的类型不为SOCK_RAW且协议不是IPPROTO_ICMPV6,该sock同样会被取到ip6mr_table基于raw6_sock的结构体偏移位置的值,同时被当成ip6mr_table进一步使用。
在提取ip6mr_table之前就提前判断sock的类型和协议。
2009年10月1日至2017年2月27日
ipv6的sock包处理
lim_api.c下的lim_is_pkt_candidate_for_drop函数
https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=6bb1315d69b705cfef5b1c9e211f20e7fc5a4938
lim_is_pkt_candidate_for_drop在调用sta_ds 的时候,dph_lookup_hash_entry 函数之前,使用pe_delete_session利用race condition删除sta_ds 结构体,在接下来last_assoc_received_time 和last_disassoc_deauth_received_time的访问就会触发UAF
在访问sta_ds 的时候没有加锁,导致条件竞争会出现UAF
及那个last_disassoc_deauth_received_time和last_assoc_received_time 放入了另一个结构体处理。
未知
高通qcacld-3.0设备,貌似不在内核代码中?
msm-pcm-routing-v2.c下的msm_routing_get_lsm_app_type_cfg_control函数
https://source.codeaurora.org/quic/qsdk/platform/vendor/opensource/audio-kernel/commit/?id=80ac1b29f1ea6be32eddb33bdf3d72407b315f38
msm_routing_get_rms_value_control可能可以和msm_routing_put_lsm_app_type_cfg_control进行竞争,需要修改ucontrol->value.integer.value[0]大于MAX_APP_TYPES
msm_routing_get_lsm_app_type_cfg_control和msm_routing_put_lsm_app_type_cfg_control在处理没有加锁,导致ucontrol->value.integer.value[0] 可能在通过校验后被篡改为其他的值,导致越界拷贝。
在上述两个函数处加上routing_lock锁。
未知至2020-02-20
声卡相关
kgsl.c的kgsl_mmap_memstore
https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=a3c08f0483dd13f5c19be0e2ca2f0167187cbb71
未知。。。
没有取消掉vma数据结构的VM_MAYWRITE字段,导致GPU内存被mmap到用户空间时可写
去掉VM_MAYWRITE字段
未知至2020-08-26
高通GPU驱动
ep0.c下的dwc3_ep0_handle_status
https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=79856f1b189faf189f8cf43e7222fc0b5138563e
调用dwc3_ep0_handle_status时,使recip=USB_RECIP_INTERFACE,在dwc3_ep0_delegate_req中会调用一次dwc3_gadget_ep0_queue,尝试构造使ret=0,然后触发再一次触发__dwc3_gadget_ep0_queue,会导致同一个对象两次被放入list。
recip=USB_RECIP_INTERFACE时dwc3_ep0_handle_status调用dwc3_ep0_delegate_req返回ret=0时,不会直接结束函数,会执行__dwc3_gadget_ep0_queue。
取消对ret的判断,直接返回ret
2011-08-22至2020-09-30
usb驱动
lim_api.c的lim_is_pkt_candidate_for_drop
https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=2a10c7aa8cdd3277e35176207c44ade90a567e73
逻辑错误,无需手动触发
SIR_MAC_MGMT_ASSOC_REQ、SIR_MAC_MGMT_DISASSOC和SIR_MAC_MGMT_DEAUTH不可能被subType 同时满足,接下来的代码永远是无效的。
把上诉关系从与改成或,并且优化了lim_process_disassoc_frame和lim_process_deauth_frame函数,促使cds_flush_logs在函数最后执行。
2015-11-17至2020-01-07
高通wlan驱动qcacld-3.0
xt_qtaguid.c的qtaguid_untag函数
https://android-review.googlesource.com/c/kernel/common/+/1549134/
在不打开/dev/xt_qtaguid的情况下,将sock_tag_entry放入pqd_entry->sock_tag_list中,然后调用qtaguid_untag函数,可以使list中出现一个指向已经释放对象的指针,再次访问这个对象,会造成UAF
IS_ERR_OR_NULL(pqd_entry)执行成功但是sock_tag_entry->list.next仍然存在的情况下,不会从pqd_entry->sock_tag_list表删除sock_tag_entry,在sock_tag_entry被释放之后,会导致悬空指针。
将IS_ERR_OR_NULL(pqd_entry)和sock_tag_entry->list.next不存在的从或关系,改为并列的顺序关系。
2017-04-19至2021-1-13
xt_qtaguid驱动,一个网络数据包过滤器?
qseecom_lk.c的qseecom_read_from_nand
https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=1f383b13c485d9b2d083b01c0bda52641e2a83bd
msm_ioctl_register_event和msm_ioctl_deregister_event进行race condition
对第一个client对象注册进行操作的时候,无论client是否注册成功,都先将client放入list中,在函数结束的位置,如果注册失败,再删除client,这导致中间的空窗期,其他函数可以通过list访问client,是经典race condition导致的UAF漏洞。
将client放入list的操作放到最后。
未知至2020-09-14
显示器驱动
qseecom_lk.c的qseecom_read_from_nand
https://source.codeaurora.org/quic/le/kernel/lk/commit/?id=7cffd6bb4fc616935b5ca1d452be5d1c87ba86f1
未知?bootload中的。。。
校验不正确导致ptn->length * flash_num_pages_per_blk()可以出现页框数出现整数溢出
修改判断语句为(UINT_MAX - page_size + 1)/ page_size,多减去了一页
未知到2020-09-26
bootload加载qseecom驱动
PartitionTableUpdate.h的MAX_GPT_NAME_SIZE
https://source.codeaurora.org/quic/le/abl/tianocore/edk2/commit/?id=c468f18421e113057ba72b83edf985c53fe4705d
传入ASCII码转Unicore码后会超过32个字符的字符串。bootload的漏洞,不会。。。
ASCII字符串转Unicore时,由于ptn_name 是36,会导致期整数溢出。
把ptn_name最大值扩大到72
2015-10-3至2020-10-26
bootload
kgsl.c的memdesc_sg_virt函数
https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=5e0deed5892ba5301624b74fb584d53b6916bdae
利用IOCTL_KGSL_MAP_USER_MEM 将同一块useraddr映射两次,会导致get_user_pages将页框的引用计数加两次,这里可能会导致useraddr即使被释放了,由于引用计数导致不会被置换出内存,另一方面。sg_alloc_table_from_pages将会创建两个sg_table为同一块内存空间。这导致,有两个memdesc->sgt会指向同一个空间,释放其中一个,再使用,就会导致UAF。
没有做好import同一块的内存空间两次的校验工作。
重写了memdesc_sg_virt和check_vma逻辑,在check_vma中校验了是否为已经映射了的内存。
未知至2020-10-21
高通GPU驱动
block_dev.c的blkdev_get函数
https://android.googlesource.com/kernel/common/+/49289b1fa5a67011%5E%21/#F0
调用blkdev_get并且让__blkdev_get函数失败,会触发UAF。
blkdev_get会调用__blkdev_get,但是如果失败,bdev引用计数会被清0,导致bdev对象被释放,但是blkdev_get的后续还是会调用到该对象。
__blkdev_get不处理bdev的引用计数,blkdev_get中进行处理。
2010-11-13至2020-6-25
linux内核块设备子系统
icmp.c的icmp_global_allow
https://android.googlesource.com/kernel/common/+/d6c552505c0d1719dda42b4af2def0618bd7bf54%5E%21/#F1
未知,Keyu Man将会发布在学术期刊
未知,Keyu Man将会发布在学术期刊
随机化ICMP的速率限制
2014-09-19至2020-10-29
ICMP协议
sockev_nlmcast.c的sockev_client_cb函数
https://source.codeaurora.org/quic/la/kernel/msm-4.19/commit/?id=76a699e746c9b3a1494597a6756ff21fc84b48e4
sockev_client_cb和sk_free争对struct sock进行race condition
sockev_client_cb在操作sock对象时没有加锁
sockev_client_cb中增加锁sock_hold和sock_put函数
2019-03-1至2019-5-21
sock相关