首页
社区
课程
招聘
[原创]实现CVE-2016-3842的堆喷
发表于: 2017-6-4 16:00 7069

[原创]实现CVE-2016-3842的堆喷

2017-6-4 16:00
7069

前言

看到论坛有大牛分析了这个CVE-2016-3842的利用方法,我之前也对这个漏洞的堆喷做了一些笔记,这里分享一下。首先要先感谢一下某因幡和Retme两位大神,在研究这个漏洞期间遇到不少的问题,他们都一一给我解答了,这里对他们表示再次感谢。


漏洞介绍

这个漏洞是GPU中的一个UAF漏洞,是由于race condition 造成的。在GPU驱动中提供了一个ioctl命令IOCTL_KGSL_GPUMEM_ALLOC ,这个命令可以让用户去分配一块GPU共享内存。当一个线程调用这个ioctl之后,程序会创建一个kgsl_mem_entry的结构体用来描述一块已经分配好的内存。与此同时函数kgsl_mem_entry_attach_process会通过调用idr_alloc函数给kgsl_mem_entry分配一个ID。在这个时候,另外一个线程调用 IOCTL_KGSL_GPUMEM_FREE_ID 的ioctl命令去释放这个内存块,如果能在分配函数完成之前将这个kgsl_mem_entry释放掉,那么直接就造成了UAF了。


再来看一下官方介绍:

If we add the mem entry pointer in the process idr and rb tree too early, other threads can do operations on the entry by guessing the ID or GPU address before the object gets returned by the creating operation.


POC

因为每在内核分配的第一个kgsl_mem_entry所分配的ID为1,所以可以准确释放刚分配好的内存块。

代码如下:

Crash Log:

[ 4624.507633] Modules linked in:

[ 4624.507921] CPU: 0 PID: 7500 Comm: CVE-2016-3842 Tainted: G        W    3.10.73-g1bbb776-dirty #13

[ 4624.508026] task: ffffffc042c25600 ti: ffffffc03db7c000 task.ti: ffffffc03db7c000

[ 4624.508232] PC is at _raw_spin_lock+0x24/0x5c

[ 4624.508421] LR is at _raw_spin_lock+0x20/0x5c

[ 4624.508525] pc : [<ffffffc001005584>] lr : [<ffffffc001005580>] pstate: 60000145

[ 4624.508712] sp : ffffffc03db7fc30

[ 4624.508815] x29: ffffffc03db7fc30 x28: ffffffc03db7c000 

[ 4624.509113] x27: 0000000000000044 x26: 0000000000000000 

[ 4624.509494] x25: ffffffc001fe7e18 x24: 00000000c0000000 

[ 4624.509787] x23: 0000000000000001 x22: ffffffc01d9e941c 

[ 4624.510170] x21: 0000000000000000 x20: ffffffc001d91000 

[ 4624.510467] x19: 000000000000001c x18: 0000000000000000 

[ 4624.510855] x17: 0000000000000001 x16: ffffffc0003455f8 

[ 4624.511156] x15: 0000007fa7426028 x14: 0000007fa7426018 

[ 4624.511535] x13: 0000000000000003 x12: 0000000000000001 

[ 4624.511830] x11: 0000000000000001 x10: 000000000000000d 

[ 4624.512209] x9 : 000000000046dc68 x8 : 000000000000001d 

[ 4624.512511] x7 : 0000000000000001 x6 : 0000000000000000 

[ 4624.512807] x5 : 0000000000000000 x4 : 0000007fd7478a88 

[ 4624.513190] x3 : 0000000000000000 x2 : 0000000000000000 

[ 4624.513488] x1 : 00000000fe9223ab x0 : ffffffc001d49690 

[ 4624.513867] 

[ 4624.513972] Process CVE-2016-3842 (pid: 7500, stack limit = 0xffffffc03db7c058)

[ 4624.514158] Call trace:

[ 4624.514264] [<ffffffc001005584>] _raw_spin_lock+0x24/0x5c

[ 4624.514378] [<ffffffc000611504>] _sharedmem_free_entry+0x84/0x2a4

[ 4624.514570] [<ffffffc0006118b0>] kgsl_ioctl_gpumem_free_id+0x10c/0x12c

[ 4624.514677] [<ffffffc000617668>] kgsl_ioctl_helper+0x250/0x2ec

[ 4624.514865] [<ffffffc000617740>] kgsl_ioctl+0x3c/0x4c

[ 4624.514975] [<ffffffc000345520>] do_vfs_ioctl+0x4a4/0x57c

[ 4624.515163] [<ffffffc000345660>] SyS_ioctl+0x68/0x94

[ 4624.515271] Code: 97c822ff 52800020 97c94706 f9800271 (885ffe60) 

[ 4624.515635] ---[ end trace b6c5dfe1e97b62c8 ]---

[ 4624.583132] Kernel panic - not syncing: Fatal exception


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
2
学习一下
2017-6-4 17:26
0
雪    币: 7012
活跃值: (4222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享, 
2017-6-4 19:07
0
雪    币: 1795
活跃值: (63)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
感谢分享。。
2017-6-4 20:16
0
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大牛致敬
2017-8-6 19:39
0
游客
登录 | 注册 方可回帖
返回
//