5月份KeenTeam发现的CVE-2015-3636内核级的漏洞,严重程度跟去年的CVE-2014-3153相当,而且利用起来更容易,更稳定。
It was found that the Linux kernel’s ping socket implementation didn’t properly
handle socket unhashing during spurious disconnects which could lead to
use-after-free flaw.
On x86-64 architecture systems, a local user able to create ping sockets could
use this flaw to crash the system.
On non-x86-64 architecture systems, a local user able to create ping sockets
could use this flaw to increase their privileges on the system.
在CVE-2015-3636描述中提到该漏洞可以crach掉64位的系统,32位的系统可以提权,但是KeenTeam却第一时间xda上发布了s6的提权工具,说明一开始对64位系统能不能提权还是有一些保留。
CVE-2015-3636是UAF类型的漏洞,常见的利用方法:把设计好的buf覆盖到释放掉的内存空间,当UAF时,野指针就是指向shellcode的指针,从而达到控制的作用。实现上就是一种类似堆喷射的技巧,而其中的难点就是占位的问题。QEver在pediy上有分享了该漏洞的想法,大概的思路是正确的,但是离提权仍然差很远,而KCG的评论就离提权很近了。这侧面也反映了许多人手上已经有CVE-2015-3636的exploit了,只是没有拿出来公开,因为还具有商业用途(当然我也不会公开)。在大陆,没有商业价值的代码或者项目才会被利用来「开源」。
但是针对64位的s6,让sk的close指向shellcode是达不到提权效果,因为无法在内核态执行用户态代码(系统会Crach),解决方案当然是用Rop。KeenTeam在pingpongroot中利用设计好的ROp(在lollipop中),把栈地址泄露出来,然后计算出thread_info的基地址,再利用Rop把addr_limit修改了。这是调用了2次Rop,说明第1次close触发的Rop需要正常返回inet_release()。
函数inet_release:

inet_release函数中,最后会调用close,而函数指针close和参数timeout都是可控的(通过占位)。
需要泄露栈地址用到的rop:
需要返回到inet_release:
I据说说徐文(@Wen Xu)会在可能会在「Black Hat 2015」披露关于Android核心漏洞的更多详细信息,如果只有CVE-2015-3636的exploit的细节,那么是不是有点不够看呢??
最近附带一个crash的demo
https://github.com/betalphafai/cve-2015-3636_crash