Android 2020 安全报告,CVE-2020-0423 android内核提权漏洞分析

本文详细分析了Android 2020年10月披露的CVE-2020-0423安全漏洞,该漏洞源于binder组件中的race condition,可能导致用户态权限提升。通过多线程竞争,binder_work结构体被不正确地释放并引发UAF,最终绕过kASLR和CFI保护。作者在Pixel 4的Android 10设备上进行了PoC验证,并介绍了利用过程,包括堆喷、double free以及ksma机制,展示了如何通过内核内存操作实现任意读写,以获取root权限。
摘要由CSDN通过智能技术生成

简介

2020年10月公布了bulletin,这是最近新的提权漏洞,存在于binder中。

这个漏洞大致上是binder的sender和receive端的对binder_node结构体的race condition转化为uaf漏洞,作者进一步触发了double free,结合后续巧妙的堆喷分配,利用slub和ksma机制,绕过kalsr和cfi保护,官方给出影响的版本在Android 8-11之间,详细的英文文章请参考这里https://blog.longterm.io/cve-2020-0423.html

poc的触发

其poc触发形式为:

Thread 1: enter binder_release_work from binder_thread_release

Thread 2: binder_update_ref_for_handle() -> binder_dec_node_ilocked()

Thread 2: dec nodeA --> 0 (will free node)

Thread 1: ACQ inner_proc_lock

Thread 2: block on inner_proc_lock

Thread 1: dequeue work (BINDER_WORK_NODE, part of nodeA)

Thread 1: REL inner_proc_lock

Thread 2: ACQ inner_proc_lock

Thread 2: todo list cleanup, but work was already dequeued

Thread 2: free node

Thread 2: REL inner_proc_lock

Thread 1: deref w->type (UAF)

分开来看的话,

Thread 1: enter binder_release_work from binder_thread_release

Thread 1: ACQ inner_proc_lock 获取锁

Thread 1: dequeue work (BINDER_WORK_NODE, part of nodeA) 从链表中摘除binder_work

Thread 1: REL inner_proc_lock 释放锁

Thread 1: deref w->type (UAF) 引用binder_work->type

再来看Thread 2

Thread 2: binder_update_ref_for_handle() -> binder_dec_node_ilocked()

Thread 2: dec nodeA --> 0 (will free node)

Thread 2: block on inner_proc_lock 等待锁被thread释放

Thread 2: ACQ inner_proc_lock 获取锁

Thread 2: todo list cleanup, but work was already dequeued 清空链表

Thread 2: free node 释放binder_node

Thread 2: REL inner_proc_lock 释放锁

可以看到binder_work拿到之后, 但是另一个线程紧接这free掉了它,但后续还直接使用它,造成了uaf。

binder_work又是binder_node的成员

patch前后

通过patch前后的对比,主要增大了binder_inner_proc_lock(proc);锁的范围。所以这个漏洞也可以说是开发时没有考虑到锁的范围导致的。

poc可以分为三个阶段触发:

生成一个transaction来触发bug

发送BINDER_THREAD_EXIT

多线程来竞争

在步骤1中必须包含BINDER_TYPE_BINDER 或者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值