
Linux カーネルのローカル特権昇格エクスプロイト 3 種。Dirty COW や Dirty Pipe と同じバグクラス。数秒で root シェル。主要なディストリビューションすべてに影響。
3 つすべてがカーネルのページキャッシュ — プロセスが実際に読み取り実行するファイルのメモリ内コピー — を破壊します。ディスク上のファイルには一切触れません。ファイル整合性ツールは何も検知しません。execve("/usr/bin/su") はキャッシュから読み込み → あなたのシェルコードを実行 → root。
| エクスプロイト | CVE | メカニズム | ルートまでの時間 | 行数 |
|---|---|---|---|---|
| Dirty Pedit | CVE-2026-46331 | TC pedit COW ギャップ (u32 ラップアラウンド) | < 1 秒 | 275 |
| skb_shift | CVE-2026-43503 | TCP SACK frag 転送時のフラグ喪失 | ~10 秒 | 500 |
| GRO Flag Loss | CVE-2026-43503 | GRO 結合時の frag 転送フラグ喪失 | ~10 秒 | 550 |
すべて: 非特権 → root。特別な権限は不要。ユーザー名前空間のみ。
このリポジトリのすべてのエクスプロイトは同じパターンに従います:
1. Get page-cache pages into a kernel buffer (splice)
2. Bypass the copy-on-write defense
3. Write in-place → read-only file corrupted in memory
異なるのは、防御がどのようにバイパスされるか、そして何が書き込みを実行するかです:
2016 Dirty COW COW race via mmap + fork
2022 Dirty Pipe Stale PIPE_BUF_FLAG_CAN_MERGE in splice
2026 Copy Fail AF_ALG in-place AEAD on page-cache scatterlist
2026 Dirty Frag ESP skip_cow on splice'd frags (missing flag)
2026 Fragnesia skb_try_coalesce drops SHARED_FRAG flag
2026 Dirty Pedit ← TC pedit COW gap, no crypto needed
2026 skb_shift ← TCP SACK drops SHARED_FRAG, ESP writes
2026 GRO Flag Loss ← GRO merge drops SHARED_FRAG, ESP writes
デフォルト設定。脆弱性を発現させるのに追加の堅牢化は不要。Linux を実行していた場合、影響を受けていました。
skb_shift と GRO はどちらも同じ悪用手法を使用します: SKBFL_SHARED_FRAG フラグを失わせ、事前計算された IV ルックアップテーブルを使用して ESP 暗号にページキャッシュページへ 1 バイトずつ XOR させます。
Dirty Pedit はまったく異なるものです:
skb_store_bits 経由で指定したバイトを正確に書き込みます。skb_ensure_writable を破壊します。# Build all three
cd dirty_pedit && gcc -static -O2 -o exploit exploit.c && cd ..
cd skb_shift && gcc -static -O2 -o exploit exploit.c && cd ..
cd gro && gcc -static -O2 -o exploit exploit.c && cd ..
各エクスプロイトは単一の自己完結型 C ファイルです。libc 以外の依存関係はありません。
# Any of the three (as unprivileged user):
./exploit
# → root shell
必要条件: 影響を受けるバージョン範囲の Linux カーネル + CONFIG_USER_NS=y(主要なすべてのディストリビューションでデフォルト)。
[*] Dirty Pedit — Local Privilege Escalation
[*] uid=1000 pid=42
[*] Victim line at offset 186: nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
[*] Injecting user 'a' (uid=0, no password) over victim line...
[+] User 'a' injected with uid=0!
[+] Running: su a
# id
uid=0(root) gid=0(root) groups=0(root)
[*] uid=1000 euid=1000
[*] IV table pre-computed (256 entries)
[*] Writing 192 bytes to /usr/bin/su...
[120] 0x00→0x48 ... OK
[121] 0x00→0x31 ... OK
[*] Write complete: 192/192
[!] /usr/bin/su page cache overwritten!
# whoami
root
すべての脆弱性は Linux カーネルセキュリティチームとネットワークメンテナに責任を持って開示されました。パッチはアップストリームにマージされ、安定版ツリーにバックポートされています。
899ee91156e548f6a5356a33これらのエクスプロイトは、パッチが利用可能になった後に教育および防御目的で公開されています。ページキャッシュ破壊はメモリ上のみです — 再起動または echo 1 > /proc/sys/vm/drop_caches で元のファイルが復元されます。
Rajat Gupta — Qualcomm オフェンシブセキュリティ
MIT
| エクスプロイト | バイパスされる防御 | 書き込み実行者 |
|---|
| Dirty Pedit | skb_ensure_writable (u32 ラップアラウンド → 部分 COW) | skb_store_bits (直接 4 バイト書き込み) |
| skb_shift | SKBFL_SHARED_FRAG フラグが TCP SACK 中に喪失 | ESP AES-GCM 復号 (パケットごとに 1 バイト) |
| GRO Flag Loss | SKBFL_SHARED_FRAG フラグが GRO マージ中に喪失 | ESP AES-GCM 復号 (パケットごとに 1 バイト) |
| エクスプロイト | 導入 | 修正 | 影響を受けるディストリビューション |
|---|
| Dirty Pedit | v5.18 (2022年5月) | v7.1-rc7 | Ubuntu, RHEL, Debian, Fedora, SUSE |
| skb_shift | v3.9 (2013) | v7.1-rc5 | 過去13年間すべてのディストリビューション |
| GRO Flag Loss | v3.9 (2013) | v7.1-rc5 | 過去13年間すべてのディストリビューション |
| 特性 | Dirty Pedit | skb_shift | GRO |
|---|
| 権限 | なし (userns) | なし (userns) | なし (userns) |
| ファイルアクセス | O_RDONLY | O_RDONLY | O_RDONLY |
| 暗号の必要性 | いいえ | はい (AES-GCM) | はい (AES-GCM) |
| 書き込み制御 | 4 バイト/パケット | 1 バイト/パケット | 1 バイト/パケット |
| 信頼性 | 決定的 | 決定的 | 確率的 (リトライ) |
| K8s コンテナエスケープ | いいえ (veth 不要) | いいえ | はい (veth+GRO デフォルト) |
| 攻撃対象領域 | geneve + TC | loopback + espintcp | veth + ESP-in-UDP |