astounds/copy-fail-CVE-2026-31431

GitHub: astounds/copy-fail-CVE-2026-31431

针对 CVE-2026-31431 Linux 内核本地提权漏洞的完整利用、检测与缓解工具包,通过 AF_ALG 与 splice 配合覆盖页缓存中 setuid 二进制文件实现无磁盘痕迹的提权。

Stars: 0 | Forks: 0

# CVE-2026-31431 — 复制失败 **通过 AF\_ALG + splice 页缓存覆盖实现 Linux 内核本地提权** [![CVE](https://img.shields.io/badge/CVE-2026--31431-red)](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-31431) [![CVSS](https://img.shields.io/badge/CVSS%20v3.1-7.8%20High-orange)](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?name=CVE-2026-31431&vector=AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H&version=3.1&source=kernel.org) [![License](https://img.shields.io/badge/license-GPLv3%2B-blue)](LICENSE) [技术分析报告](https://xint.io/blog/copy-fail-linux-distributions) ## 目录 - [描述](#description) - [漏洞详情](#vulnerability-details) - [仓库结构](#repository-structure) - [快速开始](#quick-start) - [检测](#detection) - [环境要求](#requirements) - [缓解措施](#mitigation) - [测试环境(可选)](#test-environment-optional) - [参考](#references) - [许可证](#license) ## 描述 CVE-2026-31431 是 Linux 内核中的一个本地提权(LPE)漏洞。无特权的本地用户可以通过将 `AF_ALG` socket 接口与 `splice()` 结合使用,直接对属于 setuid 二进制文件的页缓存页进行身份验证写入,从而获取 root 权限。 该漏洞利用程序在页缓存中覆盖 `su` 二进制文件,而无需修改磁盘上的 inode,从而绕过了仅依赖文件元数据或块级校验和的完整性检查机制。 ## 漏洞详情 | 字段 | 值 | |-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | CVE ID | CVE-2026-31431 | | 类型 | 本地提权(LPE) | | CVSS v3.1 评分 | **7.8 高危** — `AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H`(来源:kernel.org) | | 内核子系统 | `crypto/af_alg.c`, `mm/splice.c` | | 攻击向量 | 本地 — 需要无特权用户账户 | | 根本原因 | `algif_aead` 通过 AEAD socket 接受 `sendfile()`,而没有在 `splice()` 完成传输之前对映射的页缓存页强制执行写时复制(copy-on-write)语义 | ### 受影响的环境 | 发行版 | 内核版本 | 架构 | |------------------------|-------------------------|---------| | Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86\_64 | | Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86\_64 | | RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86\_64 | | SUSE 16 | 6.12.0-160000.9-default | x86\_64 | | Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 | ## 仓库结构 ``` . ├── exploit.py # PoC — page-cache overwrite and privilege escalation ├── detect.bt # BPFtrace script for real-time detection ├── run-vm.sh # QEMU test environment automation (optional) ├── PAYLOAD.md # Payload encoding analysis (hex → zlib → ELF → shellcode) └── LICENSE ``` ## 快速开始 在任何易受攻击的系统上以**无特权**的本地用户身份运行 `exploit.py` — 无需 `sudo`: ``` python3 exploit.py ``` 该脚本执行以下步骤: 1. 验证内核对 `AF_ALG` (`algif_aead`) 的支持,并定位 `su` 二进制文件。 2. 选择并解压适合当前架构的 payload。 3. 将 `su` 二进制文件作为原始文件描述符打开,并通过 `AF_ALG` + `sendfile` 覆盖其页缓存页。 4. 测试提权。如果成功,则进入一个 root shell。 **支持的架构:** | 架构 | 变体 | |--------------|------------------------| | x86\_64 | — | | aarch64 | — | | riscv64 | — | | ppc64le | — | | arm | armv5l, armv6l, armv7l | | x86 32 位 | i386, i486, i586, i686 | | MIPS 64 位 | mips64, mips64el | | LoongArch | loong64, loongarch64 | | s390x | — | ## 检测 使用 `detect.bt` 实时监控漏洞利用尝试。需要 root 权限: ``` sudo bpftrace detect.bt # 或 doas bpftrace detect.bt ``` 该脚本使用 `@suspect[pid]` 中的位掩码跟踪每个 PID 的三个指标: | 位 | 系统调用 | 指标 | |-------|----------------------------------|--------------------------------| | `0x1` | `socket(AF_ALG, SOCK_SEQPACKET)` | 已创建 AF_ALG socket | | `0x2` | `setsockopt(SOL_ALG, ...)` | 已配置 Crypto 操作 | | `0x4` | `sendmsg(MSG_MORE)` + `splice()` | 已尝试页缓存覆盖 | 当同一个 PID 上的所有三个位都被设置时(`@suspect[pid] == 0x7`),将触发警报。 ## 环境要求 ### `exploit.py` - Python 3.6+ - 已加载 `AF_ALG`/`algif_aead` 模块的 Linux 内核 - 本地无特权用户账户(**不**需要 root 权限) ### `detect.bt` - `bpftrace` ≥ 0.12 - Root 权限(BPF 跟踪需要) ``` # Ubuntu/Debian sudo apt install bpftrace # RHEL/CentOS/Fedora sudo dnf install bpftrace # Amazon Linux sudo yum install bpftrace # SUSE sudo zypper install bpftrace # Alpine sudo apk add bpftrace ``` ## 缓解措施 ### 1. 打补丁(首选) 将您的发行版内核包更新至包含主线提交 [`a664bf3d603d`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a664bf3d603d) 的版本,该提交恢复了 2017 年的 `algif_aead` 原地优化,从而使页缓存页不再出现在可写的目标分散列表(scatterlist)中。大多数主要发行版目前正在推送此修复。 ### 2. 禁用 `algif_aead`(在等待补丁期间) `blacklist` 可以通过显式的 `modprobe algif_aead` 绕过。`install .../bin/false` 指令将完全覆盖安装命令,使得每次加载尝试都失败: ``` echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf sudo rmmod algif_aead 2>/dev/null || true ``` #### 这会破坏什么 — 几乎没有 | 受影响? | 子系统/用例 | |-----------|-------------------------------------------------------------------------------------------| | **否** | dm-crypt/LUKS, kTLS, IPsec/XFRM, 内核内 TLS | | **否** | OpenSSL, GnuTLS, NSS 默认构建 | | **否** | SSH, 内核密钥环 crypto | | **可能** | 显式启用 `afalg` 引擎的 OpenSSL | | **可能** | 嵌入式 crypto 卸载路径或直接绑定 `aead`/`skcipher`/`hash` socket 的应用程序 | “否”行中的子系统直接使用内核内的 crypto API — 它们从不经过 `AF_ALG`。性能会回退到普通用户空间 crypto 库,这也是几乎所有其他程序目前已经在使用的。 在禁用之前,检查您的系统上是否有任何东西正在主动使用 `AF_ALG`: ``` lsof | grep AF_ALG ss -xa | grep alg ``` ### 3. 通过 seccomp 阻止(容器、沙箱、CI) 无论补丁状态如何,拒绝为不受信任的工作负载创建 `socket(AF_ALG, ...)`。将 `AF_ALG`(族 38)添加到您的 seccomp 拒绝列表中,或使用限制无特权进程 `socket` 调用的 AppArmor/SELinux 策略。 ### 4. 使用 `detect.bt` 进行监控 在任何无法立即打补丁或锁定的重要主机上部署包含的检测脚本。它将在任何执行完整三步漏洞利用原语的进程上发出警报。 ## 测试环境(可选) `run-vm.sh` 可自动创建一个 Ubuntu 24.04 QEMU 虚拟机,用于在受控环境中进行测试。`exploit.py` 和 `detect.bt` 直接在任何易受攻击的主机上运行 — 不需要 QEMU。 ### 宿主要求 | 依赖项 | 备注 | |----------------------------|-------------------------------------------------------------------| | `qemu-system-x86_64` + KVM | 请参阅下面的安装命令 | | `wget` 或 `curl` | 云镜像下载 | | `cloud-image-utils` | 种子镜像生成(在非 Debian 主机上可用 Docker 替代) | ### 安装 QEMU ``` # Ubuntu/Debian sudo apt install qemu-system-x86 cloud-image-utils wget # Fedora/RHEL sudo dnf install qemu-system-x86 wget # Arch sudo pacman -Sy qemu # Alpine sudo apk add qemu-system-x86 qemu-ui-gtk wget ``` ### 运行 ``` sh run-vm.sh ``` ### 交互式菜单 ``` 1. Start/Create VM 2. Connect via SSH 3. Upload files to VM (exploit.py, detect.bt) 4. Run exploit inside VM 5. Run detect.bt inside VM 6. Check VM status 7. Stop VM 8. Clean up VM files 0. Exit ``` ### 虚拟机凭据 | 字段 | 值 | |----------|----------| | 用户 | `ubuntu` | | 密码 | `cve123` | | SSH 端口 | `2222` | ## 参考 - [技术分析报告 — xint.io](https://xint.io/blog/copy-fail-linux-distributions) - [Payload 编码分析](PAYLOAD.md) — hex → zlib → ELF → shellcode 分解 - [`crypto/af_alg.c` — 内核源码](https://elixir.bootlin.com/linux/latest/source/crypto/af_alg.c) - [`mm/splice.c` — 内核源码](https://elixir.bootlin.com/linux/latest/source/mm/splice.c) ## 许可证 本项目基于 **GNU General Public License v3.0 或更高版本** 授权。 有关完整文本,请参见[许可证](LICENSE)。
标签:AF_ALG, CSV导出, CVE-2026-31431, CVSS 7.8, GPLv3, Linux内核, LPE, Python 3.9+, setuid, splice, su二进制文件, Web报告查看器, 内存文件系统, 内核利用, 安全漏洞, 提权利用, 本地提权, 权限绕过, 漏洞分析, 网络安全, 路径探测, 身份验证强制, 逆向工具, 隐私保护, 零日漏洞, 页缓存覆盖