暴露检查器和安全的可丢弃虚拟机实验环境,用于 CVE-2026-23111(Linux nf_tables 释放后使用本地权限提升)。防御性:检测、缓解、多发行版实验环境。不含漏洞利用代码。
针对 CVE-2026-23111 的防御性工具与可复现的虚拟机实验环境。该漏洞是 Linux 内核 nf_tables 中的释放后使用(use-after-free)本地权限提升漏洞(源于 nft_map_catchall_activate() 中元素活动性检查被逻辑取反,即 "off by !" 缺陷)。非特权本地用户可借助非特权用户命名空间提升至 root 权限,并逃逸出容器。
本仓库不含任何漏洞利用代码。它包含一个只读暴露检测器、一个用于创建真正非特权用户的脚本,以及虚拟机定义,让你能够安全地触达该缺陷并研究公开的研究成果。完整的提权到 root 的利用链位于下方链接的公开披露中,而非本仓库。
完整分析文章:https://techearl.com/cve-2026-23111-nftables-lpe
check-exposure.sh — 只读检测器:对比内核版本与已修复版本、检测 nf_tables 是否存在、检查非特权 userns 前置条件,以及内核日志中的崩溃特征。setup-unprivileged-user.sh — 创建一个没有 sudo 权限的 labuser,并证明其确为普通非特权用户。LPE 测试的意义在于:必须从一个本身无法成为 root 的用户开始。Vagrantfile — 一次性的 Debian 12 和 AlmaLinux 10 虚拟机(Multipass 无法启动的发行版)。容器与宿主机共享内核。在容器内运行内核漏洞利用,实际上是在针对你真实的主机内核执行,因此一次"测试"就可能危及实际机器本身。请使用拥有独立内核的一次性虚拟机。
Multipass 只能启动 Ubuntu,因此其余发行版使用 Vagrant。
每个发行版都需要不同的技巧,才能在云虚拟机上启动一个真正处于修复前、且网络功能仍然可用的内核:
linux-aws,而不是 linux-generic。通用内核缺少 AWS ENA 网卡驱动,在 Nitro 实例上会失去 SSH 连接。执行 sudo apt install -y linux-image-6.8.0-1028-aws(低于已修复的 6.8.0-1051),在 GRUB 中将其设为默认启动项,然后重启。在本地虚拟化环境中,通用内核没有问题。cloud 内核(可保留 ENA 驱动):deb [check-valid-until=no trusted=yes] https://snapshot.debian.org/archive/debian/20251201T000000Z/ bookworm main,然后执行 apt install -y linux-image-6.1.0-39-cloud-amd64=6.1.148-1(低于已修复的 6.1.164-1,DSA-6163-1)。el10_1 内核位于 10.1 vault 中。将 dnf 指向 https://vault.almalinux.org/10.1/BaseOS/x86_64/os/,执行 dnf install kernel-6.12.0-124.38.1.el10_1,然后运行 。# 1. Create a real unprivileged user and prove it cannot sudo.
# (useradd, not Debian's adduser, so it works on RHEL too.)
sudo bash setup-unprivileged-user.sh labuser
# 2. Exposure verdict.
sudo ./check-exposure.sh
# 3. As labuser, the precondition, then the public nft trigger inside a netns.
sudo -u labuser unshare -Ur id # uid=0 in a new userns = precondition open
# (denied on stock Ubuntu 24.04 = mitigation working)
# The public FuzzingLabs trigger (catchall GOTO + aborted batch). Inlined here as
# documentation; this repo does not ship an executable exploit/trigger file.
sudo -u labuser unshare -Urn bash -c '
nft add table inet t; nft add chain inet t c
nft add map inet t m "{ type ipv4_addr : verdict; }"
nft add element inet t m "{ * : goto c }"
printf "delete element inet t m { * }\ndelete element inet t m { 1.2.3.4 }\n" > /tmp/b.nft
nft -f /tmp/b.nft; nft flush ruleset'
该序列会执行存在缺陷的中止(abort)路径;它不包含权限提升链,并且在原版内核上不会产生任何输出(见下文)。
关于触发器,如实结论是:在原版生产内核上它不会产生任何输出。 它执行存在缺陷的中止路径,但不会崩溃,也没有任何 dmesg 输出,即使循环执行"释放并重用"也是如此。文章中的 KASAN: slab-use-after-free 输出来自启用了 KASAN/调试选项的内核;要将这一潜在的使用后释放漏洞武器化,需要漏洞利用中的堆喷射(不包含在本仓库中)。该实验环境证明了非特权用户能够触达该缺陷,展示了 Ubuntu 默认的 AppArmor 限制如何阻断这一路径,并给出明确的"已暴露 / 已缓解 / 已修复"判定。按设计,它不会直接给你一个 root shell。
限制非特权用户命名空间(封堵公开漏洞利用的现实路径),然后修补内核。
# Ubuntu 23.10+ (AppArmor-based, keeps legitimate userns users working):
echo "kernel.apparmor_restrict_unprivileged_userns=1" | sudo tee /etc/sysctl.d/99-restrict-userns.conf
sudo sysctl --system
# Elsewhere (blanket disable; set both on Debian/Ubuntu):
printf 'kernel.unprivileged_userns_clone=0\nuser.max_user_namespaces=0\n' | sudo tee /etc/sysctl.d/99-restrict-userns.conf
sudo sysctl --system
# Patch (Ubuntu 24.04 generic fixed at 6.8.0-107.107):
sudo apt update && sudo apt install --only-upgrade linux-image-generic && sudo reboot
MIT。仅限防御与教育用途。
| 发行版 | 启动方式 | 原因 |
|---|
| Ubuntu 24.04 / 22.04 | Multipass(仅限 Ubuntu) | Exodus 已在两者上复现;24.04 默认启用 AppArmor userns 限制,因此可用来展示该缓解措施。 |
| Debian 12 | Vagrant(vagrant up debian) | Exodus 已在其上复现;非特权 userns 默认开放。 |
| AlmaLinux / Rocky 10.1 | Vagrant(vagrant up alma) | 与 FuzzingLabs 的目标内核 6.12.0-124.x.el10 一致,其公开触发器可按发布版本原样复现。 |
grubby --set-default| 发行版 | 启动的易受攻击内核 | userns 默认状态 | 判定结果 |
|---|
| Ubuntu 24.04 | 6.8.0-1028-aws | 受限(AppArmor) | 已缓解,未修复 |
| Debian 12 | 6.1.0-39-cloud(6.1.148-1) | 开放 | 已暴露 |
| AlmaLinux 10.1 | 6.12.0-124.38.1.el10_1 | 开放 | 已暴露 |