Linux内核提权漏洞(CVE-2016-8655)
2016-12-17 01:46
471 查看
操作机:
漏洞简介此漏洞可用于从未授权进程中执行内核代码,攻击者只需要本地普通权限,就能利用该漏洞导致拒绝服务(系统奔溃)或提升到管理员权限。这个漏洞最早出现于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]漏洞危害攻击者可以利用漏洞从普通权限提升到管理员权限,执行任意指令,直接威胁服务器的安全影响范围Linux内核(2011年4月19日发行)开始就受影响了,直到2016年11月30日修复。( 注:这里并非指从11年到16年所有的Linux内核都会受到影响,敬请依据各系统情况而定)
当套接字关闭,packet_set_ring()会再次被调用,如果packet的版本> TPACKET_V2,会释放和删除先前初始化的定时器:
当packet版本为TPACKET_V1时,init_prb_bdqc()将会在packet_setsockopt()后被执行,在packet_set_ring() 函数前返回。ring buffer被初始化后,可以尝试拒绝改变套接字版本。但是这样的校验是不完整的。
在 packet_set_ring()中init_prb_bdqc() 和 swap(rb->pg_vec, pg_vec) 之间的调用有足够的空间来竞争这条代码路径当套接字关闭,packet_set_ring()将不会删除定时器,因此这时套接字的版本为TPACKET_V1,timer_list 结构体描述定时器对象定位在内部的packet_sock结构体中,套接字将调用kfree()释放。我们可以在通过UAF利用定时器对象上对SLAB分配器实现不同的中毒攻击,这最终会导致当定时器过期内核跳到处理函数。新建AF_PACKE套接字你需要CAP_NET_RAW在你的网络命名空间 ,然而系统中非权限的进程在非权限的命名空间可以获得这个能力(Ubuntu, Fedora等发行版),这个漏洞可以在容器内触发,从而入侵整个主机内核。在android上,有 gid=3004/AID_NET_RAW的进程可以新建AF_PACKET套接字 (mediaserver),从而触发这个漏洞。
id 查看用户属性
测试
Ubuntu 15.10(内核版本4.2.0)
chocobo_root:是本次试验的POC文件,通过执行它来验证漏洞
漏洞简介此漏洞可用于从未授权进程中执行内核代码,攻击者只需要本地普通权限,就能利用该漏洞导致拒绝服务(系统奔溃)或提升到管理员权限。这个漏洞最早出现于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]漏洞危害攻击者可以利用漏洞从普通权限提升到管理员权限,执行任意指令,直接威胁服务器的安全影响范围Linux内核(2011年4月19日发行)开始就受影响了,直到2016年11月30日修复。( 注:这里并非指从11年到16年所有的Linux内核都会受到影响,敬请依据各系统情况而定)
实验步骤
本实验首先分析其原理,然后利用POC对漏洞进行验证步骤1:分析漏洞
本步骤将分析其漏洞产生的原理这个漏洞问题出在inside packet_set_ring() 和 packet_setsockopt()函数中,我们可以看到当套接字使用PACKET_RX_RING选项时候,packet_set_ring()会调用setsockopt()函数,如下:switch (po->tp_version) { case TPACKET_V3: /* Transmit path is not supported. We checked * it above but just being paranoid */ if (!tx_ring) init_prb_bdqc(po, rb, pg_vec, req_u); break; default: break; }在上述代码中可以看到,如果套接字的版本是TPACKET_V3,一个 timer_list对象将会在init_prb_bdqc()调用时被 packet_set_ring()初始化。上述函数的流程如下: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)) { /* Because we don't support block-based V3 on tx-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被初始化后,可以尝试拒绝改变套接字版本。但是这样的校验是不完整的。
case PACKET_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分配器实现不同的中毒攻击,这最终会导致当定时器过期内核跳到处理函数。新建AF_PACKE套接字你需要CAP_NET_RAW在你的网络命名空间 ,然而系统中非权限的进程在非权限的命名空间可以获得这个能力(Ubuntu, Fedora等发行版),这个漏洞可以在容器内触发,从而入侵整个主机内核。在android上,有 gid=3004/AID_NET_RAW的进程可以新建AF_PACKET套接字 (mediaserver),从而触发这个漏洞。
使用POC验证漏洞
uname -a 查看系统内核版本id 查看用户属性
测试
相关文章推荐
- CVE-2016-8655,af_packet Linux 內核通殺提權漏洞淺析
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
- 2016新年Bash的CVE-2014-6271漏洞修复经历
- CVE-2016-5696漏洞分析:TCP侧信道安全 Leon不会玩
- ImageMagick漏洞(cve-2016-3714)利用及修复
- CVE-2016-0199浅析-Internet Explorer内存损坏漏洞
- Jenkins-CVE-2016-0792漏洞利用及修复建议
- 微软“WebDAV”提权漏洞(cve-2016-0051)初探
- 危害9亿安卓设备高通漏洞细节曝光(CVE-2016-3842,含POC)
- CVE-2016-6771: Android语音信箱伪造漏洞分析
- 体验ImageMagick 命令执行漏洞(CVE-2016–3714)的PoC
- Oracle的酒店管理平台RCE漏洞以及持卡人数据泄漏(CVE-2016-5663/4/5)
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
- CVE-2016-1240(Tomcat本地提权漏洞分析与复现)
- Tomcat曝本地提权漏洞 (CVE-2016-1240 附PoC)
- Nexus 9 摄像头驱动中的信息泄漏漏洞(CVE-2016-3794)分析
- MySQL远程代码执行(CVE-2016-6662)漏洞预警
- Web安全 -- CVE-2016-10033漏洞
- 阿里云服务器漏洞phpmyadmin CVE-2016-6617解决方法