Linux 内核近日又曝出权限提升漏洞,该漏洞可追溯至 2005 年,漏洞影响 Linux 操作系统主要发行版本,包括 Redhat、Debian、OpenSUSE 和 Ubuntu。利用该漏洞,攻击者可以从低权限进程中进行内核代码执行。目前已知受影响的最老版本是 2.6.18(2006 年 9 月),不过该漏洞可能在先前的版本中已经存在,或许从支持 DCCP 开始( 2005 年 10 月的 2.6.14)就已经存在问题了。
在 Seclists.org 发布该漏洞的作者 Andrey Konovalov 表示,很快就会放出 PoC,在此期间给予修复时间。
安全研究员 Andrey Konovalov 最近用 Syzkaller fuzzing 工具,发现了 DCCP 协议实现中的 Linux 内核漏洞,漏洞潜伏时间超过 10 年。
DCCP协议
DCCP协议是面向消息的传输层协议,可最小化数据包报头带来的开销和终端处理的工程量。该协议可建立、维护和拆卸不可靠连接的数据流以及对不可靠数据流进行拥塞控制。
该 DCCP 双重释放漏洞可允许本地低权限用户修改 Linux 内核内存,导致拒绝服务(系统崩溃),或者提升权限,获得系统的管理访问权限。
漏洞详情
这是个 UAF 漏洞:在 IPV6_RECVPKTINFO 开启的情况下,内核解析DCCP 协议的流程中判断已经收到了 DCCP_PKT_REQUEST 返回包,就会释放解析过程使用的 SKB 地址。(“DCCP protocol implementation freed SKB (socket buffer) resources for a DCCP_PKT_REQUEST packet when the IPV6_RECVPKTINFO option is set on the socket.”)
按现在的实现,解析 DCCP 协议的流程中如果 dccp_v6_conn_request 有返回值,就会通过 dccp_rcv_state_process 中的 __kfree_skb 释放掉解析过程中收到了 DCCP_PKT_REQUEST 返回包的 SKB 地址。但是,如果 IPV6_RECVPKTINFO 开启的情况下编译内核,skb 地址就会被存储在 ireq->pktopts,而 dccp_v6_conn_request 中的引用计数会增加,这样 skb 就仍然会被使用。直到 dccp_rcv_state_process 进程中才会被释放。
攻击者使用某些内核堆喷射技术就能控制任意对象,并用任意数据重写其内容。如果重写过的对象中包含任何可触发的函数指针,攻击者便可在该内核中执行任意代码。这个漏洞并不是远程代码执行漏洞,所以攻击者必须拥有系统本地账户,才能利用该漏洞。
两个月前,Linux内核也曝出了类似的提权漏洞CVE-2016-8655,该漏洞可以追溯到2011年,低权限本地用户利用Linux内核af_packet实现中的竞争条件,可获得root权限(漏洞详情)。
修复方案
手动修复:调用consume_skb,而非跳转discard并调用__kfree_skb。
更详细的修复方案请点击这里。如果你是高级Linux用户,那么可以应用补丁,重新构建内核,或者等待发行商发布更新。
稿源:FreeBuf, 由 FB 小编 kuma 编译;封面源自 FreeBuf
from hackernews.cc.thanks for it.