CopyFail:一个几乎影响所有主流Linux发行版的提权漏洞

admin 2026-05-03 04:39:09 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 2026年4月披露的Linux内核漏洞CVE-2026-31431(CopyFail)允许本地用户通过AF_ALG+splice()+authencesn组合利用链定向修改任意可读文件的页缓存4字节,实现稳定提权。该漏洞不依赖竞态条件,在Ubuntu、RHEL等多发行版验证有效,且修改仅存于内存页缓存难以被磁盘校验工具检测。攻击者可控制目标文件、偏移和写入值,威胁容器安全环境。 综合评分: 85 文章分类: 漏洞分析,漏洞预警,Linux安全,红队,实战经验


cover_image

Copy Fail:一个几乎影响所有主流 Linux 发行版的提权漏洞

原创

攻防路 攻防路

攻防录

2026年5月2日 04:00 内蒙古

在小说阅读器读本章

去阅读

简介

2026 年 4 月 29 日,Xint Code 披露了 Linux 内核漏洞 CVE-2026-31431,代号 Copy Fail

这不是一个靠抢时序的提权洞,而是一条很直的利用链。普通本地用户可以借助 AF_ALG + splice() + authencesn,把任意可读文件的页缓存改掉 4 个字节,再把目标对准 setuid 程序,最终拿到 root。原文给出的 PoC 只有 732 字节,而且在 Ubuntu、Amazon Linux、RHEL、SUSE 上都跑通了。

原文地址: https://xint.io/blog/copy-fail-linux-distributions

这次值得关注,不只是因为能本地提权,还因为它改的是页缓存,不是磁盘文件本体。很多只看磁盘校验值的检测手段,会直接漏掉这类修改。再往前走一步,共享页缓存还会把影响带进容器场景。原文已经把第二部分留给了 Kubernetes 容器逃逸。

漏洞验证 POC

https://github.com/theori-io/copy-fail-CVE-2026-31431

https://github.com/rootsecdev/cve_2026_31431

另外:cdk 已支持该漏洞。

技术原理

这次和 Dirty Cow、Dirty Pipe 有什么区别

Xint 在原文里把 Copy Fail 说得很克制,但几组对比放在一起看,威胁级别就很清楚了。

| 漏洞 | 典型特点 | 利用难点 | 这次的差别 | | — | — | — | — | | Dirty Cow | 经典 COW 竞态提权 | 需要抢时序,稳定性受环境影响 | Copy Fail 不靠 race,命中路径更直 | | Dirty Pipe | 管道缓冲区污染 | 受版本影响明显,利用条件更挑 | Copy Fail 在多家主流发行版上都复现了 | | Copy Fail | 页缓存被定向改 4 字节 | 需要同时踩中 AF_ALGsplice()authencesn | 改的是内存中的页缓存,磁盘文件不变,更隐蔽 |

原文里还有三个很关键的判断:

  1. 同一份脚本跨发行版可用,不需要为不同系统重写偏移。
  2. 触发路径是直线逻辑,不需要反复撞概率。
  3. 修改留在页缓存里,普通磁盘校验工具未必看得见。

漏洞利用链

先看三个角色:

  1. AF_ALG 把内核加密接口开放给了用户态,普通用户也能发起 AEAD 加解密请求。
  2. splice() 可以把文件页缓存直接送进 pipe,再送进 AF_ALG,中间不做普通拷贝。
  3. algif_aead.c 在 2017 年做过一次 in-place 优化,把输入和输出散列表连到了同一条链上。

问题就出在第三步。

原文给出的结构可以简化成下面这样:

Input SGL:     AAD  ||  CT  ||  Tag
                |       |        ^
                | copy  |        | sg_chain
                v       v        |
Output SGL:    AAD  ||  CT  -----+

req->src ----+
             |
             v
req->dst --> [ AAD || CT ] --> [ Tag (page cache pages) ]

表面上看,输出缓冲区前半段还是正常的 AAD || CT。但尾部的 Tag 不是重新拷贝出来的,而是通过 sg_chain() 继续引用原始页缓存页。这样一来,页缓存页就被挂进了一条“可写”的目标散列表。

这一步非常关键。因为后面只要有 AEAD 算法越过边界写数据,写到的就不再是普通用户缓冲区,而是目标文件对应的页缓存。

真正的越界写发生在哪

原文把触发点锁定在 authencesn

这个模板本来是给 IPsec 的 ESN 场景准备的。它会把序列号高 32 位和低 32 位重新拼装,用来做 HMAC 计算。问题在于,它拿“调用者的目标缓冲区”当了临时草稿区。

原文列出的关键代码是:

scatterwalk_map_and_copy(tmp, dst, 0, 8, 0);
scatterwalk_map_and_copy(tmp, dst, 4, 4, 1);
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);

前两次改写还在 AAD 范围里,最后一次就不一样了。它会把 4 字节的 seqno_lo 写到 dst[assoclen + cryptlen],也就是 AEAD 输出边界之后的位置。

如果这时 dst 后面挂着的是目标文件的页缓存页,那这 4 个字节就直接落进页缓存了。

攻击者一共能控制三件事:

| 可控项 | 原文说明 | | — | — | | 写哪个文件 | 任何当前用户可读文件 | | 写到哪个偏移 | 由 splice 偏移、长度和 assoclen 一起决定 | | 写成什么值 | 来自 AAD 里可控的 4 字节 seqno_lo |

这也是为什么它危险。它不是“随机把某块内存搞坏”,而是一种有目标、有偏移、有值的 4 字节定向改写。

这个洞不是单点失误,而是三次改动叠加

原文把时间线梳得很清楚,按这个顺序看最好理解:

| 时间 | 改动 | 结果 | | — | — | — | | 2011 年 | authencesn 进入内核,开始用目标缓冲区做临时写入 | 当时影响范围有限,还没形成漏洞链 | | 2015 年 | AF_ALG 支持 AEAD;authencesn 迁到新 AEAD 接口 | 已经出现越界写偏移,但当时还是 out-of-place | | 2017 年 | algif_aead.c 引入 in-place 优化,提交为 72548b093ee3 | 页缓存页被挂进可写目标散列表,漏洞正式成形 |

把三件事拆开看,每一步都像是合理优化。问题出在没人把这三处连起来一起验证。于是一个能稳定提权的 bug,在主线内核里安静躺了接近十年。

漏洞影响范围测试

截至 2026 年 4 月 29 日,Xint 公开列出的直接测试结果如下:

| 发行版 | 内核版本 | | — | — | | Ubuntu 24.04 LTS | 6.17.0-1007-aws | | Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | | RHEL 10.1 | 6.12.0-124.45.1.el10_1 | | SUSE 16 | 6.12.0-160000.9-default |

往期推荐 📚

GitHub PoC 实时雷达

taste-skill:AI前端审美外挂

Burp 官方 MCP Server

欢迎关注“攻防录”✨


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:攻防录 攻防路 攻防路《Copy Fail:一个几乎影响所有主流 Linux 发行版的提权漏洞》

评论:0   参与:  0