Maxime288/CVE-2026-31431-Copy-Fail-R-pertoire-de-Pr-vention

GitHub: Maxime288/CVE-2026-31431-Copy-Fail-R-pertoire-de-Pr-vention

这是一个针对Linux内核CVE-2026-31431漏洞的PoC仓库,用于演示基于页面缓存的本地提权攻击。

Stars: 0 | Forks: 0

# 🔴 CVE-2026-31431 — 复制失败:防范目录 ## 📋 目录 1. [概述](#vue-densemble) 2. [漏洞机制](#mécanisme-de-la-faille) 3. [受影响系统](#systèmes-affectés) 4. [演示 (测试环境)](#démonstration-environnement-de-test) 5. [入侵指标](#indicateurs-de-compromission) 6. [修复与补丁](#remédiation-et-correctifs) 7. [临时缓解措施](#atténuation-temporaire) 8. [参考资料](#références) ## 概述 **CVE-2026-31431**,绰号 *Copy Fail*,是 Linux 内核加密子系统中的一个逻辑漏洞。它允许 **任何非特权用户** 通过向某个 setuid 可执行文件的 **页面缓存** 中 **受控写入 4 字节** 来获取 `root` 权限。 ### 为什么它很关键 | 特性 | 细节 | |---|---| | **利用代码** | 732 字节的 Python 代码,仅需标准库 | | **条件** | 无竞态条件,无需精确时序控制 | | **检测性** | ⚠️ 对磁盘完整性检查工具不可见 | | **影响** | 本地 root 权限 + 容器逃逸 (Kubernetes) | | **可移植性** | 同一个脚本适用于所有测试的发行版 | ## 漏洞机制 该漏洞源于内核在十年间 **三个独立修改** 的交叉点: ``` 2011 → authencesn ajouté au kernel (support IPsec ESN) 2015 → AF_ALG acquiert le support AEAD + splice() 2017 → Optimisation "in-place" dans algif_aead.c ← ROOT CAUSE ``` ### 1. 涉及的组件 **`AF_ALG`** — 将加密子系统暴露给用户空间(无需特权)的套接字。 **`splice()`** — 在文件描述符之间 *无需复制* 传输数据,通过直接引用页面缓存中的页面。 **`authencesn`** — 用于 IPsec ESN(扩展序列号)的 AEAD 模板。使用目标缓冲区作为临时工作区来重新排列 ESN 字节。 ### 2. 漏洞点 在 2017 年的“就地”优化中,内核开始通过 `sg_chain()` 将页面缓存中的页面直接链接到 *目标* scatterlist: ``` Input SGL: AAD || Ciphertext || Tag (page cache pages) ↑ Output SGL: AAD || Ciphertext --------+ (chaîné par référence) ↑ ↑ Buffer RX Buffer RX (mémoire utilisateur) ``` 随后 `authencesn` 在偏移 `assoclen + cryptlen` 处写入 **`seqno_lo` 的 4 字节** —— 即直接写入目标文件的页面缓存页面中。 ### 3. 攻击者控制的原语 | 原语 | 控制 | |---|---| | **哪个文件** | 当前用户可读的任何文件 | | **哪个偏移量** | 由 `assoclen`、splice 的偏移和长度决定 | | **什么值** | AAD(附加认证数据)的第 4–7 字节(`seqno_lo` 字段) | ### 4. 对隐蔽性的影响 内核 **永远不会** 将被破坏的页面标记为“脏”(dirty)以进行回写。磁盘上的文件保持完整。只有页面缓存(在 `execve()` 时实际读取的内容)被破坏。 ``` Fichier disque : [intact] ← sha256sum, tripwire, AIDE → ✅ pas d'alerte Page cache : [corrompu] ← execve() lit ici → ⚠️ shellcode exécuté ``` ## 受影响系统 ### 已测试的发行版 | 发行版 | 内核版本 | 状态 | |---|---|---| | 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 | ✅ 易受攻击(已测试) | ### 漏洞窗口期 任何包含提交 `72548b093ee3`(2017 年)直到补丁 `a664bf3d603d`(2026-04-01)的内核都可能存在漏洞 —— 时间跨度 **近十年**。 ## 演示 (测试环境) ### 前置条件 ``` # Ubuntu Server — 验证内核版本 uname -r # 检查 algif_aead 模块是否存在 lsmod | grep algif_aead # 需要 Python 3.10+(用于 os.splice) python3 --version ``` ### 克隆 PoC ``` git clone https://github.com/theori-io/copy-fail-CVE-2026-31431.git cd copy-fail-CVE-2026-31431 ``` ### 启动测试 ``` # 作为非特权用户 id # → uid=1001(user) gid=1001(user) python3 copy_fail_exp.py # 易受攻击内核上的预期结果: # uid=0(root) gid=0(root) groups=0(root) ``` ### 预期观察结果 1. 脚本在 `authencesn(hmac(sha256),cbc(aes))` 上创建一个 `AF_ALG` 套接字 2. 它将 `/usr/bin/su` splice 到一个管道,然后进入套接字 3. 每次 `recv()` 调用都会向 `su` 的页面缓存写入 4 字节的 shellcode 4. `execve("/usr/bin/su")` 加载被破坏的版本 → root shell ### 漏洞利用后验证 ``` # 磁盘文件完整无缺 sha256sum /usr/bin/su # même hash qu'avant # 但页面缓存已损坏 # (通过清除缓存并观察行为可见) echo 3 > /proc/sys/vm/drop_caches # 此操作后,/usr/bin/su 恢复正常 ``` ## 入侵指标 鉴于该利用的隐蔽性(无磁盘修改),检测很困难。以下是需要注意的信号: ### 需要监控的系统日志 ``` # 可疑系统调用:AF_ALG + splice 组合使用 # 在 auditd 中监控: auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k af_alg_socket auditctl -a always,exit -F arch=b64 -S splice -k splice_call # 意外的权限提升 grep "uid=0" /var/log/auth.log | grep -v "sudo\|su\|login" ``` ### 行为检测 ``` # 来自 su 的 UID 为 0 的意外子进程 ps aux | awk '$1 == "root" && $11 !~ /^(sshd|systemd|cron)/' # 来自意外 root 进程的网络连接 ss -tlnp | grep LISTEN ``` ### 内存检测工具 ``` # 比较磁盘文件与内存中的哈希值 # (通过 /proc/PID/maps 手动方法) # 现代 EDR 可检测页面缓存/磁盘不一致 ``` ## 修复与补丁 ### ✅ 最终解决方案:更新内核 官方补丁 (`a664bf3d603d`) 将操作改为 `algif_aead.c` 中的 **非就地** 操作,分离了源和目标 scatterlist。 ``` # Ubuntu / Debian sudo apt update && sudo apt upgrade linux-image-$(uname -r) sudo reboot # RHEL / CentOS Stream sudo dnf update kernel sudo reboot # Amazon Linux 2023 sudo dnf update kernel sudo reboot # SUSE sudo zypper update kernel-default sudo reboot ``` ### 验证补丁是否已应用 ``` # 重启后验证内核版本 uname -r # 已修补内核上的 algif_aead 模块将拒绝原地操作 ``` ## 临时缓解措施 如果无法立即更新内核: ### 选项 1:禁用 `algif_aead` 模块 ``` # 永久黑名单 echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf # 立即卸载(如果已加载) sudo rmmod algif_aead 2>/dev/null # 验证 lsmod | grep algif_aead # → rien ``` ### 选项 2:通过 seccomp 进行限制 对于容器化环境,通过 seccomp 策略限制创建 `AF_ALG` 套接字(地址族 38)。 ``` { "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["socket"], "action": "SCMP_ACT_ERRNO", "args": [ { "index": 0, "value": 38, "op": "SCMP_CMP_EQ" } ] } ] } ``` ### 选项 3:加强监控(非预防性) ``` # 在敏感系统调用上启用 auditd sudo systemctl enable auditd sudo auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k copy_fail_watch ``` ## 参考资料 | 资源 | 链接 | |---|---| | 官方 PoC | [theori-io/copy-fail-CVE-2026-31431](https://github.com/theori-io/copy-fail-CVE-2026-31431) | | 完整技术分析文章 | [xint.io/blog/copy-fail-linux-distributions](https://xint.io/blog/copy-fail-linux-distributions) | | 内核补丁 (提交) | [a664bf3d603d](https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5) | | 原始漏洞提交 | [72548b093ee3](https://github.com/torvalds/linux/commit/72548b093ee3) (2017) | | NVD | [nvd.nist.gov/vuln/detail/CVE-2026-31431](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) | ### 协调披露时间线 | 日期 | 事件 | |---|---| | 2026-03-23 | 向 Linux 内核安全团队报告 | | 2026-03-24 | 收到确认 | | 2026-03-25 | 补丁审查 | | 2026-04-01 | 补丁并入内核主线 | | 2026-04-22 | 分配 CVE-2026-31431 | | 2026-04-29 | 公开披露 | ## ⚖️ 法律声明 本代码库 **仅用于教育目的和防御性安全研究**。 在未经明确授权的系统上利用此漏洞是 **非法的**(《法国刑法典》第 323-1 条及后续条款;美国的《计算机欺诈和滥用法案》)。 **仅**在您自己的系统或经授权的渗透测试框架内进行测试。 *由 [@Maxime288](https://github.com/Maxime288) 维护*
标签:0day挖掘, AF_ALG, authencesn, Chrome Headless, Copy Fail, crypto子系统, CVE-2026-31431, Kubernetes安全, Linux内核漏洞, root权限, setuid漏洞, splice, Web截图, Web报告查看器, 内核安全, 威胁模拟, 安全渗透, 安全补丁, 容器安全, 容器逃逸, 密码学漏洞, 权限提升漏洞, 逆向工具, 页面缓存攻击