CVE-2015-3636(pingpong root) android内核 UAF漏洞分析

  去年差不多这个时候就计划把这个漏洞给分析了,由于android没有经常搞,所以踩了很多坑,中间一度因为各种原因停滞放弃,最近遇到一个事情让我下定决心把它了结,也算是解决一个心病。过程会写详细一点,给和我一样的初学朋友提供点帮助。这个漏洞keen在blackhat上讲过[8],是一个很经典的android内核漏洞,也是第一个64bit root,还是很有学习价值的。分析android内核的漏洞需要自己下载android源代码和内核源代码,reverse patch,编译调试。吾爱破解有个比赛就是写这个漏洞的exploit,并且还提供了相应的环境[3],所以我偷了个懒,直接拿过来用就行了。exploit我在github上也直接找了一份现成的[11],经我测试可用。

  这里注意sk_node和sk_nulls_node共用了一个union,两者的定义也十分类似,似乎有一点类型混淆的感觉。

  这个时候IDA是什么也识别不出来的,因为Image文件并不是一个ELF,用binwalk看一下就会发现其实它组成还挺复杂的。我们接下来从运行的虚拟机中导出内核函数名称和地址。在ubuntu这样的发行版和android内核中有Kernel Address Display Restriction,所以先把它关掉。

  所以进一步确认了漏洞成因和我们前面所分析的一样。如何让IDA分析Image讲的有点多了,主要参考了[1]和[4]。接下来还是回到正题,既然说这是一个UAF漏洞那么哪里UAF了呢?在hlist_nulls_del之后还有一个sock_put。

  sock_put将sk的引用计数减1,并且判断其值是否为0,如果为0的话就free掉sk。可以想到最后一次connect进入本不该进入的if分支之后如果我们提前mmap了0x200200(这里是0x1360)就不会崩溃,接下来进入sock_put,引用计数变成0,sk被free掉,但是文件描述符还在用户空间,这就造成了UAF。

  我们可以先测一下这个EXP。不过要注意的是必须用adb shell过去然后su shell才能继承root的权限得到建立socket的权限。测试发现这个EXP确实是可用的,下面就开始调试。

  终于开始调试了,不过还有一个小坑,我们应该用gef-remote -q localhost:1234也就是加上-q参数不然会报错,原因在这里[7]。接下来进入漏洞利用的部分。我们可以看到在main函数中整个漏洞触发漏洞的过程和POC中一样。

  修改mmap_min_addr并mmap就是为了避免崩溃这样才能执行到sock_put的逻辑。接下来的操作叫做physmap spray,大家如果对CVE-2014-3153(towelroot)还有印象的话,会记得它是通过sendmmsg修改内核数据的,keen在文章中解释了,通过sendmmsg完成堆喷的条件是存在漏洞的对象大小必须和SLAB分配器通常使用的大小一致。而在一些android设备上,PING sock对象的大小是576,不是期望的512或者1024。这样就很难对齐,利用会很不稳定,所以采用的是physmap spray的方法。

  在内核中physmap在一个相对较高的地址,而SLAB通常在一个相对较低的地址,通过喷射其它的内核对象使得SLAB分配器在相对高的地址分配PING sock对象造成physmap和SLAB重叠,这个过程叫做lifting。这里的“其它的内核对象”直接用PING sock对象其实就可以。

  这个函数会返回sk-sk_stamp,在我们的环境中它在sock对象中的偏移正是0x1D8。

  找到exp_sock之后因为它已经完全在我们的控制之中了,所以函数指针也是可控的,对其调用close函数就可以控制PC了。可以看到close是在inet_close中调用的。

  addr_limit规定了特定线程的用户空间地址最大值,超过这个值的地址用户空间代码不能访问。所以把addr_limit改成0xffffffff就可以对内核为所欲为了。现在我们已经来到了kernel_setsockopt,应该怎么改addr_limit呢?当内核需要去使用系统调用的时候就要去掉地址空间的限制,一般的流程是(1)oldfs=get_fs,(2)set_fs(KERNEL_DS),(3)set_fs(oldfs),如果能绕过set_fs(oldfs)的执行,内核空间将一直对用户态打开,这样就绕过了限制。

  截一张mosec2016上360冰刃实验室讲的《AndroidRoot利用技术漫谈:绕过PXN》[5]中的一张图帮助理解。

  现在可以任意读写内核了,下一步是修改全局mmap_min_addr让我们能够在用户态mmap null地址。



分享到:

猜你喜欢

美味家常菜减肥食谱推荐边吃边享“瘦”

2019-01-02 @ 技术教程

清淡无味的减肥菜让很多减肥的朋友因此而坚持不下去,其实还是有不少美味又健康的减肥食谱的。今天小编就来为你推荐几款减肥家常菜,非常适合现在炎热的夏季,让你吃得饱又能达到减肥目的。

如果DS7是家常菜那么X E-TENSE加拿大3.5分彩开奖结果就是DS菜谱里的顶

2019-01-02 @ 技术教程

实话说,最开始我对DS的执念还抱有一丝困惑,直到亲身体验了DS7这款车后,便对这个企业开始有了改观:DS对一款产品的描述能力,完全足矣支撑这个品牌在中国豪华市场扎根、立足。现阶

最美最仙最爱笑的小龙女都齐了最后一个尴尬了?

2019-01-02 @ 比赛新闻

李若彤版本的姑姑李若彤是香港影视演员,小龙女是李若彤塑造的第一个电视形象,被称为最美的小龙女,金庸先生曾经表示李若彤就是心目中的小龙女,而且她本人也是非常入戏的,以至于拍完这部

生涯新高+1球收比赛 爱笑的哈特运气不会差

2019-01-02 @ 比赛新闻

北京时间12月31日NBA常规赛继续进行,湖人2018年最后一场比赛,最终他们在主场以121比114击败了国王。本场比赛约什哈特表现出色14投8中拿到22分7篮板3助攻2抢断的

吃火锅看比赛!DOTA2重庆Major线下观赛全攻略

2019-01-02 @ 比赛新闻

这里是轻轨3号线,有去重庆北站乘坐高铁的请在龙头寺下车,有去龙头寺乘坐长途汽车的请在重庆北站下车。重庆市作为四大直辖市之一,电子竞技的氛围一直比较浓厚,Ti6冠军Wings战队