一个存在了14年的Linux内核漏洞,能让本地攻击者拿到root权限,在概念验证环境里甚至能逃出Docker容器,反过来控制宿主机。

问题出在Linux的AF_ALG用户态加密接口上。这个接口允许非特权本地进程访问,对内核研究者来说是一块很有价值的攻击面。漏洞的根源,是对同一个socket的并发写入不安全——多个线程同时往用于AES加解密等操作的socket里写数据,就可能出问题。

打开网易新闻 查看精彩图片

漏洞是怎么被发现的

2025年,STAR Labs的安全研究员Muhammad Alifa Ramdhan在为谷歌kernelCTF项目审计Linux内核代码时发现了这个问题。他和同事Bing-Jhong Billy Jheng一起完成了研究,证明这个bug可以被开发成一个可靠的本地提权利用工具。

据报道,这次kernelCTF提交获得了113,337美元的奖励。CISA也已将CVE-2025-39964列入"已被在野利用"的漏洞名单,这让打补丁的紧迫性进一步上升。

竞态条件如何变成提权工具

底层问题是一个竞态条件,出在AF_ALG的sendmsg()处理路径上。正常情况下,内核会跨一个或多个请求收集加密输入,用scatter-gather列表跟踪这些缓冲区。有一个叫merge的上下文标志,表示最后一个缓冲区还有未使用的页空间,可以安全追加新数据。

但两个线程可以同时对同一个AF_ALG操作socket发起写入。虽然socket锁保护了大部分状态变更,可当某个线程在等待可写缓冲区空间时,内核会释放这把锁。这就给了另一个写入者机会,在原来的线程恢复之前修改共享上下文。

根据IDNsec的研究,攻击者可以操纵时序,让ctx->merge保持启用状态,而最终的scatter-gather列表里却没有有效条目。这样一来,后续写入就会通过sg[-1]访问到目标数组之前的元数据。这个越界访问之所以危险,是因为攻击者控制的堆数据可以影响伪造的scatterlist元数据。

研究者利用这个条件构造了一个usercopy oracle,最终推导出任意内核写入原语。接下来,利用程序会覆盖core_pattern——这是控制Linux如何处理进程核心转储的内核设置。当core_pattern以管道符开头时,Linux会把配置的程序当作核心转储处理器来执行。替换这个值并让一个子进程崩溃,概念验证就能以root权限运行攻击者控制的二进制文件。

由于容器共享宿主内核,同样的内核级原语在受影响的配置下可以实现Docker容器逃逸。

哪些版本受影响

这段有漏洞的代码是2011年随Linux 2.6.38引入的,暴露时间大约14年。受影响版本包括修复后的稳定版之前的内核,具体还要看各发行版是否做了backport。

公开公告列出的修复版本包括:

Linux 5.10.246

Linux 5.15.195

Linux 6.1.155

Linux 6.6.109

Linux 6.12.50

Linux 6.16.10

上游Linux开发者修复这个问题的方式,是给AF_ALG上下文加上独占写入所有权。补丁引入了ctx->write状态检查,让第二个并发写入者直接失败,而不是去改动socket的共享状态。

管理员应该尽快安装所在发行版的已修补内核包,并重启进入更新后的内核。组织需要优先处理共享Linux基础设施、容器宿主机、多用户系统,以及那些会执行不受信任本地代码或租户工作负载的环境。