2020-6 android kernel vulnerability

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值