CVE-2026-23111(Linux nf_tablesの解放後使用によるローカル権限昇格)に対する暴露チェッカーと安全な使い捨てVMラボ。防御的:検出、緩和、マルチディストリビューションラボ。エクスプロイトなし。
防御ツール群と、CVE-2026-23111(Linuxカーネルにおける nf_tables の Use-After-Free によるローカル権限昇格脆弱性。nft_map_catchall_activate() における要素アクティビティチェックの反転、つまり "off by !" バグ)のための再現可能な仮想マシンラボです。特権のないローカルユーザーが、非特権ユーザーネームスペースを通じて root に昇格し、コンテナから脱出できます。
このリポジトリにはエクスプロイトは含まれていません。読み取り専用の露出チェッカー、真に非特権のユーザーを作成するスクリプト、そして安全にバグに到達して公開研究を学ぶためのVM定義が含まれています。完全なルートチェーンは、以下にリンクされた開示情報にあり、ここではありません。
完全な解説: https://techearl.com/cve-2026-23111-nftables-lpe
check-exposure.sh — 読み取り専用の検出器:カーネルバージョンと修正ビルドの比較、nf_tables の存在、非特権ユーザーネームスペースの前提条件、カーネルログのクラッシュシグネチャ。setup-unprivileged-user.sh — sudo 権限のない labuser を作成し、非特権であることを証明します。LPEテストの要点は、すでに root になれないユーザーから開始することです。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 制限がそのパスをブロックすることを示し、明確な EXPOSED / MITIGATED / fixed の判定を提供します。設計上、root シェルを提供するものではありません。
非特権ユーザーネームスペースを制限し(公開エクスプロイトの現実的な経路を閉じる)、その後カーネルにパッチを適用します。
# 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. 防御および教育目的の使用。
| Distro | Launch with | Why |
|---|
| Ubuntu 24.04 / 22.04 | Multipass (Ubuntu のみ) | Exodus は両方で再現されました。24.04 はデフォルトで AppArmor のユーザーネームスペース制限を搭載しているため、緩和策を示しています。 |
| Debian 12 | Vagrant (vagrant up debian) | Exodus はこれで再現されました。非特権ユーザーネームスペースはデフォルトで開いています。 |
| AlmaLinux / Rocky 10.1 | Vagrant (vagrant up alma) | FuzzingLabs のターゲットカーネル 6.12.0-124.x.el10 と一致するため、公開トリガーが公開されたとおりに再現されます。 |
grubby --set-default| Distro | Vulnerable kernel booted | userns default | Verdict |
|---|
| 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 | 開いている | 露出あり |