Linux内核提权漏洞(CVE-2016-8655)
靶场网址
https://www.ichunqiu.com/experiment/detail?id=100192&source=2
操作机: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
漏洞危害
恶意访问者可以利用漏洞从普通权限提升到管理员权限,执行任意指令,直接威胁服务器的安全
实验步骤
登录进去之后
查看系统内核
版本是ubuntu4.2.0
查看当前权限
这个是普通用户的权限
进入POC所在目录
可以看到现在已经变成了root权限
漏洞分析
这个漏洞问题出在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),从而触发这个漏洞。
推荐阅读
-
Linux>=2.6.39 Mempodipper本地提权分析和EXP利用(CVE-2012-0056)
-
Linux服务器漏洞防护CVE级别 可SUDO提权到管理员
-
Linux 曝出严重安全漏洞,受限用户亦可提权至 Root 身份运行任意命令!(内附解决方案)
-
齐博cms最新SQL注入网站漏洞 可远程执行代码提权
-
如何使用Linux文本操作命令ed进行提权nov5详解
-
Linux下非交互式提权详解
-
Android提权漏洞CVE-2014-7920&CVE-2014-7921分析
-
提权学习:Linux中使用环境变量进行提权
-
windows内核提权(一)之栈溢出
-
Linux内核提权漏洞(CVE-2016-8655)