2019-01-01

CVE-2017-8890

详细的漏洞分析和利用参考文章 CVE-2017-8890漏洞分析与利用(Root Android 7.x)

1.该漏洞逻辑比较简单,通过源码审计工具即可整理出来触发逻辑线,文章阐述了漏洞利用的思路,但是实现起来会遇到很多问题,并且要稳定的适配到各个机型中,需要解决的问题也非常的多。

2.漏洞类型是一个稳定的 double free,第二次free时机可以控制,是后期稳定占位的必要条件,且该漏洞基本影响了所有的发行版本。

3.漏洞触发逻辑普通权限即可,为Root工具提供必要的前提条件。

4.漏洞利用方法中,文章阐述了完整的利用思路,占位释放过的 mclist 结构体,控制 mclist 中的第一个链表指针 next_rcu 指向可控内存,最后通过 RCU 机制触发回调函数。

5.核心问题是,如何稳定的占位内核中释放的 mclist 结构体。通过传统的堆喷(类似sendmsg)方式,即使能够稳定占位,依然无法利用,原因是传统的堆喷过程中,会伴随着释放过程,当释放过后,通过slab机制申请的堆块,主体数据虽然还在,但是前16个字节(64位)已经被修改,指向前后的空闲slab堆块,所以最后是无法控制 mclist 第一个链表指针的。

6.最终的结论是,必须在内核中寻找一个 slab分配且不会自动释放的内存,幸运的是,在socket模块中确实可以找到一个符合条件的,申请了 mc_list 大小的slab块,并且能够稳定占位。

7.在Nexus6p上按照上述方法能够非常稳定的利用,但是,适配到其他机型上的时候,会出现很多问题,如mc_list大小与堆喷占位的大小不在一个slab块中,在32位系统中又是另一种情况,所以最终的难点,还是在寻找稳定堆喷的对象。

8.结论,稳定的堆喷对象还是能够找到,只是需要花一些时间,8890这个神洞已经可以完美适配大部分机型,除了google系列,已经测试了包括华为,三星,小米等各个厂商的主流机型,确实非常稳定。

9.另外,在实际的多线程堆喷情况下,会经常出现访问无效内存的情况,这种问题可以考虑下Bind CPU。

10.最后,针对该漏洞的利用,如果稳定的堆喷很难找,还有一种解决方法,就是直接通过常规堆喷覆盖回调函数,此时只能控制eip,没有构造jop的条件,但是,可以在内核中找到一个地方将shellcode写入,然后将该地址泄漏出来直接跳过去执行,稳定且不需要适配jop。

没有评论:

发表评论

Android Root Zap Framework

‎ 1. Warning 请遵守GPL开源协议, 请遵守法律法规, 本项目仅供学习和交流, 请勿用于非法用途! 道路千万条, 安全第一条, 行车不规范, 亲人两行泪. 2. Android Root Zap Frame...