0x00 CVE-2020-8647(6.1)
发生位置:
vgacon.c的vgacon_resize函数
补丁:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=513dc792d6060d5ef572e43852683097a8420f56
触发方法:
可以尝试通过vc_allocate来申请一块大的vc_screenbuf,然后vc_do_resize来申请一块更大screenbuf,然后依次拷贝入vc_origin,会导致越界访问。
漏洞成因:
由于vgacon 驱动使用了vga_vram_base(显存基础?),而不是设备的vc_screenbuf(屏幕缓冲),但是vga_vram_base可能会小于vc_screenbuf。由于在ioctl调用TIOCLINUX时使用的是new_row_size来计算偏移,可能会大于vga_vram_size (显存大小),导致越界访问。
修复方法:
增加对width*height的判断,如果大小大于当前的vga_vram_size(显存大小),就直接返回失败。
时间:
2005-09-09至2020-03-04
是什么:
屏幕大小(vgacon驱动)修改。
0x01 CVE-2020-8648(7.1)
发生位置:
selection.c的paste_selection函数和set_selection_user 的race condition
补丁:
https://android.googlesource.com/kernel/common/+/07e6124a1a46%5E%21/#F0
触发方法:
paste_selection在使用了sel_buffer之时,set_selection_kernel 可以释放掉sel_buffer并且重新分配sel_buffer。
漏洞成因:
paste_selection (TIOCL_PASTESEL)和set_selection_kernel (TIOCL_SETSEL)可以分别通过条件竞争同时访问sel_buffer(全局变量)。
修复方法:
paste_selection (TIOCL_PASTESEL)和set_selection_user (TIOCL_SETSEL)访问sel_buffer时,增加一个自旋锁。
时间:
2005-04-16到2020-2-10
是什么:
linux终端驱动tty,粘贴命令。
0x02 CVE-2020-8428(7.1)
发生位置:
namei.c文件的may_create_in_sticky()函数
补丁:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d0cb50185ae942b03c4327be322055d622dc79f6
触发方法:
个人的基本思路可能是需要通过race condition来关闭dir指针。nvd中给了一种可能可行的触发方法,使用的是UNIX domain socket(ipc),通过修改socket的中间文件至一个新的父目录,来移除旧的父目录指针,但是暂时我未找到可以移动ipc中间文件的系统函数。
漏洞成因:
may_create_in_sticky()传入的参数是dir(目录指针,从current中取出来),在真正用到dir_mode和dir_uid时才会从dir中取出来,但是这中间dir指针可能已经被释放,从而造成UAF的漏洞,甚至可能可以篡改原先的dir指针,指向新的dir指针,来泄露一些敏感信息。
修复方法:
在调用漏洞函数之前的do_last()函数中取出目标dir的mode和uid,直接传给may_create_in_sticky使用,避免dir指针被释放。
时间:
2018-08-23到2020-01-26
是什么:
打开某个文件,参数O_CREAT。
0x03 CVE-2019-14047(7.8)
发生位置:
ipa_rt.c的__ipa_add_rt_rule函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=e98691d8f5a08cf3af5037290767bdf22c9f1eb3
触发方法:
传入rule_id小于ipahal_get_rule_id_hi_bit()的值,或者大于(ipahal_get_rule_id_hi_bit()<<1)-1,ipahal_get_rule_id_hi_bit()的基本实现是1<<(ipahal_fltrt_objs[ipahal_ctx->hw_type].rule_id_bit_len - 1)。
漏洞成因:
没有验证用来routing的rule_id,导致无效的rule_id可以被传到ipa的硬件中。
修复方法:
增加新的函数__ipa_rt_validate_rule_id()用来验证routing rule id是否是合法的。
时间:
2016-10-27至2018-08-27
是什么:
高通的网络路由规则id(ipa驱动)
影响的设备:
APQ8053, APQ8096AU, MDM9607, MSM8909W, MSM8996, MSM8996AU, QCN7605, QCS605, SC8180X, SDA845, SDX20, SDX24, SDX55, SM8150, SXR1130
0x04 CVE-2020-3613(7.8)
发生位置:
adsprpc.c的多个函数(map相关的函数)
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=2c3343ea1d55542cb7a712eb40ff184245921bde
触发方法:
调用fastrpc_mmap_create()函数失败来执行fastrpc_mmap_free()函数,由于没有进行map_mutex变量来锁住map,所以可以同时调用fastrpc_internal_munmap()来进行race condition,有一定概率达成double free()。
漏洞成因:
除了fastrpc_internal_munmap和fastrpc_internal_mmap函数,使用了map_mutex锁来防止整个map被篡改,其他位置都使用的是hlock自旋锁,例如fastrpc_mmap_free,在hlock锁生效之前会有窗口期导致map被修改或者释放。
修复方法:
一共分为三个锁,hlock为自旋锁,防止hn被篡改,map_mutex是互斥锁,防止map被篡改,新增一个互斥锁internal_map_mutex(代替之前map_mutex的功能),单独用于fastrpc_internal_mmap和fastrpc_internal_munmap中,防止这两个函数race condition。同时,修改所有与map相关的free和add等函数,从原来的hlock自旋锁改为在free和add函数调用之前用map_mutex锁住整个map,防止hlock锁之前hn被篡改。
时间:
2016-12-16至2018-05-27
是什么:
adsprpc驱动,高通远程数字信号处理驱动
影响的设备:
SM8150
0x05 CVE-2020-3665(7.8)
发生位置:
ol_txrx.c的ol_txrx_update_tx_queue_groups函数
补丁:
https://source.codeaurora.org/quic/le/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=48b55d5182ec223d1e1f88dc1b7b7ef91f3459c8
触发方法:
固件发送类型为HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND的消息 。group_id 大于OL_TX_MAX_TXQ_GROUPS的恶意消息,也就是大于2,会在group = &pdev->txq_grps[group_id]发生可能的越界拷贝。
漏洞成因:
ol_txrx_update_tx_queue_groups()函数没有对接受到的group_id进行判断,可能会导致txq_grps数组出现数组越界。
修复方法:
增加group_id的判断,确保group_id 小于OL_TX_MAX_TXQ_GROUPS。
时间:
2014-12-03至2019-09-20
是什么:
WLAN HOST的Host Target传输层(HTT),驱动为qcacld 2.0
影响的设备:
APQ8009, APQ8053, APQ8096AU, MDM9206, MDM9207C, MDM9607, MDM9615, MDM9640, MDM9650, MSM8909W, MSM8996, MSM8996AU, QCA6174A, QCA9377, QCA9379, SDM439, SDM636, SDM660, SDX20, SDX24, SM8150
0x06 CVE-2019-10626(5.5)
发生位置:
avtimer.c的aprv2_core_fn_q函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=88c1b337920ea92b3f620e629215fb6a4f6236c9
触发方法:
调用ioctl来注册一个设备探针dev_avtimer_probe用来处理QDSP6崩溃的情况,reset_work会被注册为延迟调用的函数,reset_work会将aprv2_core_fn_q会被注册为最后的处理函数,在调用该处理函数时确保apr_client_data 函数的payload数组只有payload[0]有效,payload[1]错误打印的时候就会变成越界读取。
漏洞成因:
在使用payload数组之前,只判断了payload_size不为0,没有判断payload数组的长度,如果payload的长度不够可能会造成非法信息泄露。
修复方法:
在使用payload数组之前,增加对payload_size 大小的判断。
时间:
2017-01-23至2019-10-25
是什么:
avtimer驱动,主要用来在QDSP6信号处理器处于电源崩溃的时候,帮助该处理器脱离这个状态然后来通过ioctl来阅读avtimer的信号。
影响的设备:
APQ8009, APQ8017, APQ8053, APQ8096AU, APQ8098, IPQ4019, IPQ6018, IPQ8064, IPQ8074, MDM9206, MDM9207C, MDM9607, MDM9640, MDM9650, MSM8909W, MSM8996AU, QCS405, QCS605, Rennell, Saipan, SC8180X, SDA660, SDA845, SDM429W, SDM439, SDM670, SDM710, SDX20, SDX24, SDX55, SM8150, SM8250, SXR1130, SXR2130
0x07 CVE-2019-14091(7.8)
发生位置:
npu_debugfs.c的npu_debug_open和npu_debug_release函数
补丁:
https://source.codeaurora.org/quic/la/kernel/msm-4.14/commit/?id=3c0bb7f49d2abe31e7fa30026a68dbcdd4aae060
触发方法:
首先需要开启内核调试模式,Kernelhacking —>Debug Filesystem,然后尝试调用npu_debug_reg_read来创建buf,再通过两个线程调用npu_debug_release来进行race condition,再debugfs->buf = NULL;之前执行两次kfree就可以触发漏洞。
漏洞成因:
npu_debug_reg_read中kzalloc的buf在npu_debugfs_ctx 结构体中,所以release释放之后,buf置null之前,file->private_data->->debugfs_ctx->buf 还是可以取到该buf的指针,可能导致double free。
修复方法:
把在npu_debug_reg_read中kzalloc的buf独立成一个结构体npu_debugfs_reg_ctx 并且从原先的npu_debugfs_ctx 中删除这几个字段。废弃之前的额.open和.release函数,为独立的结构体npu_debugfs_reg_ctx 重写调试的.open和.release函数,在release函数完全删除npu_debugfs_reg_ctx 结构体。
时间:
2018-04-13至2019-10-25
是什么:
网络处理器npu的调试函数
影响的设备:
MDM9607, QCS405, Rennell, Saipan, SC8180X, SDX55, SM8150, SM8250, SXR2130