Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【漏洞预警】CVE-2016-8655:Linux内核通杀提权漏洞(21:45更新POC)

$
0
0
【漏洞预警】CVE-2016-8655:linux内核通杀提权漏洞(21:45更新POC)

2016-12-07 21:48:10
来源:安全客 作者:adlab_mickey

阅读:15253次
点赞(0)
收藏





【漏洞预警】CVE-2016-8655:Linux内核通杀提权漏洞(21:45更新POC)

漏洞发现人:Philip Pettersson

漏洞编号:CVE-2016-8655

漏洞危害:高危,低权限用户利用该漏洞可以在Linux系统上实现本地提权。

影响范围:Linux内核(2011年4月19日发行)开始就受影响了,直到2016年11月30日修复。


漏洞描述

Philip Pettersson在Linux (net/packet/af_packet.c)发现条件竞争漏洞,可以让低权限的进程获得内核代码执行权限。

这个bug最早出现于2011年4月19号的代码中,详细请参考:

https://github.com/torvalds/linux/commit/f6fb8f100b807378fda19e83e5ac6828b638603a

它于2016年11月30号被修复,详细请参考:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=84ac7260236a49c79eede91617700174c2c19b0c


漏洞细节

新建AF_PACKE套接字你需要CAP_NET_RAW在你的网络命名空间,然而系统中非权限的进程在非权限的命名空间可以获得这个能力(Ubuntu,Fedora等发行版),这个漏洞可以在容器内触发,从而入侵整个主机内核。在android上,有gid=3004/AID_NET_RAW的进程可以新建AF_PACKET套接字(mediaserver),从而触发这个漏洞。

问题出在inside packet_set_ring() 和 packet_setsockopt()函数中,我们可以看到当套接字使用PACKET_RX_RING选项时候,packet_set_ring()会调用setsockopt()函数。

如果套接字的版本是TPACKET_V3,一个 timer_list对象将会在init_prb_bdqc()调用时被 packet_set_ring()初始化。

switch(po->tp_version){ caseTPACKET_V3: /*Transmitpathisnotsupported.Wechecked *itabovebutjustbeingparanoid */ if(!tx_ring) init_prb_bdqc(po,rb,pg_vec,req_u); break; default: break; }

函数的流程如下:

packet_set_ring()->init_prb_bdqc()->prb_setup_retire_blk_timer()->prb_init_blk_timer()->prb_init_blk_timer()->init_timer()

当套接字关闭,packet_set_ring()会再次被调用,如果packet的版本> TPACKET_V2,会释放和删除先前初始化的定时器。

if(closing&&(po->tp_version>TPACKET_V2)){ /*Becausewedon'tsupportblock-basedV3ontx-ring*/ if(!tx_ring) prb_shutdown_retire_blk_timer(po,rb_queue); }

当packet版本为TPACKET_V1时,init_prb_bdqc()将会在packet_setsockopt()后被执行,在packet_set_ring() 函数前返回。

ring buffer被初始化后,可以尝试拒绝改变套接字版本。但是这样的校验是不完整的。

casePACKET_VERSION: { ... if(po->rx_ring.pg_vec||po->tx_ring.pg_vec) return-EBUSY;

在 packet_set_ring()中init_prb_bdqc() 和 swap(rb->pg_vec, pg_vec) 之间的调用有足够的空间来竞争这条代码路径

当套接字关闭,packet_set_ring()将不会删除定时器,因此这时套接字的版本为TPACKET_V1,timer_list 结构体描述定时器对象定位在内部的packet_sock结构体中,套接字将调用kfree()释放。

我们可以在通过UAF利用定时器对象上对SLAB分配器实现不同的中毒攻击(我发现add_key()是最可靠的),这最终会导致当定时器过期内核跳到处理函数。

通过在packet_setsockopt()中使用lock_sock(sk)来修复这个bug,同时锁定packet版本。


漏洞验证

【漏洞预警】CVE-2016-8655:Linux内核通杀提权漏洞(21:45更新POC)

【漏洞预警】CVE-2016-8655:Linux内核通杀提权漏洞(21:45更新POC)

【漏洞预警】CVE-2016-8655:Linux内核通杀提权漏洞(21:45更新POC)

POC

http://pastebin.com/qe6dYkeP


修复方法

各linux发行版自行更新内核到最新版本。


相关链接

http://seclists.org/oss-sec/2016/q4/607

http://malwarejake.blogspot.com/2016/12/new-linux-privilege-escalation.html

https://security-tracker.debian.org/tracker/CVE-2016-8655

https://github.com/torvalds/linux/commit/f6fb8f100b807378fda19e83e5ac6828b638603a

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=84ac7260236a49c79eede91617700174c2c19b0c

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8655

https://www.ubuntu.com/usn/usn-3151-1/



【漏洞预警】CVE-2016-8655:Linux内核通杀提权漏洞(21:45更新POC)
【漏洞预警】CVE-2016-8655:Linux内核通杀提权漏洞(21:45更新POC)
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/3267.html

Viewing all articles
Browse latest Browse all 12749

Trending Articles