首页
社区
课程
招聘
[讨论]水滴-cve-2019-2025的利用
发表于: 2019-3-20 11:11 10066

[讨论]水滴-cve-2019-2025的利用

2019-3-20 11:11
10066

最近在看爆出来的水滴cve-2019-2025的利用,发现内核写的这个思路时间窗口太小了,而且并不好控制,代码如下:


t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,
tr->offsets_size, extra_buffers_size,
!reply && (t->flags & TF_ONE_WAY));
if (IS_ERR(t->buffer)) {
/*
* -ESRCH indicates VMA cleared. The target is dying.
*/
return_error_param = PTR_ERR(t->buffer);
return_error = return_error_param == -ESRCH ?
BR_DEAD_REPLY : BR_FAILED_REPLY;
return_error_line = __LINE__;
t->buffer = NULL;
goto err_binder_alloc_buf_failed;
}
//msleep(10);
t->buffer->allow_user_free = 0;
//t->buffer->tmp = 111;
t->buffer->debug_id = t->debug_id;
t->buffer->transaction = t;
t->buffer->target_node = target_node;

基本上就是从binder_alloc_new_buf出来之后就直接到allow_user_free=0处了,这个时间窗口很短。不过,实际上,race的情况是会出现的,只要进行free 目标binder_buffer的线程多一点,cpu分散一些,很大概率能够race进去。
race进去了之后,其实并不会直接把目标binder_buffer给kfree掉,想要成功kfree必须保证前面的相邻binder_buffer是一个free的,这个就很难满足,因为如果前面的binder_buffer是一个free的话,那在binder_alloc_new_buf的时候自然会去分配到前面的binder_buffer,而不是这个目标binder_buffer。。。之前想通过不同的buffer_size来做一些事情,但是都没成功,感觉陷入了一个矛盾的循环。。。

现在假设已经成功的把目标binder_buffer给free掉了,那还需要在时间窗口期间把堆喷给做了。

一直搞不明白这块是如何成功利用的,感觉自己的思路可能是受限制了,不知道有什么其他的思路大家可以一起讨论一下。


t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,
tr->offsets_size, extra_buffers_size,
!reply && (t->flags & TF_ONE_WAY));
if (IS_ERR(t->buffer)) {
/*
* -ESRCH indicates VMA cleared. The target is dying.
*/
return_error_param = PTR_ERR(t->buffer);
return_error = return_error_param == -ESRCH ?
BR_DEAD_REPLY : BR_FAILED_REPLY;
return_error_line = __LINE__;
t->buffer = NULL;
goto err_binder_alloc_buf_failed;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 4
支持
分享
最新回复 (15)
雪    币: 210
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
不加patch我也没搞出来,网上有爆的相关代码么
2019-3-20 16:39
0
雪    币: 324
活跃值: (384)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
不知道这个时序怎么控制,tw上问了大佬。说的要过一段时间才公开细节
2019-3-20 16:47
0
雪    币: 222
活跃值: (185)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
看成滴水了
2019-3-22 00:13
0
雪    币: 275
活跃值: (254)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
我猜这里mutex和其他地方的锁可能会是一个点,进程被mutex挂起来,然后后面的调度部分,是不是能有一些东西。。

google的说明:https://bugs.chromium.org/p/project-zero/issues/detail?id=1720
这里面是root权限跑的一个poc,得先做这个binder_become_context_manager的操作,android上没有能力这样搞,因为已经有一个servicemanager了,
2019-3-22 14:00
0
雪    币: 210
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
@wule 大佬加个微信么,交流一下2025? 看雪不让我发私信, Vx:apologizeilostyou
2019-3-23 21:05
0
雪    币: 314
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2019-3-24 11:34
0
雪    币: 593
活跃值: (817)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
楼主,感觉你把binder_buffer和binder_buffer.data弄混淆了吧,各个binder_buffer.data是内存相邻的,但binder_buffer结构体本身的内存是不相邻的,而是用红黑树关联起来的
360文章中说的堆喷也是喷binder_buffer,而不是binder_buffer.data
不过我这里也没什么进展,希望多交流
2019-4-12 18:12
0
雪    币: 275
活跃值: (254)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
http://192.168.43.165/h.html
2019-5-10 23:15
0
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
10
前来帮顶
2019-5-12 15:47
0
雪    币: 275
活跃值: (254)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
Ericky 前来帮顶
感谢Ericky大佬帮顶!360的文章都出来了,只能说还太嫩了。
2019-5-13 20:50
0
雪    币: 593
活跃值: (817)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
按照360的PPT,我已经成功实现了时间窗口的竞争,堆喷也成功了。
但内核信息泄露那步,发现PPT里的sync_fence_create和sync_pt_create用的是很老的代码(git上看是2014年的),新安卓版本早就改变了。也许是360仅仅用这个老代码来举例?
PPT里还写道要用Syzkaller/monkey 来寻找合适的内存结构体来实现泄露,但Syzkaller貌似只能对虚拟机X86内核进行fuzz,安卓这边也能用Syzkaller吗?
希望几位大佬能略微指点下我这个新来的菜鸟,感谢!
2019-9-9 11:58
0
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
牛maomao 按照360的PPT,我已经成功实现了时间窗口的竞争,堆喷也成功了。 但内核信息泄露那步,发现PPT里的sync_fence_create和sync_pt_create用的是很老的代码(git上看是2 ...
堆喷成功已经可以任意地址写了,利用内核镜像攻击,可提权了。
2019-9-9 16:47
0
雪    币: 593
活跃值: (817)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
jltxgcy 堆喷成功已经可以任意地址写了,利用内核镜像攻击,可提权了。
只是验证堆喷而已,随便填了些数据,首先要先泄露cred地址,才能知道往哪里写
2019-9-9 17:18
0
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
15
牛maomao 只是验证堆喷而已,随便填了些数据,首先要先泄露cred地址,才能知道往哪里写
内核镜像攻击直接patch ns_capable,不过你要做到通用,也需要泄露ns_capable的地址。
2019-9-9 19:12
0
雪    币: 593
活跃值: (817)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
jltxgcy 内核镜像攻击直接patch ns_capable,不过你要做到通用,也需要泄露ns_capable的地址。
现在就是泄露这步搞不定
2019-9-10 08:59
0
游客
登录 | 注册 方可回帖
返回
//