CVE-2026-31431 的本地权限提升漏洞利用程序,针对 Linux 内核 AF_ALG + splice 页缓存覆盖漏洞。包含 PoC、BPFtrace 检测脚本,以及用于授权安全研究的 QEMU 测试环境。
Linux 内核通过 AF_ALG + splice 覆盖页缓存实现本地权限提升
仅限授权的安全研究、渗透测试和教育用途。 请勿对您不拥有或未经明确书面许可的系统使用。
CVE-2026-31431 是 Linux 内核中的一个本地权限提升(LPE)漏洞。非特权本地用户可以通过将 AF_ALG 套接字接口与 splice() 结合使用,直接向属于 setuid 二进制的页缓存页面执行经过认证的写入,从而获得 root 访问权限。
该漏洞利用程序会覆盖页缓存中的 su 二进制文件,而无需修改磁盘上的 inode,从而绕过仅依赖文件元数据或块级校验和的完整性机制。
.
├── exploit.py # PoC — 页缓存覆盖和权限提升
├── detect.bt # 用于实时检测的 BPFtrace 脚本
├── run-vm.sh # QEMU 测试环境自动化(可选)
├── PAYLOAD.md # 载荷编码分析(hex → zlib → ELF → shellcode)
└── LICENSE
在任何易受攻击的系统上以非特权本地用户身份运行 exploit.py — 无需 sudo:
python3 exploit.py
该脚本执行以下步骤:
AF_ALG(algif_aead)并定位 su 二进制文件。su 二进制文件,并通过 AF_ALG + sendfile 覆盖其页缓存页面。支持的架构:
使用 detect.bt 实时监控利用尝试。需要 root 权限:
sudo bpftrace detect.bt
# 或
doas bpftrace detect.bt
该脚本使用 @suspect[pid] 中的位掩码跟踪每个 PID 的三个指标:
当同一 PID 上三个位全部置位(@suspect[pid] == 0x7)时,将触发警报。
exploit.pyAF_ALG/algif_aead 模块的 Linux 内核detect.btbpftrace ≥ 0.12# 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
将发行版的内核包更新为包含主线提交
a664bf3d603d 的版本,
该提交撤销了 2017 年的 algif_aead 原地优化,使页缓存页面不再可能出现在可写目标 scatterlist 中。大多数主流发行版目前正在推送此修复。
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
“否”行中的子系统直接使用内核内加密 API — 它们从不经过 AF_ALG。性能会回退到普通的用户空间加密库,而这正是几乎所有其他程序已经在使用的。
在禁用之前,要检查系统上是否有任何程序正在积极使用 AF_ALG:
lsof | grep AF_ALG
ss -xa | grep alg
无论补丁状态如何,都拒绝不受信任的工作负载创建 socket(AF_ALG, ...)。将 AF_ALG(协议族 38)添加到您的 seccomp 拒绝列表,或使用限制非特权进程 socket 调用的 AppArmor/SELinux 策略。
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 替代) |
# 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. 启动/创建虚拟机
2. 通过 SSH 连接
3. 上传文件到虚拟机 (exploit.py、detect.bt)
4. 在虚拟机内运行 exploit
5. 在虚拟机内运行 detect.bt
6. 检查虚拟机状态
7. 停止虚拟机
8. 清理虚拟机文件
0. 退出
| 字段 | 值 |
|---|---|
| 用户 | ubuntu |
| 密码 | cve123 |
| SSH 端口 | 2222 |
crypto/af_alg.c — 内核源码mm/splice.c — 内核源码本项目采用 GNU 通用公共许可证 v3.0 或更高版本 授权。 完整文本请参见 LICENSE。
免责声明: 本仓库仅用于授权的安全研究、渗透测试和教育目的。作者对因使用本软件造成的任何滥用或损害不承担任何责任。
| 字段 | 值 |
|---|
| 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 套接字上执行 sendfile(),但在 splice() 完成传输之前,未对映射的页缓存页面强制执行写时复制语义 |
| 发行版 | 内核版本 | 架构 |
|---|
| 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 |
| 架构 | 变体 |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l、armv6l、armv7l |
| x86 32 位 | i386、i486、i586、i686 |
| MIPS 64 位 | mips64、mips64el |
| LoongArch | loong64、loongarch64 |
| s390x | — |
| 位 | 系统调用 | 指标 |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | 已创建 AF_ALG 套接字 |
0x2 | setsockopt(SOL_ALG, ...) | 已配置加密操作 |
0x4 | sendmsg(MSG_MORE) + splice() | 已尝试页缓存覆盖 |
| 受影响? | 子系统/使用场景 |
|---|
| 否 | dm-crypt/LUKS、kTLS、IPsec/XFRM、内核内 TLS |
| 否 | OpenSSL、GnuTLS、NSS 默认构建 |
| 否 | SSH、内核密钥环加密 |
| 可能 | 显式启用 afalg 引擎的 OpenSSL |
| 可能 | 嵌入式加密卸载路径或直接绑定 aead/skcipher/hash 套接字的应用程序 |