CVE-2015-3636

最近这今年,寻找一个android系统上可通用使用的root提权漏洞变得越来越困难,一方面是因为android系统的碎片化十分严重,另一方面是因为android系统上的漏洞缓冲机制在不断的引入。在这篇文章中我将为大家简单的讲述一下CVE-2015-3636这个漏洞的poc和exploit。其实要去稳定和有效的去利用这样一个漏洞并不是一件容易的事情,我们一步一步的来看。

0.漏洞概述:

漏洞属于linux内核级别的use-after-free漏洞,存在于Linux内核的Ping.c文件中。当用户尝试通过一个socket(AF_INET,SOCK_DGRAM,IPPROTO_ICMP)所返回的socket file descriptor来调用两次一个sa_family==AF_UNSPEC的connect()时就会因为访问0x200200这个地址引起系统crash。除此,如果攻击者巧妙的填充或者覆盖PING socket对象,就能达到获取root权限的目的。并且,正是因为漏洞存在于android系统的基础部分Linux内核当中,才让这个漏洞有能通用利用的可能性。

1.漏洞分析&poc

这个漏洞是被keen team团队的Wen Xu和Wu shi发现并尝试利用的,目前已经被修补,CVE编号为:CVE-2015-3636。

我们从漏洞的补丁来分析漏洞:


我们从补丁源码可以看出,里面添加了sk_nulls_node_init(sk->nulls_node);这样一句代码。那么好,以这句话为切入点,结合前面概述中提到的poc思路分析漏洞原理。

通过浏览内核代码中关于sk_nulls_node_init(hlist_nulls_node *node)函数的具体实现后发现,其实这个函数的作用就是将参数所传入的的node的next成员和pprev成员赋为NULL。


概述中我们讲到的,利用socket(AF_INET,SOCK_DGRAM,IPPROTO_ICMP)所返回的socket file descriptor来调用两次一个sa_family==AF_UNSPEC的connect()时就会因为访问0x200200这个地址引起系统crash。接下来我们跟踪一下代码执行流程。

首先使用sa_family==AF_UNSPEC调用connect时会进入到inet_dgram_connect()函数中,

我们从补丁源码可以看出,里面添加了sk_nulls_node_init(sk->nulls_node);这样一句代码。那么好,以这句话为切入点,结合前面概述中提到的poc思路分析漏洞原理。

通过浏览内核代码中关于sk_nulls_node_init(hlist_nulls_node *n)函数的具体实现后发现,其实这个函数的作用就是将参数所传入的的hlist_null_node的next成员和pprev成员赋为NULL。

概述中我们讲到的,利用socket(AF_INET,SOCK_DGRAM,IPPROTO_ICMP)所返回的socket file descriptor来调用两次一个sa_family==AF_UNSPEC的connect()时就会因为访问0x200200这个地址引起系统crash。接下来我们跟踪一下代码执行流程。

首先使用sa_family==AF_UNSPEC调用connect时会进入到inet_dgram_connect()函数中,在函数中我们可以看到因为sa_family==AF_UNSPEC导致程序会执行红框中

的逻辑,而这条语句中最终调用了sk->sk_prot->disconnect(sk,flags)函数,sk_prot是sk对象的的一个成员&#

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值