本项目是一个用 Rust 实现的本地权限提升(LPE)漏洞(模拟 CVE-2026-31431)的概念验证(PoC)。它演示了如何通过利用 Crypto API 来操纵 Linux 内核页缓存。[cite: 1, 2]
[!CAUTION] 此代码仅用于教育和道德安全研究目的。未经事先明确同意,使用此工具攻击系统是非法的。作者对因使用本程序造成的任何误用或损害不承担任何责任。
该工具利用与 AF_ALG(内核加密接口)和 splice 系统调用相关的漏洞。[cite: 2] 它允许非特权用户覆盖只读文件的页缓存中的 4 个字节——具体目标是 /etc/passwd 中的 UID 字段,以将其临时更改为 0000(root)。[cite: 1, 2]
main.rs 以找到当前用户 UID 在 /etc/passwd 中的确切文件偏移量。[cite: 1, 2]AF_ALG 并采用 authencesn(hmac(sha256),cbc(aes)) 算法初始化一个套接字。[cite: 2]setsockopt 参数并使用 splice,它将文件数据重定向到加密管道中。[cite: 2]0000)覆盖原始页缓存数据。[cite: 2]--shell 标志,它将执行 su <user>,由于系统现在在缓存的 /etc/passwd 中看到用户 UID 为 0,该命令将成功执行。[cite: 1]POSIX_FADV_DONTNEED 驱逐被破坏的页缓存以恢复系统完整性。[cite: 1]libc 和 nix(启用 fs、socket、zerocopy 和 user 功能)。[cite: 3]cargo build --release
测试页缓存修补而不生成 shell:
./target/release/cve-2026-31431
尝试提升至 root shell:
./target/release/cve-2026-31431 --shell
main.rs:编排攻击流程,处理命令行参数,并执行最终的 shell 命令。[cite: 1]modules.rs:包含核心利用逻辑,包括 AF_ALG 套接字操纵和 UID 偏移量搜索。[cite: 2]Cargo.toml:定义项目元数据和外部 crate 依赖项。[cite: 3]main.rs、modules.rs、Cargo.toml[cite: 1, 2, 3]socket、bind、sendmsg、splice、posix_fadvise。[cite: 1, 2]