
노출 확인기 및 CVE-2026-23111 (Linux nf_tables use-after-free local privilege escalation)을 위한 안전한 일회용 VM 실습 환경. 방어적: 탐지, 완화, 멀티 배포판 실습. 익스플로잇 없음.
CVE-2026-23111을 위한 방어 도구 및 재현 가능한 가상 머신 실험실입니다. 이는 리눅스 커널의 nf_tables use-after-free 로컬 권한 상승( nft_map_catchall_activate()에서 요소 활성화 검사가 반전된 "off by !" 버그)입니다. 권한이 없는 로컬 사용자가 권한 없는 사용자 네임스페이스를 통해 루트로 권한을 상승시키고 컨테이너를 탈출할 수 있습니다.
이 리포지토리는 익스플로잇을 포함하지 않습니다. 읽기 전용 노출 확인자, 실제로 권한이 없는 사용자를 생성하는 스크립트, 그리고 VM 정의가 포함되어 있어 안전하게 버그에 도달하고 공개 연구를 학습할 수 있습니다. 전체 루트 체인은 아래 링크된 공개 자료에 있으며, 여기에는 없습니다.
전체 글: https://techearl.com/cve-2026-23111-nftables-lpe
check-exposure.sh — 읽기 전용 탐지기: 커널 버전 대 수정된 빌드, nf_tables 존재 여부, 권한 없는 userns 사전 조건, 커널 로그 크래시 시그니처.setup-unprivileged-user.sh — labuser를 sudo 없이 생성하고 권한이 없음을 증명합니다. LPE 테스트의 요점은 이미 루트가 될 수 없는 사용자부터 시작하는 것입니다.Vagrantfile — 일회용 Debian 12 및 AlmaLinux 10 VM (Multipass가 실행할 수 없는 배포판).컨테이너는 호스트 커널을 공유합니다. 컨테이너 내에서 커널 익스플로잇을 실행하면 실제 호스트 커널에 대해 실행되므로, "테스트"가 실제 머신을 손상시킬 수 있습니다. 자체 커널이 있는 일회용 VM을 사용하세요.
Multipass는 Ubuntu만 실행할 수 있으므로 나머지는 Vagrant를 사용합니다.
각 배포판은 클라우드 VM에서 네트워킹이 여전히 작동하는 실제 수정 전 커널을 부팅하기 위해 다른 방법이 필요했습니다.
linux-generic이 아닌 이전 linux-aws를 사용합니다. 일반 커널에는 AWS ENA NIC 드라이버가 없어 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'
해당 시퀀스는 버그가 있는 중단 경로를 실행합니다. 권한 상승 체인은 포함되지 않으며, 기본 커널에서는 아무런 출력이 없습니다(아래 참조).
트리거에 대한 솔직한 결과: 프로덕션 기본 커널에서는 아무 소리도 나지 않습니다. 충돌이나 dmesg 출력 없이 버그가 있는 중단 경로를 실행하며, 해제 후 재사용으로 반복해도 마찬가지입니다. 글에서 나오는 KASAN: slab-use-after-free 출력은 KASAN/디버그 커널에서 온 것입니다; 잠재된 use-after-free를 무기화하려면 익스플로잇의 힙 스프레이가 필요합니다(이 리포지토리에는 없음). 이 실험실은 권한 없는 사용자가 버그에 도달한다는 것을 증명하고, Ubuntu의 기본 AppArmor 제한이 해당 경로를 차단함을 보여주며, 명확한 노출됨/완화됨/수정됨 판정을 제공합니다. 의도적으로 루트 셸을 제공하지 않습니다.
권한 없는 사용자 네임스페이스를 제한하고(공개 익스플로잇의 현실적인 경로를 차단), 커널을 패치합니다.
# 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 | restricted (AppArmor) | 완화됨, 수정되지 않음 |
| Debian 12 | 6.1.0-39-cloud (6.1.148-1) | open | 노출됨 |
| AlmaLinux 10.1 | 6.12.0-124.38.1.el10_1 | open | 노출됨 |