设为首页 收藏本站
查看: 597|回复: 0

[经验分享] Linux内核提权漏洞(CVE-2016-8655)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-19 12:31:27 | 显示全部楼层 |阅读模式
  • 操作机:Ubuntu 15.10(内核版本4.2.0)

  • chocobo_root:是本次试验的POC文件,通过执行它来验证漏洞

漏洞简介
此漏洞可用于从未授权进程中执行内核代码,攻击者只需要本地普通权限,就能利用该漏洞导致拒绝服务(系统奔溃)或提升到管理员权限。
这个漏洞最早出现于2011年4月19日的代码中:[代码地址][[https://github.com/torvalds/linu ... e83e5ac6828b638603a]
直到2016年11月30号被修复,修复详情请阅读:[详情地址][https://git.kernel.org/cgit/linu ... 91617700174c2c19b0c]
漏洞危害
攻击者可以利用漏洞从普通权限提升到管理员权限,执行任意指令,直接威胁服务器的安全
影响范围
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()函数,如下:
1
2
3
4
5
6
7
8
9
10
11
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,会释放和删除先前初始化的定时器:


1
2
3
4
5
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被初始化后,可以尝试拒绝改变套接字版本。但是这样的校验是不完整的。
1
2
3
4
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                  查看用户属性

测试
QQ截图20161219123133.png


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316450-1-1.html 上篇帖子: CentOS6.8下简单快速安装SVN-测试小白的福利 下篇帖子: Rsync结合Inotify 实时同步配置 Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表