Linux 内核“Copy Fail”漏洞(CVE-2026-31431)深度剖析:十年潜伏,一条命令提权到 root
1. 关于漏洞
| 项目 | 内容 |
|---|---|
| 漏洞名称 | Copy Fail |
| CVE 编号 | CVE-2026-31431 |
| 公开时间 | 2026年4月29日 |
| CVSS v3.1 评分 | 7.8(高危) |
| 漏洞类型 | 本地权限提升(Local Privilege Escalation,LPE) |
| 漏洞根源 | Linux 内核加密子系统 algif_aead 模块的逻辑缺陷 |
| 攻击前提 | 已获得本地普通用户或容器内代码执行权限 |
| 是否需要网络 | 否 |
| 是否需要竞态条件 | 否 |
| PoC/EXP 状态 | 已公开,单一脚本通杀所有受影响发行版 |
| 在野利用状态 | 已发现 |
| 受影响发行版 | Ubuntu、RHEL、Debian、SUSE、Amazon Linux、OpenEuler、Fedora、Rocky Linux、AlmaLinux、Oracle Linux、Arch Linux 等 |
| 不受影响版本 | Linux 内核 7.0+、6.19.12+、6.18.22+(以及对应修复回溯的 Longterm 分支) |
CVE-2026-31431 的 CVSS v3 向量为 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H。
攻击者无需竞态条件,唯一前置条件是能够在目标系统上执行低权限代码。
2. 漏洞原理:一个2017年优化埋下的十年隐患
2.1 三个技术要素的异常耦合
这个漏洞的根源是三个技术要素之间的异常交互:
AF_ALG加密套接字接口:Linux 内核提供的用户态访问加密功能的通道。应用程序通过AF_ALGsocket,可以将数据交给内核进行加解密运算,效率高于用户态实现。splice()系统调用:零拷贝数据搬运接口,可以在两个文件描述符之间直接传递数据,无需经过用户空间。典型用法是将文件内容直接送入 socket,避免数据从内核态拷贝到用户态再拷贝回内核态的多余开销。- 2017 年引入的“原地操作”(in-place)优化:在 Linux 内核 4.14 版本的一次代码提交中,开发者为
algif_aead(AEAD 算法的用户态接口)加入了一项性能优化——让加密操作在原地缓冲区进行,不再对输入输出做严格分离。这个优化的本意是减少内存拷贝、提高吞吐量,但客观上打破了“输入缓冲区只读”的假设,埋下了安全缺陷。
2.2 异常发生的完整路径
要理解 Copy Fail 漏洞如何被利用,需要追踪整个操作链条:
第一步:打开目标和加密通道。 攻击者先用 open() 打开一个目标文件(比如 /usr/bin/su),得到一个普通的文件描述符。同时用 socket() 创建一个 AF_ALG 类型套接字,绑定到 AEAD 算法(具体是 authencesn 模板),得到加密套接字描述符。authencesn 是 Linux 内核加密子系统中专门处理带扩展序列号(ESN)的认证加密模板,IPsec 协议依赖该模块。
第二步:用 splice() 把文件送入加密通道。 正常情况下,用户态应用准备加密数据时,会把数据拷贝到 AF_ALG socket 关联的缓冲区,内核再把缓冲区内容送入加密引擎处理。而 splice() 允许直接关联两个描述符的内核内存——用一个 splice() 调用,将目标的文件描述符直接连接到加密套接字上,这意味着文件的页缓存页(Page Cache Page)被纳入加密操作流程,而非独立的临时缓冲区。
第三步:触发 AEAD 解密流程。 攻击者向该加密套接字发送一个经过特殊构造的 AEAD 操作请求(需要包含一个假的认证标签)。这个操作会触发加密子系统内部的 authencesn 解密路径。在正常设计中,解密操作输出的数据应该被写入一个临时缓冲区,不会影响原始数据。
第四步:页缓存被误写。 但由于 2017 年引入的“原地操作”优化,内核的 algif_aead 模块在特定条件下直接复用输入页作为目标页,把解密输出的数据写回到了页缓存中。更具体地:在 crypto_authenc_esn_decrypt 函数中,控制数据(来自用户空间)被写入目标区域,而修复前的逻辑使该目标区域指向了文件页缓存。于是,本来只读的页缓存页被写入了受控的 4 个字节。
2.3 为什么会成:三个机制的“危险握手”
上述四步能够串联成一次成功的攻击,依赖于以下三个机制的同时存在:
AF_ALGsocket 向用户态暴露了内核加密功能。如果没有这个接口,攻击者根本无法调用内核加密引擎。splice()系统调用提供了绕过用户空间内存的直接数据通道。没有splice(),攻击者无法将文件页缓存送入加密操作。authencesn解密操作会向目标区域写入数据。而修复前的缺陷使该目标区域被错误地设置成了文件页缓存,而不是临时缓冲区。
当三个机制同时启用时,攻击者就可以将加密操作的输出重定向到文件页缓存,从而篡改内存中的文件内容。整个过程不需要竞争条件,不需要内存地址泄露,也不需要预知内核偏移量。攻击者仅需一个普通用户账号,一条路径就能直达 root。
3. 与 Dirty Pipe、Dirty Cow 的历史对比
Copy Fail 属于页缓存污染类漏洞,与 Dirty Cow(CVE-2016-5195)和 Dirty Pipe(CVE-2022-0847)同属一个技术家族,但三者有显著差异:
| 对比项 | Copy Fail | Dirty Pipe | Dirty Cow |
|---|---|---|---|
| 引入时间 | 2017 年(内核 4.14) | 2022 年(内核 5.8) | 2016 年(内核 2.6.22) |
| 攻击类型 | 页缓存污染(4字节定向写) | 页缓存污染(跨页写入) | 竞态条件下页缓存污染 |
| 是否需要竞态条件 | 不需要 | 不需要 | 需要(竞争窗口) |
| 目标文件条件 | 任意可读文件 | 只读文件且获得写 fd | 任意可读文件(但需要触发写时复制) |
| 跨发行版通用性 | 一个脚本,无偏移量 | 需要特定内核版本支持 | 依赖内存布局,成功率非 100% |
| 隐蔽性 | 纯内存篡改,磁盘不变 | 纯内存篡改,磁盘不变 | 纯内存篡改,磁盘不变 |
| 是否在野利用 | 已发现 | 已发现 | 已发现并被 CISA KEV 收录 |
Dirty Cow 利用的是写时复制机制的竞态条件。攻击者通过两个线程竞争,在只读内存映射被复制之前篡改原始页面。由于依赖竞态条件,存在失败概率,也可能导致系统不稳定。
Dirty Pipe 允许非特权用户向只读文件注入数据,但没有竞态条件的要求。然而 Dirty Pipe 有较严格的约束:需要内核版本 ≥ 5.8,且需要特定的补丁支持;写入位置有偏移量限制。相对 LPE 漏洞来说,它的实用性受到约束。
Copy Fail 的相对优势:
研究人员指出,与 Dirty Pipe 相比,Copy Fail 更具实用性:“Copy Fail is more portable. One script, every distro, no offsets.”——一个脚本通吃所有发行版,无需偏移量适配。Dirty Pipe 需要内核版本 ≥ 5.8 且依赖特定补丁集,而 Copy Fail 覆盖了 2017 年至 2026 年发布的几乎所有内核。这种跨版本通杀的特性,在 Linux LPE 漏洞历史上并不多见。
Theori 在四个主流发行版(Ubuntu 24.04 LTS、Amazon Linux 2023、RHEL 10.1、SUSE 16)上验证,成功率均为 100%。
4. 容器逃逸原理:页缓存共享的灾难
Copy Fail 在容器环境下的威胁比传统单主机场景更严重,其根本原因在于 Linux 页缓存(Page Cache)的共享性质。
4.1 页缓存是宿主机共享资源
在 Linux 系统中,页缓存是宿主机级别的全局资源。当宿主机将文件读入内存时,数据存放在统一的页缓存中。Docker 和 Kubernetes 容器在底层与宿主机共用同一个内核,也就共用同一份页缓存。当宿主机上的某个文件被多个容器频繁读取时,页缓存中只有一份副本被共享访问。
这个设计是出于性能考虑——节省了内存,加速了文件访问。但当页缓存可被任意写入(如 Copy Fail 漏洞所允许的那样)时,这个共享性质就成了攻击的放大器。
4.2 攻击者从容器到主机的逃逸
利用 Copy Fail,容器内的普通用户可以进行以下攻击:
- 第一步:确认容器内核版本。 攻击者在容器内运行
uname -r,确认宿主机内核版本在受影响的范围内。 - 第二步:找到宿主机关键 setuid 二进制文件的内存地址。 容器虽然无法直接访问宿主机的
/usr/bin/su(容器有自己独立的文件系统),但因为宿主机加载的文件也在系统的页缓存中,攻击者可以通过跨容器的页缓存共享来定位。一个路径是:如果宿主机正在运行某个容器的共享映像文件,该文件的页缓存位置在宿主机全局可见。 - 第三步:执行 Copy Fail 篡改页缓存。 攻击者利用 Copy Fail payload,将 4 字节控制数据写入页缓存中目标文件的对应位置。由于页缓存是全局共享的,该写入会同时污染宿主机的页缓存。
- 第四步:获得宿主机 root 权限。 当宿主机或其他容器再次执行被污染的 setuid 程序(如
su或sudo)时,加载的是已被篡改的页缓存内容,直接以 root 权限执行攻击者的恶意代码。攻击者因此获得宿主机的 root shell,实现了容器逃逸。
这一攻击路径不需要攻击者获得宿主机文件系统的访问权,甚至不需要知道宿主机的具体文件路径——只要攻击者能够推测哪些文件被共享、如何被读取,就可以在容器内部完成逃逸。
4.3 受影响的高危场景
根据多个安全厂商的分析,以下场景面临最高风险:
| 场景 | 风险原因 |
|---|---|
| 多租户 Kubernetes 集群 | 不同租户共享宿主机内核和页缓存 |
| 自托管 CI Runner(GitHub Actions Runner、GitLab Runner、Jenkins Agent) | Runner 执行不可信代码 |
| 云端 Notebook 环境 / 代码沙箱 | 不同用户共享同一宿主机内核 |
| PaaS / Serverless 执行环境 | 用户代码可能影响宿主节点 |
| 多用户 Linux 主机(高校机房、企业内部跳板机) | 任意普通用户可能提权为 root |
| 互联网网关 / 代理节点 | 公开接口引入不可信流量 |
对比 Dirty Pipe,Copy Fail 在云原生场景的威胁更大。Dirty Pipe 虽然也能实现页缓存污染,但依赖于目标文件是只读且能够获得写入描述符,这在容器内的受限文件系统下实现逃逸较为复杂。而 Copy Fail 只需要目标文件可读(几乎全部 setuid 程序满足此条件),就能直接污染页缓存,攻击面明显更宽,更适用于容器逃逸和跨租户攻击。
5. 修复方案深度分析
5.1 上游补丁:回退“原地优化”
Linux 内核主线修复提交为 a664bf3d603d,提交说明显示该修复将 algif_aead 回退到 out-of-place 操作,移除此前 in-place 处理带来的复杂逻辑;该提交标记修复了 2017 年引入的相关变更。
具体而言,补丁做了两件事:
- 移除
algif_aead模块中危险的原址优化逻辑,强制加密操作的输出写入临时缓冲区,而非复用输入页; - 确保页缓存页面不再进入可写的 scatterlist(分散列表),防止攻击者通过加密套接字误写只读页缓存。
这两个改变直接切断了漏洞的触发路径。攻击者无法再控制加密操作的输出目标指向页缓存。即使攻击者能够调用 AF_ALG 接口、能够完成 splice() 跨文件描述符的数据搬运,最终的写入目标也仅限于内核分配的临时缓冲区——该缓冲区在操作完成后被释放,不会对任何持久化数据造成影响,也不会污染页缓存。
5.2 安全版本列表
根据公开信息,各内核分支的安全版本如下:
| 内核分支 | 安全版本 |
|---|---|
| mainline / 7.x | 7.0(包含 a664bf3d603d) |
| 6.19.x | 6.19.12 或更高 |
| 6.18.x | 6.18.22 或更高 |
| 6.12.x | 6.12.85 或更高 |
| 6.6.x | 6.6.137 或更高 |
| 6.1.x | 6.1.170 或更高 |
| 5.15.x | 5.15.204 或更高 |
| 5.10.x | 5.10.254 或更高 |
上述版本范围的另一边界是 Linux 内核 4.14——漏洞引入的起点。如果你的内核版本介于 4.14 与上述安全版本之间(不含安全版本),则漏洞存在。
5.3 各大发行版状态
| 发行版 | 状态 |
|---|---|
| Amazon Linux 2023 | 安全更新已发布,内核升级至安全版本 |
| Red Hat Enterprise Linux 8/9/10 | 安全更新已发布(早期曾表示延期,后补发) |
| SUSE 16 / SLES 15 / openSUSE Leap | 安全更新已发布 |
| Ubuntu 24.04 LTS | 安全更新已发布 |
| Debian | 安全更新已发布 |
| Fedora | 安全更新已发布 |
| Rocky Linux / AlmaLinux | 与 RHEL 同步,已发布安全更新 |
| Oracle Linux | 已发布安全更新 |
| OpenEuler | 已发布安全更新 |
部分发行版的早期响应存在延迟——Red Hat 曾表示考虑延期推送补丁,但后来更新了安全公告,与主流发行版保持一致节奏。SUSE 明确确认了影响范围,涵盖 SLES 15(所有 Service Pack)、SL Micro、Leap 15/16,12 SP5 及更早版本不受影响。
5.4 修复后的差异
升级到安全版本后,加密子系统回退到 out-of-place 模式。加密操作的输入和输出被强制分开——输出数据写入一个全新的临时缓冲区,由内核自动管理,在操作完成后释放。文件页缓存在整个加密操作过程中保持只读,不会被写操作触及。
这一改变带来的性能代价是额外的内存拷贝——加密操作需要将输出从临时缓冲区拷贝回用户缓冲区,而非原地复用页。这就是 2017 年引入该优化的初衷:提高性能。但安全性的代价大于性能收益时,回退是正确的选择。
6. 无法立即升级内核时的临时缓解措施
6.1 禁用 algif_aead 内核模块(通用方案)
algif_aead 是漏洞的入口。禁用该模块后,AF_ALG 套接字无法绑定 AEAD 算法,攻击者无法触发异常路径。禁用该模块不会影响常规的 LUKS 磁盘加密、IPsec、OpenSSL、SSH、HTTPS 等常见功能。
具体操作:
# 1. 创建配置文件,禁止模块自动加载echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf# 2. 立即卸載已加载的模块(卸载前确保无活动 AEAD socket)sudo rmmod algif_aead 2>/dev/null || true
# 验证模块已不在加载列表中lsmod | grep algif_aead || echo "模块已禁用"注意事项:禁用模块前需评估业务系统中是否有应用程序通过 AF_ALG 接口调用 AEAD 算法(如某些 VPN 实现)。若有此类依赖,禁用会造成功能异常。
6.2 seccomp 策略阻断 AF_ALG socket(容器环境最优方案)
在容器环境中,禁用内核模块不是总能做到的(需宿主机权限)。更合适的办法是利用 seccomp 直接限制容器内进程的系统调用,阻止 socket() 系统调用创建 AF_ALG 类型的套接字。
创建 block-af_alg.json:
{ "defaultAction": "SCMP_ACT_ALLOW", "architectures": ["SCMP_ARCH_X86_64", "SCMP_ARCH_AARCH64"], "syscalls": [ { "names": ["socket"], "action": "SCMP_ACT_ERRNO", "args": [ {"index": 0, "value": 38, "op": "SCMP_CMP_EQ"} ] } ]}将该 seccomp profile 应用到 Kubernetes Pod 或 Docker 容器中。通过这种方式,容器内进程在尝试创建 AF_ALG socket(domain = 38)时会被直接阻止,即使宿主机内核仍存在漏洞,攻击也无法从容器内完成。
6.3 临时降低攻击面(主机级应急)
如果以上方案不可行,可以考虑临时降低系统的暴露面:
- 限制非必要的本地用户登录(SSH 仅允许信任用户登录);
- 在 CI/CD 流水线中,将不可信代码放在隔离更强的专用 Runner 上,而非生产级的多租户基础设施;
- 在 Kubernetes 环境,强制使用
HostUsers: false或runAsNonRoot: true降低攻击影响面; - 给敏感 setuid 二进制(如
/usr/bin/su)临时移除执行权限(如chmod 000 /usr/bin/su),但这会影响系统正常功能,极不推荐用于生产环境,仅作为临时实验方案。
注意:清理页缓存(sync && echo 3 > /proc/sys/vm/drop_caches)无法阻止新的攻击。该操作只能清除已被篡改的内存镜像,不能封堵漏洞本身。攻击者可以在任意时刻再次执行 exploit。
7. 总结与冲击评估
7.1 核心风险评估
CVE-2026-31431 之所以被称为“史诗级”漏洞,原因有三:
| 维度 | 风险等级 | 说明 |
|---|---|---|
| 利用门槛 | 极低 | 仅需普通用户执行权限 + Python 运行时环境,无需竞态条件、无需内存地址泄露 |
| 影响范围 | 极广 | 涵盖 2017 年至今几乎所有主流 Linux 发行版、云镜像、容器基础镜像,预估影响设备量达千万级 |
| 隐蔽性 | 极高(内存级) | 攻击完全发生在内存中,磁盘上的文件未被修改,文件完整性校验工具(aide、tripwire、md5sum)无法检测到异常 |
| 场景扩展性 | 强 | 可单独使用,也可与 RCE、SSH 入侵、恶意 CI 流水线、容器 Shell 等组合;具备容器逃逸能力 |
7.2 响应时间线
根据公开信息推测的时间线:
- 2026 年 3 月 23 日:Theori 研究员 Taeyang Lee 向 Linux 内核安全团队报告漏洞。
- 2026 年 4 月 1 日:上游主线补丁
a664bf3d603d被合并。 - 2026 年 4 月 22 日:CVE-2026-31431 编号正式分配。
- 2026 年 4 月 22 日~4 月 29 日:各发行版内部测试并推送安全更新。
- 2026 年 4 月 29 日:Theori 公开披露漏洞及 PoC。
- 2026 年 4 月 30 日:国内外各大安全社区、厂商发布紧急安全通告和安全更新。
- 2026 年 4 月 30 日以后:公有云厂商(AWS、阿里云、华为云、OVHcloud、腾讯云等)陆续推送修复版镜像和安全更新。
7.3 对云原生环境的长期影响
Copy Fail 的披露引发了云服务商和容器平台的紧急安全响应,核心问题在于无法通过常规隔离措施阻止容器内利用该漏洞逃逸到宿主机。传统的容器安全假设——容器内低权限进程不应影响宿主机——被这个漏洞打破了。
对于 Kubernetes 集群的管理员,以下是核心安全策略建议:
- 节点立即升级内核,将宿主机内核升级到安全版本是最彻底的解决方案。
- 限制容器创建
AF_ALGsocket:在 Pod Security Standards 或准入控制器级别,添加 seccomp profile 阻断该行为,作为升级前的过渡措施。 - 审查 CI/CD 流水线中 Runner 使用的镜像。如果基础镜像来自受影响的版本(2026 年 4 月初之前构建的),默认存在漏洞。
- 启用节点级的异常行为检测:利用 eBPF 或 HIDS(如奇安信椒图)监控
AF_ALGsocket 的异常创建频率,作为安全事件的早期预警指标。 - 审计高风险命名空间,检查是否有疑似提权的痕迹(异常的
su/sudo执行、非 root→root 的权限跃迁的 shell 会话)。
8. 从 AI 辅助漏洞发现到未来安全防御启示
本次漏洞的发现过程本身也具有重要意义。Copy Fail 由 Theori 研究员 Taeyang Lee 通过人工分析与 AI 辅助工具 Xint Code 协同发现。令人关注的是,该漏洞是在 AI 工具对 Linux 内核 crypto/ 子系统扫描约“一小时内”被精确定位到最高严重性缺陷。研究人员描述称,只需一个提示词(one operator prompt),无需复杂的配置或 harness。
这个发现具有两方面的含义:一方面,AI 辅助工具极大提高了漏洞挖掘的效率,预示未来零日漏洞的发现速度会比过去快得多;另一方面,AI 工具发现漏洞的能力集中在逻辑缺陷这种历史上依赖人工深度推理的类型上,这意味着开源软件和商业软件都需要重新评估其安全开发流程。
漏洞处置备忘:高优先级行动项
以下按风险场景优先级列举应急措施:
| 风险场景 | 优先级 | 行动措施 |
|---|---|---|
| 公网 Kubernetes 集群 / 多租户容器平台 | P0(立即) | 升级节点内核至安全版本;若无法升级,部署 DaemonSet 禁用 algif_aead 模块(见 OVHcloud 提供的示例) |
| 自托管 CI Runner(承接外部 PR) | P0(立即) | 升级 Runner 节点内核至安全版本 |
| 多用户 Linux 主机(高校机房、共享开发机) | P1(24 小时内) | 升级内核或禁用 algif_aead 模块 |
| 生产单租户服务器 | P2(一周内) | 升级内核,安排维护窗口 |
| 互联网网关 / 代理节点 | P1(48 小时内) | 升级内核,减少低权限用户入口 |
| 老版本嵌入式 Linux 设备 | P3(评估业务影响) | 若无法升级内核,评估是否能够安全禁用 algif_aead 模块(需确认无业务依赖) |
| 已检测到可疑活动的主机 | P0(立即) | 升级内核 + 重启清除内存页缓存 + 事件响应调查 |
9. 相关资源链接
- 官方披露页面:https://copy.fail
- oss-security 公告:https://openwall.com/lists/oss-security/2026/04/29/23
- Linux 内核补丁提交:
a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5 - Theori 完整技术分析:https://xint.io/blog/copy-fail-linux-distributions
- PoC 仓库(安全研究用):https://github.com/theori-io/copy-fail-CVE-2026-31431
- CVE 详情(NVD):https://nvd.nist.gov/vuln/detail/CVE-2026-31431
- MITRE CVE 列表:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-31431
免责声明
本文内容仅供网络安全技术研究和防御参考。严禁将所述技术用于任何未经授权的系统入侵、数据窃取或破坏活动。使用者须严格遵守《中华人民共和国网络安全法》及所在地区的法律法规。因不当使用造成的一切后果由使用者自行承担,与本文作者及发布平台无关。所有漏洞验证及攻击模拟必须在拥有合法控制权的测试环境中进行。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时









