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

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

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

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

漏洞序列号

CVE-2016-8655

漏洞简介

PhilipPettersson在Linux中发现了一个标准的市场竞争漏洞(net/packet/af_packet.c),该漏洞可用于实现来自未授权进程的内核编码。网络攻击只需要本地低管理权限,就可以利用这个漏洞造成拒绝服务攻击(崩溃)或者用访问权限实现任意编码。

Packet_set_ring当建立环形缓冲区时,如果包版本是TPACKET_V3,则结构timer_list将被复位。在packet_set_ring之前,其他进程可以启用setsockopt将数据包版本设置为TPACKET_V1。此时,先前重置的计时器不容易被删除,这导致用户在关闭套接字时释放structtimer_list中函数指针的漏洞。

这个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必须包含在Internet类名中。在系统软件(Ubuntu,Fedora等。)可以使用管理权限低的类名的地方,这个可以按照非授权流程获取。这个漏洞可以在容器中打开,并最终捕获服务器内核。Android系统软件中,gid=3004/AID_NET_RAW的进程可以建立AF_PACKET套接字,打开BUG。

关键问题在于packet_set_ring()和packet_setsockopt()。使用PACKET_RX_RING选项在socket中启用setsockopt(),就可以拿下packet_set_ring()。

如果数据包套接字版本为TPCKET_V3且init_prb_bdqc()已启用,则packet_set_ring()将重置timer_list目标。

...

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()

当socket关闭时,packet_set_ring()会再次被使能释放环形缓冲区,并删除之前复位的定时器(当包版本超过TPACKET_V2时):

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

这里的难点在于init_prb_bdqc()实现后,packet_set_ring()回到过去,我们可以把packet的版本改成TPACKET_V1。

但是环形缓冲区复位后,会出现拒绝更改socket版本的情况,不过这完全不是问题:

...casePACKET_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)的互换中启用了中间,但是仍然有足够的室内空房间走这条编码路径。

此时,当socket关闭时,packet_set_ring()不容易删除timer,因为socket版本已经是TPACKET_V1了。概述定时器目标的结构timer_list位于结构packet_sock中,当kfree()被启用时,它将被释放。

然后,在计时器目标上方创建释放后使用漏洞,该漏洞可被针对SLAB调节器的各种攻击所利用。最后,定时器到期后,内核可以自动跳转到内置的函数指针。

在packet_setsockopt()中选择lock_sock(sk),在packet_set_ring()的开头和结尾锁定包版本,可以解决问题。

新的Ubuntu内核已经发布,客户可以通过升级到新的Ubuntu内核来解决问题。

漏洞概念验证

据发现该漏洞的创作者菲利普·彼得森(PhilipPettersson)称,漏洞PoC将于明天发布…

恢复模式

如上所述,每个Linux发行版都必须升级到最新版本的Linux内核。Ubuntu16.04LTS版的安全补丁已经发布。另外,本文阐述了不重启服务器打补丁下载UbuntuLinux内核的方案。

关于连接

https://cve.mitre.org/cgi-bin/cvename.cgi?名字=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/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/771687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-02
下一篇 2022-05-02

发表评论

登录后才能评论

评论列表(0条)

保存