CVE-2026-31431CopyFail通俗解析

admin 2026-05-02 05:30:06 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: CVE-2026-31431,称为CopyFail,是一个影响Linux内核的严重漏洞。该漏洞允许普通用户在不需要任何特殊条件的情况下,通过运行一个短小的Python脚本来轻松获得root权限。漏洞的根本原因是在2017年引入的优化中,页缓存页面错误地被链接到了可写的Scatterlist中。 综合评分: 95 文章分类: 渗透测试,代码审计,漏洞分析,安全意识


cover_image

CVE-2026-31431 Copy Fail 通俗解析

原创

mimi3389 mimi3389

赛博生存指南

2026年5月1日 08:48 浙江

在小说阅读器读本章

去阅读

一句话总结

一个普通用户,运行一段只有 732 字节(比一条微信消息还短)的 Python 脚本,就能在几乎所有 Linux 系统上瞬间获得 root(最高管理员)权限。不需要任何运气,不需要任何特殊条件,运行一次就成功。


用生活比喻理解

想象一个图书馆:

  • • 硬盘 = 书架上的书(原始文件)
  • • 页缓存(Page Cache) = 桌上的复印件(内存中的副本)
  • • 当系统要读文件时,它不去书架拿原书,而是直接读桌上的复印件

正常情况下,只有图书管理员(root)才能在复印件上写字。但这个漏洞让普通读者也能偷偷改复印件,而书架上的原书完好无损。


漏洞怎么来的?(三个”各自正确,组合致命”的改动)

2011 年

authencesn 加密算法写进内核。它在计算时会借用”目标缓冲区”当草稿纸,写 4 个字节。本来没问题,因为当时只有内核内部调用它。

2015 年

AF_ALG 加密接口开放给普通用户。用户可以通过系统调用让内核做加密运算。但当时输入输出是分开的(out-of-place),页缓存在”只读”的那边,没事。

2017 年

为了性能,开发者做了个优化:让输入输出共用同一块内存(in-place)。页缓存页面被链进了”可写”的区域。

问题:没有人意识到这三个改动叠加后,authencesn 那个”草稿纸上写 4 字节”的操作,会越过边界,直接写到页缓存里。

原本的设计意图:
  输入区(只读)    →  输出区(可写,用户自己的内存)
                          ↑ 算法在这里写草稿,安全

2017 年优化后实际发生的事:
  输出区(用户内存) → [链入的页缓存页面 ← 算法的草稿写到这里了!]
                       ↑ 文件的内存副本被改了

攻击者能控制什么?

| 控制项 | 说明 | | — | — | | 改哪个文件 | 任何当前用户可读的文件(包括 /usr/bin/su) | | 改哪个位置 | 通过调整参数精确控制偏移量 | | 改成什么值 | 4 个字节完全由攻击者指定 |


攻击过程(4 步)

步骤 1:打开一个加密 socket(普通用户就能做)
步骤 2:构造特殊数据,把 /usr/bin/su 的页缓存"喂"给加密算法
步骤 3:触发解密 → 内核在页缓存上写入攻击者的 shellcode
步骤 4:执行 su → 内核从被污染的页缓存加载 → 恶意代码以 root 身份运行

为什么可怕

  • • 不需要碰运气(无竞争条件,100% 成功)
  • • 不需要改硬盘(只改内存,重启就恢复,取证工具查磁盘发现不了)
  • • 通用(同一个脚本通杀 Ubuntu、RHEL、Amazon Linux、SUSE……)
  • • 跨容器(页缓存在宿主机和所有容器间共享,容器内攻击可影响宿主机)

为什么叫 “Copy Fail”?

因为 authencesn 在处理 ESN(扩展序列号)时,本该把数据复制到安全的地方再操作,但它没有复制(Copy),直接在别人的地盘上写,所以叫 Copy Fail


影响范围

| 范围 | 详情 | | — | — | | 内核版本 | Linux 4.14(2017)至修复前,约 9 年 | | 发行版 | Ubuntu、RHEL、Debian、Amazon Linux、SUSE、Arch、Fedora 等全部主流发行版 | | 利用前提 | 只需要一个普通用户的本地 shell | | CVSS 评分 | 7.8(高危),但实际风险被低估 |


怎么修?

根治

升级内核到包含补丁 a664bf3d603d 的版本。

补丁做的事情很简单 —— 回退 2017 年的优化,让输入输出重新分开(out-of-place),页缓存页面就再也不会出现在可写区域了。

临时缓解(不能重启时)

echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null

