About CVE-2015-1805

Google突发更新的advisory,就已经表明出该漏洞的严重。可能由于2015年KeenTeam借3636来大肆宣传,大家都在研究3636,才导致1805漏洞一直被忽略,其实1805才算得上是2015年最严重的漏洞。市面上流行的root工具,像某数字,某精灵等,早就开始利用1805,贵行业水还是蛮深的啊。
CVE-2015-1805漏洞成因跟后来公布的CVE-2015-6640相类似:

1. 拷贝数据是元子操作;
2. 拷贝数据时,如果发生错误,会尝试重新拷贝一次;(很奇葩的逻辑)
3. 重新尝试拷贝数据时,数据的长度没有处理,导致可以修改任意地址。

CVE-2015-1805
Google Advisory
Patch

CVE-2015-3636

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:
p1
inet_release函数中,最后会调用close,而函数指针close和参数timeout都是可控的(通过占位)。


需要泄露栈地址用到的rop:
p2


需要返回到inet_release:
p3


I据说说徐文(@Wen Xu)会在可能会在「Black Hat 2015」披露关于Android核心漏洞的更多详细信息,如果只有CVE-2015-3636的exploit的细节,那么是不是有点不够看呢??

最近附带一个crash的demo
https://github.com/betalphafai/cve-2015-3636_crash