
CVE-2026-68398 Ubuntu PPPoL2TP use-after-free ローカル権限昇格

このリポジトリには、CVE-2026-68398 のビルド固有のローカル権限昇格エクスプロイトが含まれています。これは、PPPoL2TP の受信処理と、未接続の PPP チャネルの破棄との間の use-after-free 競合です。QEMU 上で、公式 Ubuntu 22.04 パッケージ linux-image-5.15.0-187-generic(5.15.0-187.197)に対して検証済みです。
最終テストは、補助グループ、ケーパビリティ、sudo アクセスを一切持たない専用 UID 1001 ユーザーとして開始し、初期名前空間の UID 0 を取得します。KASLR、SMEP、SMAP、AppArmor はすべて有効のままです。ゲストは nokaslr、nopti、nosmep、nosmap では起動されません。
警告
このコードは意図的にカーネルヒープの状態を破壊し、特定の 1 つの Ubuntu カーネルビルドに依存します。競合に失敗するとパニックやシステム破損を引き起こす可能性があります。所有する分離された使い捨て VM でのみ実行してください。
pppol2tp_recv() は L2TP UDP 受信パス内の RCU 読み取り側クリティカルセクションで実行され、最終的に ppp_input(&po->chan) を呼び出します。PPPoX ソケットとその組み込みの ppp_channel は RCU セーフですが、ppp_input() が使用する内部の struct channel は別の割り当てです。
PPPIOCGCHAN でバインドされているが、PPP ユニットに接続もブリッジもされていないチャネルでは、クローズパスがその内部オブジェクトを即座に解放していました:
RX: l2tp_udp_encap_recv -> pppol2tp_recv -> ppp_input(channel)
CLOSE: pppol2tp_release -> pppox_unbind_sock
-> ppp_unregister_channel -> ppp_release_channel -> kfree(channel)
したがって、受信パスは解放されたチャネルの skb キューとウェイトキューに対して操作を実行できる可能性があります。修正は struct channel に RCU コールバックを追加し、キューのパージと解放を RCU グレース期間が経過するまで延期します。
この脆弱性は、Doyensec の Norbert Szetei によって発見され、上流で修正されました。メインライン修正は ec4215683e47424c9c4762fd3c60f552a3119142 です。
Linux CNA レコードは、脆弱な系統が Linux 4.15 から始まると特定しています。ベンダーカーネルは別のバージョン番号で修正を適用する場合があるため、正確なソースまたはパッケージのチェンジログがこの表よりも優先されます。
サポートされている古いベンダー系統にはバックポートが必要です。2026-08-12 時点で、Ubuntu CVE トラッカー は Jammy の linux パッケージを needs-triage とマークしています。修正済みの Ubuntu Jammy パッケージは確認されていません。テストした 5.15.0-187.197 のソースは依然として kfree(pch) を直接呼び出しており、脆弱です。
カーネルは再コンパイルされていません。最小のクラウドイメージには linux-modules-extra-5.15.0-187-generic が含まれていなかったため、l2tp_ppp を提供するためにその公式 Ubuntu パッケージをインストールしました。linux-generic メタパッケージを使用する通常の Jammy インストールでは、対応する modules-extra パッケージにすでに依存しています。エクスプロイトが PPPoL2TP ソケットを作成すると、プロトコルモジュールが自動ロードされます。
自動 KASLR 検出器は x86 prefetch タイミングサイドチャネルを使用し、KPTI が無効な状態での RDTSCP を必要とします。テストしたホスト CPU は rdtscp、smep、smap を公開しており、Meltdown の影響を受けないため、Ubuntu はブートオーバーライドなしで KPTI を無効のままにします。/proc/cpuinfo が pti フラグを報告する CPU では、検出器は実行を拒否します。これはエクスプロイト固有のハードウェア条件です。基盤となる CVE は到達可能なままですが、このリリースは KPTI が有効なシステムでの KASLR バイパスを主張するものではありません。手動で指定するスライドは、管理された診断のためだけに存在します。
struct channel を再利用します。まだ実行中の RX パスは、制御されたキーバイトを自身の skb キューおよびウェイトキューとして扱います。core_pattern を使用し、キー割り当てポインタを露出させます。override_creds() を呼び出します。UID/GID フィールド、ケーパビリティ、および必要な user、namespace、ucount、group ポインタは、正確な Ubuntu ビルドに一致します。/proc/self/exe を /tmp 内の一意なファイルにコピーし、root 所有のモード 4755 に変更して、それらの属性を検証します。/usr/bin/id を実行します。最後のブリッジが必要なのは、override_creds() がアクティブなカーネルタスクの主観的資格情報を変更するためです。検証済みの SUID コピーをインストールして実行することで、その短命なプリミティブが通常のプロセス資格情報に変換されます。
Makefile はエクスプロイトを静的リンクします。タイミングに敏感な prefetch オブジェクトは意図的に -O0 でコンパイルされ、エクスプロイト自体は -O2 を使用します。
make
同等のコマンド:
gcc -O0 -Wall -Wextra -Werror -c -o build/kaslr_prefetch.o kaslr_prefetch.c
gcc -O2 -static -pthread -Wall -Wextra -Werror \
-o build/CVE-2026-68398 exploit.c build/kaslr_prefetch.o
検証済みの正確なカーネル上の通常のユーザーアカウントから:
id
grep '^Cap' /proc/self/status
./CVE-2026-68398 auto 60
ソースは uname() をチェックし、5.15.0-187-generic 以外のリリースを拒否します。競合は確率的です。失敗またはクラッシュ後は、再試行する前に使い捨てスナップショットをリブートしてください。
成功した実行は次のように終わります:
[KASLR] image_base=0xffffffffb9200000 slide=0x38200000
CVE-2026-68398 Ubuntu local privilege-escalation exploit
uid=1001 euid=1001 slide=0x38200000
...
[9/9] invoking override_creds and installing the SUID transition...
override callback: uid=0 euid=0 gid=0 egid=0
installed root-owned mode 4755 helper: /tmp/.cve-2026-68398-root-948
SUID helper ready; executing it from the original unprivileged task...
SUID transition: uid=0 euid=0 gid=0 egid=0
uid=0(root) gid=0(root) groups=0(root),1001(poc)
その実際の QEMU 実行からの完全な簡潔なトランスクリプトは、docs/example-output.txt にあります。
このチェーンは、通常どおりランダム化された 3 つの新規 Ubuntu ブートで完了しました。自動的に復元されたイメージベースは、0xffffffff90800000、0xffffffffa5a00000、0xffffffffb9200000 でした。最終実行では、上述の専用の非管理 UID 1001 アカウントを使用し、その後一時 SUID ファイルが削除されたことを検証しました。
同じ最終競合は、KASAN を有効にし、同じ 4 vCPU トポロジで、正確な上流修正コミット上でも 60 秒間実行されました。5,969 回のチャネル/キーサイクルを完了し、stage 1: no controlled reclaim を報告し、KASAN レポートやエクスプロイトステージ遷移は発生しませんでした。
このプライベートリポジトリが作成される前の 2026-08-12 に確認しました。SearchSploit/Exploit-DB はエクスプロイトを返さず、Packet Storm は一致するファイルを返さず、GitHub の正確コード検索は 22 件の CVE/アドバイザリミラーを返し PoC はなく、正確なウェブ検索でも上流修正とメタデータのみが見つかりました。これは特定時点での結果であり、後日別の PoC が現れないことを保証するものではありません。
kaslr_prefetch.c の基盤ですエクスプロイトは A. Ramos <[email protected]>(Twitter: @aramosf)によって書かれました。脆弱性の発見と上流の修正は、Norbert Szetei(Doyensec) に帰属します。
exploit.c は GPL-2.0-only です。kaslr_prefetch.c と kaslr_prefetch.h は MIT ライセンスであり、ソースファイル内に KASLD の帰属表示と完全な許可通知を保持しています。
| カーネル系統 | 最初の修正リリース | 修正コミット |
|---|
| 6.6.y | 6.6.148 | 4bb84e964ff0 |
| 6.12.y | 6.12.101 | 3ab32218d718 |
| 6.18.y | 6.18.42 | c9574b8a8ede |
| 7.1.y | 7.1.6 | 06213c85d8c0 |
| メインライン | 7.2-rc4 | ec4215683e47 |
| プロパティ | 値 |
|---|
| ディストリビューション | Ubuntu 22.04.5 LTS (Jammy) |
| カーネルパッケージ | linux-image-5.15.0-187-generic / 5.15.0-187.197 |
| カーネルリリース | 5.15.0-187-generic #197-Ubuntu |
| アーキテクチャ | x86-64 |
| VM | QEMU/KVM、-cpu host、4 vCPU、5 GiB RAM |
| 初期 ID | uid=1001(poc) gid=1001(poc) groups=1001(poc) |
| 初期ケーパビリティ | 継承可能・許可・実効・アンビエントがすべてゼロ |
| 最終 ID | 初期名前空間内での uid=0(root) gid=0(root) |
| 起動変更 | なし。標準のコマンドライン、KASLR 有効 |
| 要件 | Ubuntu 5.15.0-187 の状態 | エクスプロイトでの利用 |
|---|
| PPP | CONFIG_PPP=y | 組み込み |
| L2TP / PPPoL2TP | CONFIG_L2TP=m, CONFIG_PPPOL2TP=m | 公式 linux-modules-extra モジュール |
| User keys | CONFIG_KEYS=y | 解放された kmalloc-256 チャネルを再利用 |
| AppArmor | CONFIG_SECURITY_APPARMOR=y | 有効のまま。偽の cred には有効な unconfined ラベルが含まれる |
| KASLR | CONFIG_RANDOMIZE_BASE=y | 有効のまま。スライドは実行時に復元される |
| SMAP | CONFIG_X86_SMAP=y | 有効のまま |
| User/network namespaces | Ubuntu で有効だが未使用 | 名前空間のセットアップやケーパビリティ取得は不要 |
/dev/ppp | 不要 | チャネルはバインドされるが、PPP ユニットには決して接続されない |