这会禁用 algif_aead 模块,对 99% 的业务没有影响(SSH、TLS、磁盘加密、IPsec 都不依赖它)。


和历史漏洞对比

| | Dirty Cow (2016) | Dirty Pipe (2022) | Copy Fail (2026) | | — | — | — | — | | 需要碰运气? | 是(竞争条件) | 否 | | | 需要特定版本? | 否 | 是(≥5.8) | | | 可靠性 | 30-80% | 高 | 100% | | 影响窗口 | 广 | 窄 | 9 年 | | 跨容器? | 有限 | 有限 | |


对你的实际意义

  • • 如果你用 Windows不受影响。这是 Linux 内核漏洞。
  • • 如果你管理 Linux 服务器:尽快升级内核,或临时禁用 algif_aead 模块。
  • • 如果你用云服务器(ECS/EC2):多租户场景风险极高,优先处理。
  • • 如果你跑 Kubernetes:容器逃逸风险,宿主机和所有 Pod 都可能被控制。

技术细节补充(给想深入了解的人)

根因:页缓存页面进入了可写的 Scatterlist

AF_ALG 是一种 socket 类型,将内核的加密子系统暴露给非特权用户空间。用户可以打开一个 socket,绑定到任何 AEAD 模板,并对任意数据调用加密或解密。无需任何特权。

splice() 是核心原语:它在文件描述符和管道之间传输数据而不进行复制,通过引用传递页缓存页面。当用户将文件 splice 到管道中,然后再 splice 到 AF_ALG socket 时,该 socket 的输入 scatterlist 会持有该文件缓存页面的直接引用。

对于 AEAD 解密,输入格式为 AAD || ciphertext || authentication_tag。在 algif_aead.c 中,recvmsg() 将操作设置为就地(in-place)模式,这意味着同一个 scatterlist 同时作为加密算法的输入和输出。

AAD 和 ciphertext 数据通过 memcpy_sglist 从输入 scatterlist 字节复制到输出缓冲区。这是一次真正的复制,页缓存页面只被读取。但认证标签(authentication tag,输入 scatterlist 的最后 authsize 字节)没有被复制。内核保留了标签的 scatterlist 条目,并使用 sg_chain() 将它们链接到输出 scatterlist 的末尾:

Input SGL:  AAD || CT || Tag
                |         ^
              copy |       | sg_chain (still references page cache pages)
                v         |
Output SGL: AAD || CT ----+

输出 scatterlist 现在有两个区域:用户的 recvmsg 缓冲区(包含复制的 AAD 和 ciphertext),后面跟着链接的标签页面,仍然引用目标文件的原始页缓存页面。

触发器:authencesn 的临时写入

authencesn 是一个 AEAD 包装器,用于 IPsec 的扩展序列号(ESN)支持。它使用调用者的目标缓冲区作为临时空间。在 crypto_authenc_esn_decrypt() 中:

scatterwalk_map_and_copy(tmp, dst, 0, 8, 0);                          // 读取 AAD 字节 0-7
scatterwalk_map_and_copy(tmp, dst, 4, 4, 1);                          // 用 seqno_hi 覆盖 dst[4..7]
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);    // 在 tag 之后写入 seqno_lo

第三次调用在偏移量 assoclen + cryptlen 处写入 4 字节,越过了 AEAD 标签。该算法正在使用它不拥有的内存作为草稿本。

该位置的原始字节永久丢失。HMAC 计算随后运行并失败(密文是伪造的),因此 recvmsg() 返回错误,但 4 字节的受控写入持续存在


参考资料

  • • 官方网站:https://copy.fail/
  • • Xint 技术分析:https://xint.io/blog/copy-fail-linux-distributions
  • • PoC 代码:https://github.com/theori-io/copy-fail-CVE-2026-31431
  • • Go 语言实现:https://github.com/badsectorlabs/copyfail-go
  • • 安天 CERT FAQ(上):https://mp.weixin.qq.com/s/MMeMCSPJ_IO4peFb94fXbw
  • • 剑仙 DeepSeek 复现过程:https://mp.weixin.qq.com/s/eMCDye1A-LfO6gMsTTvNSQ

免责声明:

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

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

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

本文转载自:赛博生存指南 mimi3389 mimi3389《CVE-2026-31431 Copy Fail 通俗解析》

五一劳动节快乐 网络安全文章

五一劳动节快乐

文章总结: 该文档由公安部网络安全等级保护中心于2026年5月1日发布,内容涉及网络安全相关主题,但具体技术细节未在提供的信息中展示。文档标题包含劳动节问候语,
评论:0   参与:  0