linux内核竞争条件漏洞,【漏洞预警】CVE-2016-8655:Linux内核竞争条件漏洞

Seclists.org全新公布了Linux的市场竞争标准漏洞,漏洞序号为CVE-2016-8655。此漏洞可用以从低管理权限进程中实行内核编码。

漏洞序号

CVE-2016-8655

漏洞简述

Philip Pettersson在Linux (net/packet/af_packet.c)发觉标准市场竞争漏洞,此漏洞可用以从没受权进程中实行内核编码。网络攻击只必须当地低管理权限,就能运用该漏洞致拒绝服务攻击(崩溃)或是以访问权限实行随意编码

packet_set_ring在建立ring buffer的情况下,假如packet版本为TPACKET_V3,则会复位struct timer_list。在packet_set_ring进行以前,别的进程可启用setsockopt将packet版本设置为TPACKET_V1。这时此前复位的timer不容易被删掉,也就产生了套接字关掉时struct timer_list中函数指针的user after free漏洞。

这一BUG最开始出現于2011年4月19号的编码中,详尽参照:

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

该BUG早已于2016年11月30号被恢复,详尽参照:

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

漏洞关键点

要建立AF-PACKET套接字,在互联网类名中就必须CAP_NET_RAW。在低管理权限类名能用的系统软件中(Ubuntu、Fedora等),这能够根据未受权进程获得。这一漏洞在器皿中就可以开启,最后攻占服务器内核。在Android系统软件中,带gid=3004/AID_NET_RAW的进程可建立AF_PACKET套接字,并开启该BUG。

难题关键出在packet_set_ring()和packet_setsockopt()中。应用PACKET_RX_RING选择项在socket中启用setsockopt(),就能拿下packet_set_ring()。

假如packet套接字版本为TPCKET_V3,启用init_prb_bdqc()的情况下,packet_set_ring()便会对timer_list目标开展复位。

...

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; }...

建立timer的涵数流为:

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

该套接字关掉时,packet_set_ring()会再一次被启用,来释放出来ring buffer,并删掉此前复位的timer(当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); }...

这里的难题就出在,在init_prb_bdqc()实行以后,packet_set_ring()回到以前,我们可以将packet版本改成TPACKET_V1。

但是ring buffer被复位以后,会存有回绝改动套接字版本的状况,但这也压根并不是什么问题:

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

在init_prb_bdqc()和packet_set_ring()的互换(rb->pg_vec, pg_vec)启用中间,還是有充足的室内空间来拿下这条编码途径。

这时,套接字关掉时,因为套接字版本早已为TPACKET_V1,packet_set_ring()就不容易删掉timer。勾勒timer目标的struct timer_list坐落于struct packet_sock中,启用kfree()便会释放出来。

接着timer目标以上就产生了use after free漏洞,可被各种各样对于SLAB调节器的进攻运用。最后timer到期后,就可造成 内核自动跳转至搭建的函数指针。

在packet_setsockopt()选用lock_sock(sk),另外在packet_set_ring()起止就锁住packet版本就可以解决困难。

新版本Ubuntu内核早已释放,客户升級至新版本Ubuntu就可以解决困难。

漏洞PoC

依照发觉该漏洞的创作者Philip Pettersson常说,漏洞PoC会在明日释放…

恢复方式

如上所述,各Linux发行版必须升級至最新版本Linux内核。对于Ubuntu 16.04 LTS的安全补丁早已公布。此外本文解读了不在重启服务器的状况下,就对Ubuntu Linux内核打上补丁下载的计划方案。

有关连接

https://cve.mitre.org/cgi-bin/cvename.cgi?name=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://www.ubuntu.com/usn/usn-3151-1/

热搜词

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值