kaleth4/CVE-2026-31431

GitHub: kaleth4/CVE-2026-31431

Linux内核CVE-2026-31431本地权限提升漏洞的检测与利用工具,通过algif_aead子系统的4字节可控写入实现root提权。

Stars: 0 | Forks: 0

# 🚨 CVE-2026-31431:Copy Fail ## 📋 执行摘要 | 属性 | 详情 | |----------|----------| | **CVE** | CVE-2026-31431 | | **绰号** | Copy Fail | | **类型** | 本地权限提升(LPE) | | **CVSS** | 7.8(高危) | | **发现者** | Theori(Xint Code) | | **披露日期** | 2026年4月29日 | | **受影响组件** | Linux 内核 `algif_aead` 子系统 | ## ⚡ 为何如此危险? ### 🎯 速度极快 - 漏洞利用即时生效:**不到 1 秒**即可获得 root 权限 - Python 脚本仅 **732 字节** ### 👻 完全隐蔽 - 仅修改 **内存 RAM**(页缓存),不修改磁盘 - 文件完整性工具 **无法检测到** - 重启后痕迹消失(取证分析受阻) ### 🌍 影响范围极广 - 影响 **几乎所有现代发行版** - 内核版本从 **v4.14(2017)到 v7.0-rc** - 长达 **9 年**未被发现的漏洞 ### ☁️ 云/Kubernetes 风险 - 可实现 **容器逃逸**到宿主机 - 页缓存在宿主机和容器之间共享 - 对多租户环境影响严重 ## 🔍 技术细节 ### 根本原因 2017 年引入的"原地操作"优化存在缺陷(提交 `72548b093ee3`)。允许本地用户进行 **受控的 4 字节写入**,直接写入内核页缓存。 ### 利用机制 1. 攻击者使用 `AF_ALG` 接口访问内核加密算法 2. 篡改内存中的 setuid 二进制文件(`/usr/bin/su`)或敏感文件(`/etc/passwd`) 3. 执行被篡改的二进制文件后获得 root shell ### 为何未被察觉 这是一个 **逻辑设计缺陷**,而非内存溢出。发现它需要深入分析加密子系统。 ## 📊 受影响系统 ### ✅ 已确认 - **Ubuntu**:20.04、22.04、24.04 LTS - **RHEL/AlmaLinux/Rocky Linux**:所有现代版本 - **Debian**:所有使用 v4.14+ 内核的版本 - **Amazon Linux 2023** - **SUSE**:近期版本 ## 🛡️ 修复方案 ### 1️⃣ 根本解决方案:更新内核 ``` # Ubuntu/Debian sudo apt update sudo apt upgrade sudo reboot # RHEL/AlmaLinux/Rocky sudo dnf update kernel sudo reboot # 验证内核版本 uname -r ``` ⚠️ **必须重启**才能激活新内核。 ### 2️⃣ 紧急缓解措施(无需立即重启) #### 适用于 Ubuntu/Debian: ``` # 禁用易受攻击模块的加载 echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf # 如果已使用则卸载模块 sudo rmmod algif_aead ``` #### 适用于 RHEL/AlmaLinux: ``` # 该模块通常已内置在内核中 # 添加启动参数以禁用它 sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init" # 重启以应用更改 sudo reboot ``` ### 3️⃣ 清理缓存(若怀疑已被利用) ``` # 清除热页缓存 sudo sysctl -w vm.drop_caches=3 ``` ⚠️ **注意**:这不能替代补丁,仅作为补充措施。 ## 📅 事件时间线 | 日期 | 事件 | |-------|--------| | **4 月 29 日** | Theori 公开披露 | | **5 月 1 日** | 检测到首批主动利用尝试 | | **5 月 2 日** | CISA 命令美国联邦机构在 5 月 15 日前完成修补 | | **5 月 3 日** | Ubuntu、RHEL、AlmaLinux、Debian 推出补丁 | ## 📦 补丁状态 | 发行版 | 状态 | 参考 | |--------------|--------|-----------| | **Ubuntu** | ✅ 已修复 | USN-8226-1(20.04、22.04、24.04) | | **RHEL/AlmaLinux/Rocky** | ✅ 可用 | 自 5 月 1 日起 | | **Debian** | ✅ 安全仓库已更新 | 更新可用 | | **Android** | ⏳ 即将推出 | 2026 年 6 月安全公告 | ## 🔐 验证您的系统 ### 您的内核是否易受攻击? ``` # 获取内核版本 uname -r # 如果符合以下条件则存在漏洞: # - v4.14 到 v7.0-rc(2017年4月至2026年发布) # - 包含 commit 72548b093ee3 # 验证 algif_aead 模块是否已加载 lsmod | grep algif_aead # 如果出现在列表中,则您的系统存在漏洞 ``` ## 🧬 安全分析:AI 因素 ### 最具颠覆性:AI 在 1 小时内发现 一个 AI 发现了这个被开发者忽视长达 **9 年** 的漏洞。这是一个分水岭: - 🤖 机器可以 **比人类更快** 审计内核代码 - 🔍 自动发现复杂的逻辑缺陷 - ⚠️ 对未来零日研究的 implications ## 快速开始 ``` # 1. Detect python3 prueba.py # exit 0 = not vulnerable, 2 = vulnerable, 1 = test error # 2. Exploit (interactive — su will prompt for your own password) python3 exploit.py --shell ``` ## 检测器使用方法 ``` python3 prueba.py ``` 功能说明: 1. 确认 `AF_ALG` 和 `authencesn(hmac(sha256),cbc(aes))` 算法可从非特权进程访问。 2. 在临时目录中创建 4 KiB 哨兵文件并填充页缓存。 3. 通过 `sendmsg`+cmsg 发送 8 字节 AAD,其中 seqno_lo 设置为 `PWND` 标记,然后通过 `os.splice()` 将哨兵页缓存中的 32 字节复制到 AF_ALG 操作套接字。 4. 调用 `recv()` 开始解密。认证检查失败并返回 `EBADMSG`;但写入操作仍会执行。 5. 重新读取文件(从页缓存,非磁盘)并搜索标记。 输出类别: - **前置条件未满足**:`AF_ALG` 或 `authencesn` 不可用。退出码 0。 - **易受 CVE-2026-31431 攻击**:`PWND` 标记被插入到修改后的页面中。退出码 2。 - **页缓存通过 AEAD 原地插入路径被修改**:有数据写入页面,但标记未出现在预期位置。按易受攻击处理。退出码 2。 - **页缓存完好**:已打补丁。退出码 0。 检测器永远不会修改 `/usr/bin/su`、`/etc/passwd` 或其创建的临时目录之外的任何文件,且该文件在退出时会删除。 ## LPE 使用方法 ``` python3 exploit_cve_2026_31431.py # Solo parchea, imprime los siguientes pasos python3 exploit_cve_2026_31431.py --shell # Parchea y ejecuta `su ` ``` 功能: 1. 在 `/etc/passwd` 中查找当前用户的 UID 行,并定位 4 字符 UID 字段的字节偏移量。 2. 在该偏移量上执行 `write4`,将 UID 替换为 `0000`。 3. 调用 `pwd.getpwnam(用户)` 确认 libc 现在报告 UID 为 0。 4. 使用 `--shell` 时,执行 `execvp("su", ["su", 用户])`。输入您自己的密码。PAM 针对 `/etc/shadow`(未修改)进行验证,然后 `setuid(getpwnam(用户).pw_uid)` 被设置为 0。 ### 前提条件 - 运行中的用户具有 4 位 UID(1000-9999)。1-3 位 UID 需要多次写入;请根据需要扩展 `write4`。 - 没有 NSS 缓存守护进程(`nscd`、`sssd`、`systemd-userdbd`)掩盖对 `/etc/passwd` 的读取。如果补丁应用后 `getpwnam` 仍返回真实 UID,请重启或清除缓存,或选择其他用户。 - `/etc/passwd` 页面必须在补丁应用和 `su` 执行之间保留在缓存中。在任何内存压力正常的系统中,这在实践中是可靠的。 ### 还原 磁盘上的 `/etc/passwd` 文件保持不变。 干运行(不带 `--shell` 运行 `exploit_cve_2026_31431.py`)会在退出时通过 `POSIX_FADV_DONTNEED` 自动清除损坏的页面,因此 UID → 名称查找会立即恢复正常。 使用 **`--shell`** 后,页面保持损坏状态直到被清除。损坏期间,任何解析 UID 1000 → 名称的操作(例如 `ls`、文件管理器、scp/sftp 所有权检查)都会失败或显示数字 ID。清除方法: ``` # 无权限:请求清除 /etc/passwd 的页缓存: python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \ os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)" # 从 root 控制台: echo 3 > /proc/sys/vm/drop_caches ``` 重启也会清除它。 ## `write4` 工作原理 ``` sendmsg([AAD de 8 bytes], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8], flags=MSG_MORE) splice(target_fd, pipe_w, 32, offset_src=file_offset) splice(pipe_r, op_fd, 32) recv(op_fd) # EBADMSG; la escritura temporal ya se ha realizado ``` AAD 位置 4-7 的 4 字节(`seqno_lo`)由 `authencesn` 写入目标分散列表,在该代码路径中,这是我们从 `target_fd` 提取的页缓存页面。页面内的着陆偏移量对应于我们传递给 `splice()` 的 `offset_src`。 ## 缓解措施 在补丁内核到达您的发行版之前: ``` sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false' sudo rmmod algif_aead 2>/dev/null ``` 应用补丁后,`test_cve_2026_31431.py` 应显示"前置条件未满足"消息并以退出码 0 退出。 原始修复将 AEAD 原地操作恢复为原地操作,使页缓存页面远离可修改的分散列表。 ## 📚 官方参考 - [CVE-2026-31431 - NVD](https://nvd.nist.gov) - [Copy Fail 补丁 - AlmaLinux](https://almalinux.org) - [Sysdig 安全研究](https://sysdig.com) - [CISA 警报](https://cisa.gov) ## ⚡ 最终建议 1. **关键优先级**:在 **2026 年 5 月 15 日前**更新内核(CISA 强制要求) 2. **若无法重启**:应用临时缓解措施,禁用 `algif_aead` 3. **在云/Kubernetes 环境中**:立即确认您的节点已打补丁 4. **监控**:在审计日志中查找 `algif_aead` 模块加载尝试 **最后更新**:2026 年 5 月 3 日 **状态**:🔴 严重 - 需要立即行动
标签:0day挖掘, AF_ALG, algif_aead, Chrome Headless, CVE-2026-31431, exploit, Kubernetes安全, Linux Kernel, Linux内核漏洞, LPE, page cache, Privilege Escalation, setuid, Web截图, Web报告查看器, 内核安全, 内核提权, 加密子系统, 协议分析, 多租户安全, 安全渗透, 容器安全, 容器逃逸, 本地提权, 权限提升, 逆向工具