
CHARON — pre-built PoC for CVE-2026-46333 (Linux ptrace mm==NULL fd theft)
/ || | | | / \ | _ \ / _ | \ | | | | | || | / _ \ | |) | | | | | | | | | _ |/ ___ | _ <| || | |\ | _||| |// __| _\/|_| _|
ferries fds across the exit-mm() Styx CVE-2026-46333 / Linux <= 6.12.89
> *「生ける神の手に落ちるのは、恐ろしいことです。」*
> — ヘブライ人への手紙 10:31
## これは何か
**CVE-2026-46333** に対する、依存関係ゼロのコンパクトな PoC です。これは Qualys が 2026-05-15 に公開した、`__ptrace_may_access` の mm==NULL バイパスです。Charon は、終了間際の SUID-root プロセスに対して `pidfd_getfd(2)` をレースさせ、`do_exit()` 内のごく短い mm-NULL ウィンドウをすり抜けて、そのプロセスが開いている `/etc/shadow` ファイルディスクリプタを奪取します。影響を受けるマシン上で非特権ユーザーとして実行すると、`/etc/shadow` を標準出力にダンプします。
$ ./charon [banner on stderr] [] lure /usr/bin/chage target /etc/shadow root:$y$j9T$ztS5H...$hz9W87TlqxEW...:... daemon::20582:0:99999:7::: bin:*:20582:0:99999:7::: ...
典型的な結果:4 コア VM では 1 秒未満で成功し、スモークテストでは **約 137 回**の試行が必要でした。
## 30 秒でわかるバグ
`__ptrace_may_access()` は、`task->mm == NULL` のときダンプ可能性チェックをショートサーキットします。このファストパスはカーネルスレッド(swapper など)向けに書かれたものです。カーネルスレッドは本来 mm を持たず、ptrace されるべきではありません。しかし `do_exit()` は `exit_files()` の *前に* `exit_mm()` を実行するため、ユーザー空間の SUID プロセスにはごく短い間、次の状態が生じます:
- `task->mm == NULL`(mm は回収済み)→ ダンプ可能性チェックがスキップされる
- ファイルテーブルはまだ生存 → fd はまだ取得可能
- creds は `setreuid()` 後の権限降下を反映 → アクセスチェックを通過
`pidfd_getfd(2)` はそのアクセスチェックを信頼するため、SUID プロセスが開いているファイルディスクリプタを攻撃者に引き渡してしまいます。
do_exit() ├── exit_mm() ← task->mm = NULL ├── ... ← __ptrace_may_access() now lies └── exit_files() ← fd table reaped
Jann Horn 氏は 2020 年 10 月、lore.kernel.org でこの FD 窃取という攻撃パターンを指摘しました。この修正はメンテナーによるレビューに約 6 年間留め置かれ、Qualys がそれを再び最優先の案件として取り上げるまで放置されていました。
**アップストリーム修正:** [`31e62c2ebbfd`](https://github.com/torvalds/linux/commit/31e62c2ebbfdc3fe3dbdf5e02c92a9dc67087a3a)(Linus、2026-05-14)。2026-05-15 時点で、このバックポートは linux-6.12.y および linux-6.6.y の安定版にはまだ取り込まれていません。
## 影響を受けるカーネル
| 安定ツリー | 状態 |
|---|---|
| linux-6.12.y (≤ 6.12.89) | ❌ 脆弱 |
| linux-6.6.y (修正バックポート前) | ❌ 脆弱 |
| mainline ≥ 6.15-rc1 | ✅ 修正済み (`31e62c2ebbfd`) |
| ディストリビューション | カーネル | 状態 (2026-05-15) |
|---|---|---|
| Debian trixie | 6.12.86+deb13 | ❌ |
| AlmaLinux 10.1 | 6.12.0-124.55.3 | ❌ |
| Ubuntu 26.04 | 7.0.0-15 | ⚠️ 要確認 |
| Fedora 44 | 7.0.4-200 | ⚠️ 要確認 |
この PR / 最新ステータスの表は、バックポートが取り込まれ次第更新されます。
## ビルド
```sh
# Tiny 38 KB static binary (recommended)
sudo apt-get install musl-tools
make static
# Or just the standard glibc build
make
出力:単一の ELF バイナリ ./charon が生成されます。
./charon # dump /etc/shadow (default)
./charon -q # no banner / progress, just shadow on stdout
./charon -v # show per-hit + final stats
./charon -r 5000 # more patience for slow systems
./charon -t /etc/ssh/ssh_host_ecdsa_key # different target (uses ssh-keysign bait)
./charon -a # auto-discover SUID/SGID baits if built-ins miss
./charon -L # list candidate baits without trying any
./charon --help
--auto は /usr/bin、/usr/sbin、/usr/local/{bin,sbin}、/usr/lib/openssh、/usr/libexec、/bin、/sbin を走査し、すべての SUID/SGID 通常ファイル(su、sudo、newgrp、pkexec のような対話型ベイトは除外)を検出して、それぞれを要求されたターゲットに対するベイトとして試行します。ベイトごとの予算は厳しめ(5 ラウンド × 内側 2000 回)に設定されているため、何もマッチしない場合でもフルスキャンは約 10 秒で完了します。
--list-baits は読み取り専用版です。エクスプロイトを発火させずに同じ候補を列挙するため、どのディストリビューションがどのベイトを同梱しているかを調査するのに便利です。
| コード | 意味 |
|---|---|
| 0 | 成功 — ファイルの内容が標準出力に出力される |
Charon には、既知の SUID ルアーが 4 つ同梱されています:
ルアーの追加は、charon.c の lures[] 配列への 3 行の編集で完了します。
31e62c2ebbfd を直接適用する。pidfd_getfd(2) を無効化する。chage と passwd から setuid ビットを削除する。no_new_privs を有効にすると、このプリミティブが完全にブロックされる — コンテナ内のすべての「SUID」が不活性になり、Charon には獲物が残らない。Google の kernelctf VRP チャレンジ VM は、プレイヤーの bash を nsjail サンドボックス内で実行します。このサンドボックスは clone_newuser:true(uid 0 はマッピングされない)、chroot:/chroot、no_new_privs:1 を備えています。no_new_privs の下では setuid ビットが不活性になるため、サンドボックス内に実際の SUID の獲物は存在せず、/flag も chroot の外側のホスト上にあります。したがって Charon で kCTF VRP を獲得することはできません。Charon は、ベアメタルの Debian / Ubuntu / RHEL 系インストールに対する正当な Linux LPE であり続けます。
教育目的および許可された防御用途に限ります。
⛵ STYX ⛵
╔══════════════════════════════╗
║ do_exit(): ║
║ ├── exit_mm() ← task->mm ║
║ │ = NULL ║
║ ├── ... ← ferry ║
║ └── exit_files() ║
╚══════════════════════════════╝
| 1 | このシステム上のどの SUID ルアーでも要求されたファイルを開けない |
| 2 | カーネルは修正済みと思われる(CVE-2026-46333 は解決済み) |
| 3 | ヒットせずにラウンドを使い切った(稀。-r 5000 を試すこと) |
| 4 | CLI / IO エラー |
| バイナリ | 開くファイル | 対応ディストリビューション |
|---|
/usr/bin/chage (chage -l <user>) | /etc/shadow | ほとんどの Debian、Ubuntu、Fedora |
/usr/sbin/chage | /etc/shadow | RHEL / Rocky / Alma 系 |
/usr/bin/passwd (passwd -S <user>) | /etc/shadow | ほとんどのディストリビューション |
/usr/lib/openssh/ssh-keysign | /etc/ssh/ssh_host_*_key | HostbasedAuthentication が有効なディストリビューション |