Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/bsauce/kernel-exploit-factory
特権昇格脆弱性分析エクスプロイト学習と教育厳選リソースバイナリエクスプロイトラボと実践
GitHubbsauce/kernel-exploit-factory

kernel-exploit-factory

LinuxカーネルCVEエクスプロイト解析レポートと関連デバッグ環境。もうLinuxカーネルをコンパイルしたり、環境を設定したりする必要はありません。

リポジトリを見る
1.3k19663ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

kernel-exploit-factory

更新し続けています......

LinuxカーネルCVEエクスプロイト解析レポートと関連デバッグ環境。もうLinuxカーネルをコンパイルしたり、環境を設定したりする必要はありません。

このリポジトリは、すべてのLinuxカーネルエクスプロイトと関連デバッグ環境をまとめたものです。Qemuを使用してカーネルを起動し、エクスプロイトをテストできます。


例```bash

Eg, test CVE-2017-11176, finally you levate privileges and get the shell

john@john-virtual-machine:~/Desktop/kernel-exploit-factory/CVE-2017-11176$ ./start.sh chmod: /dev/csaw: No such file or directory ifconfig: SIOCSIFADDR: No such device route: SIOCADDRT: No such device / $ uname -a Linux (none) 4.11.9 #1 SMP Sat Feb 20 21:52:39 CST 2021 x86_64 GNU/Linux / $ id uid=1000(chal) gid=1000(chal) groups=1000(chal) / $ cd exp /exp $ ./exp-slab-4119 [] sk_rmem_alloc > sk_rcvbuf ==> ok [] mq_notify start [*] wake up thread 1 ... ... /exp # id uid=0(root) gid=0(root) /exp #

root@kitploit:~
---

## カタログ

1. CVE-2015-8550
2. CVE-2016-9793
3. 4-20-BPF-integer
4. CVE-2017-5123
5. CVE-2017-6074
6. CVE-2017-7308
7. CVE-2017-8890
8. CVE-2017-11176
9. CVE-2017-16995
10. CVE-2017-1000112
11. CVE-2018-5333
12. CVE-2019-9213 & CVE-2019-8956
13. CVE-2019-15666
14. CVE-2020-8835
15. CVE-2020-27194
16. CVE-2021-3156
17. CVE-2021-31440
18. CVE-2021-3490
19. CVE-2021-22555
20. CVE-2021-41073
21. CVE-2021-4154
22. CVE-2021-42008
23. CVE-2021-43267
24. CVE-2022-0185
25. CVE-2022-0847
26. CVE-2022-0995
27. CVE-2022-1015
28. CVE-2022-2588
29. CVE-2022-2602
30. CVE-2022-2639
31. CVE-2022-25636
32. CVE-2022-27666
33. CVE-2022-32250
34. CVE-2022-34918
35. CVE-2023-2598
36. CVE-2024-1086
37. CVE-2025-21702
38. CVE-2026-23271

---

## 詳細

#### 1.CVE-2015-8550

[writeup](https://blog.csdn.net/panhewu9919/article/details/100891770) 

**テストバージョン**: Linux-4.19.65

**保護**: kaslr/SMEP 有効、SMAP 無効。

**脆弱性**: gcc のコンパイル最適化による**Double-Fetch 脆弱性**で、直接制御フローを乗っ取ることが可能。

#### 2. CVE-2016-9793

[writeup](https://blog.csdn.net/panhewu9919/article/details/120164051) 

**テストバージョン**: Linux-4.8.13

**保護**: KASLR/SMAP/SMEP 無効。偽造した [skb_shared_info](https://elixir.bootlin.com/linux/v4.8.13/source/include/linux/skbuff.h#L414) 構造体はユーザー空間に存在するため、当然 SMAP を回避できない。

**脆弱性**: `net/core/sock.c` の [sock_setsockopt()](https://elixir.bootlin.com/linux/v4.8.13/source/net/core/sock.c#L658) 関数が**負値を誤って処理**するため、`sk_sndbuf` と `sk_rcvbuf` が負の値になる。`write` 呼び出し時に `skb->head` と `skb->end` が誤って設定され、最後に `close` を呼んで解放する際にユーザー空間へアクセスしてエラーになる。ユーザー空間アドレス `0xfffffed0` に偽造した [skb_shared_info](https://elixir.bootlin.com/linux/v4.8.13/source/include/linux/skbuff.h#L414) 構造体を配置し、`skb_shared_info->destructor_arg->callback` を介して制御フローを乗っ取る。

#### 3. 4-20-BPF-integer

[writeup](https://www.cnblogs.com/bsauce/p/11560224.html) 

**テストバージョン**: Linux-4.20.0-rc3

**保護**: SMEP 有効、kaslr/SMAP 無効。

**脆弱性**: Linux ebpf モジュールの `queue_stack_map_alloc()` における**整数オーバーフロー**脆弱性により、ヒープオーバーフローが発生する。仮想テーブルポインタを書き換えて、制御フローを `xchg eax, esp` に乗っ取る。

#### 4.CVE-2017-5123

[writeup](https://www.jianshu.com/p/90a040114188) 

**テストバージョン**: Linux 4.14-rc4

**保護**: SMEP / SMAP 有効、KASLR 無効。

**脆弱性**: `/kernel/exit.c` の `waitid` の実装では、`unsafe_put_user()` を呼び出してカーネルデータをユーザー空間アドレスにコピーする際に、`access_ok()` によるユーザー空間アドレスの正当性チェックが行われないため、実際にはカーネル空間アドレスへデータをコピーできる。**waitid がユーザーアドレスの正当性を検証しないため、NULL 任意アドレス書き込みが発生する**。0 アドレスの shellcode を実行するか、推測した範囲の cred を上書きして権限昇格する。

#### 5.CVE-2017-6074

[writeup](https://bsauce.github.io/2021/09/17/CVE-2017-6074/)      [reference](https://github.com/xairy/kernel-exploits/tree/master/CVE-2017-6074)

**テストバージョン**: Linux-4.9.12

**保護**: SMEP/SMAP 有効、kASLR 無効。

**脆弱性**: Linux カーネル IP V6 プロトコルファミリの DCCP(データグラム輻輳制御プロトコル)では、`net/dccp/input.c` の [dccp_rcv_state_process()](https://elixir.bootlin.com/linux/v4.9.12/source/net/dccp/input.c#L574) 関数が `LISTEN` 状態で `DCCP_PKT_REQUEST` パケットデータ構造を誤って処理するため、ユーザーが `IPV6_RECVPKTINFO` オプションを指定して `setsockopt()` を呼び出すと **`sk_buff` 構造体の Double-Free** が発生する。利用方法は CVE-2016-8655 に類似している。1 回目の脆弱性発火では、ヒープスプレーで `po->rx_ring->prb_bdqc->retire_blk_timer` 構造体を偽造し、`native_write_cr4(0x406e0)` を実行して SMEP/SMAP を無効化する。2 回目の発火では、ヒープスプレーで `skb-> ... ->destructor_arg` 構造体を偽造し、`commit_creds(prepare_kernel_cred(0))` を実行して権限昇格する。

#### 6.CVE-2017-7308

[writeup](https://www.jianshu.com/p/b53862cd64a6)      [reference](https://github.com/xairy/kernel-exploits/tree/master/CVE-2017-7308)

**テストバージョン**: Linux-4.10.6

**保護**: SMEP / SMAP 有効、KASLR 無効。

**脆弱性**: `net/packet/af_packet.c` の [`packet_set_ring()`](https://elixir.bootlin.com/linux/v4.10.6/source/net/packet/af_packet.c#L4181) 関数がブロックサイズを正しくチェックしておらず、長さ判定条件が誤っているため、**ヒープオーバーフロー**が発生する。`CAP_NET_RAW` 権限が必要。関数ポインタを 2 回乗っ取り、まず SMEP/SMAP 保護を無効化してから権限昇格する。

#### 7.CVE-2017-8890

[writeup](https://www.jianshu.com/p/699de662f567)      [reference](https://xz.aliyun.com/t/2383)

**テストバージョン**: Linux-4.10.15

**保護**: SMEP 有効、kASLR / SMAP 無効。

**脆弱性**: `net/ipv4/inet_connection_sock.c` の [`inet_csk_clone_lock()`](https://elixir.bootlin.com/linux/v4.10.15/source/net/ipv4/inet_connection_sock.c#L652) 関数に **Double-Free** 脆弱性が存在する。Double-Free を利用して RCU のコールバック関数ポインタを改ざんし、SMEP を無効化して shellcode にジャンプし、cred を書き換える。

#### 8.CVE-2017-11176

[writeup](https://www.jianshu.com/p/76041ec5c59f) 

**テストバージョン**: Linux-4.11.9

**保護**: SMEP 有効、kASLR / SMAP 無効。

**脆弱性**: Linux カーネル内の POSIX メッセージキューの実装において、`mq_notify()` 関数が sock ポインタを NULL に設定しないため、UAF が発生する。実際には**競合による Double-Free 脆弱性**だが、競合状態の時間を無限に延ばすことができる。

#### 9.CVE-2017-16995

[writeup](https://www.cnblogs.com/bsauce/p/11583310.html) 

**テストバージョン**: Linux-4.4.110

**保護**: SMEP/SMAP/kaslr 有効。

**脆弱性**: Linux ebpf モジュールの**整数拡張**問題。主な問題は、2 つのレジスタ値の型が異なるため、check 関数と実際の関数の実行方法が一致しないこと。この脆弱性はスタック攻撃や制御フローの乗っ取りを含まず、システムコールデータのみを使用して権限昇格する。Linux カーネルにおける Data-Oriented Attacks の典型的な応用例である。

#### 10. CVE-2017-1000112

[writeup](https://www.jianshu.com/p/1fa163fd5b82)  	  [reference](https://bbs.pediy.com/thread-265319.htm)

**テストバージョン**: Linux-4.12.6

**保護**: SMEP 有効、SMAP/kaslr 無効。

**脆弱性**: `net/ipv4/ip_output.c` の [__ip_append_data()](https://elixir.bootlin.com/linux/v4.12.6/source/net/ipv4/ip_output.c#L910) は UDP パケット処理の一貫性を保証していないため、2 回 send パケットを送信する際に UFO パスから non-UFO パスへ切り替えることができ、**ヒープオーバーフロー**が発生する。利用時には `skb_shared_info->destructor_arg->callback` を上書きして制御フローを乗っ取ることができる。

#### 11. CVE-2018-5333

[writeup](https://blog.csdn.net/panhewu9919/article/details/119153052)  

**テストバージョン**: Linux-4.14.13

**保護**: SMEP 有効、SMAP/kaslr 無効。

**脆弱性**: `net/rds/rdma.c` の [`rds_cmsg_atomic()`](https://elixir.bootlin.com/linux/v4.14.13/source/net/rds/rdma.c#L788) 関数で `rm->atomic.op_active` を 0 に設定し忘れるため、[rds_atomic_free_op()](https://elixir.bootlin.com/linux/v4.14.13/source/net/rds/rdma.c#L474) -> [set_page_dirty()](https://elixir.bootlin.com/linux/v4.14.13/source/mm/page-writeback.c#L2559) が `page->page_link` を参照する際に **`null-dereference` 脆弱性**が発生する。0 アドレスに構造体と関数ポインタを偽造して制御フローを乗っ取る。

#### 12. CVE-2019-9213 & CVE-2019-8956

[CVE-2019-9213-writeup](https://blog.csdn.net/panhewu9919/article/details/118557802)    [CVE-2019-8956-writeup](https://blog.csdn.net/panhewu9919/article/details/118557844)    

**テストバージョン**: Linux-4.20.0 32ビット

**保護**: SMEP 有効、SMAP/kaslr 無効。

**脆弱性**: 

- CVE-2019-9213: `mm/mmap.c` の [`expand_downwards()`](https://elixir.bootlin.com/linux/v4.20.7/source/mm/mmap.c#L2413) が mmap 最小アドレスのチェックを誤り、誤ったタスクに対して capability チェックを行ったため、`mmap_min_addr` の制限をバイパスできてしまう**論理脆弱性**。`LD_DEBUG=help /bin/su 1>&%d` コマンドを利用して write 操作を実行すると、本来は exp の cred をチェックすべきところ、誤って write プロセスの cred をチェックし、低アドレスが特権アクセス可能とマークされる。32 ビットシステムでのみ正常に悪用できるが、原因は不明。
- CVE-2019-8956: `net/sctp/socket.c` の [`sctp_sendmsg()`](https://elixir.bootlin.com/linux/v4.20.7/source/net/sctp/socket.c#L2025) 関数が `SCTP_SENDALL` フラグを処理する際に**NULL ポインタ参照**の脆弱性が発生する。CVE-2019-9213 と組み合わせて `mmap_min_addr` の制限をバイパスし、低アドレス 0xd4 に mmap して構造体を偽造し、制御フローを乗っ取る。

#### 13. CVE-2019-15666

[writeup](https://bsauce.github.io/2021/09/14/CVE-2019-15666/)  	  [reference](https://github.com/riskeco/Lucky/blob/master/lucky0_RE.c)

**テストバージョン**: Ubuntu 18.04(4.15.0-20-generic #21)

**保護**: SMEP/SMAP/kaslr 有効。

**脆弱性**: `net/xfrm/xfrm_user.c` の [verify_newpolicy_info()](https://elixir.bootlin.com/linux/v5.0.18/source/net/xfrm/xfrm_user.c#L1379) が `dir` の検証を誤って処理するため、[__xfrm_policy_unlink()](https://elixir.bootlin.com/linux/v5.0.18/source/net/xfrm/xfrm_policy.c#L2202) で**境界外アクセス**が発生する。この脆弱性は本来は 1 減算の境界外アクセスだが、別の経路を利用して UAF を構築でき、**空きブロック上の 8 バイトに NULL を書き込む**ことができる。脆弱性オブジェクト `xfrm_policy` は `kmalloc-1024` に配置され、cred 構造体は `kmalloc-192` に配置される。まず `setxattr+userfaultfd` を利用して `policy0` の周囲に `kmalloc-1024` のヒープブロックをスプレーし、`policy0` を解放した後スプレーブロックも同時に解放して、この slab が解放された後に c子プロセスの cred に再利用されるように仕向ける。そして UAF による空きブロックへの 8 バイト NULL 書き込みを発火させて cred 内の `gid/suid` を書き換え、現在のユーザーを sudoers に追加して権限昇格する。

#### 14. CVE-2020-8835

[writeup](https://www.cnblogs.com/bsauce/p/14123111.html)  	  [reference](https://xz.aliyun.com/t/7690)

**テストバージョン**: Linux-5.5.0

**保護**: SMEP/SMAP/kaslr 有効。

**脆弱性**: `kernel/bpf/verifier.c` が 64 ビット値を 32 ビットへ正しく変換していない(下位 32 ビットを直接取得する)ため、**整数切り詰め**が発生し、BPF コードの検証段階と実際の実行段階が一致しなくなり、境界外読み書きが発生する。

#### 15. CVE-2020-27194

[writeup](https://www.jianshu.com/p/b6f11d8df37a)       [reference](https://github.com/willinin/CVE-2020-27194-exp)

**テストバージョン**: Linux-5.8.14

**保護**: SMEP/SMAP/kaslr 有効。

**脆弱性**: eBPF 検証プログラムで OR 演算を実行する際、`scalar32_min_max_or()` 関数が 64 ビットの値を 32 ビットの変数に代入するため、**整数切り詰め**が発生し、レジスタの範囲を誤って計算する。これにより bpf のチェックをバイパスし、境界外読み書きが発生する。

#### 16. CVE-2021-3156

[writeup](https://www.jianshu.com/p/18f36f1342b3)       [exploit](https://github.com/blasty/CVE-2021-3156)

**テストバージョン**: Ubuntu 19.04、Sudo 1.8.27

**保護**: SMEP/SMAP/kaslr 有効。

**脆弱性**: sudo がコマンドライン引数を処理する際、単一のバックスラッシュで終わるコマンドを処理するときに論理エラーが発生し、**ヒープオーバーフロー**が引き起こされる。

#### 17. CVE-2021-31440

[writeup](https://bsauce.github.io/2021/06/09/CVE-2021-31440/)      [exploit](https://github.com/bsauce/kernel-exploit-factory/tree/main/CVE-2021-31440/exp)

**テストバージョン**: Linux-5.11

**保護**: SMEP/SMAP/kaslr 有効。

**脆弱性**: eBPF モジュール — `kernel/bpf/verifier.c` の [`__reg_combine_64_into_32()`](https://elixir.bootlin.com/linux/v5.11.20/source/kernel/bpf/verifier.c#L1312) 関数でレジスタ計算が誤っている。verifier 段階と実際の実行段階の不整合を利用して境界外読み書きを行う。カーネルベースアドレスを漏洩させ、関数テーブルを偽造し、任意読み書きを実現した後、現在のスレッドの cred を改ざんする。

#### 18. CVE-2021-3490

[writeup](https://bsauce.github.io/2021/08/31/CVE-2021-3490/)      [exploit](https://github.com/chompie1337/Linux_LPE_eBPF_CVE-2021-3490)

**テストバージョン**: Linux-5.11  Linux-5.11.16

**保護**: SMEP/SMAP/kaslr 有効。

**脆弱性**: eBPF モジュール — `kernel/bpf/verifier.c` のビット演算(AND、OR、XOR)における eBPF ALU32 境界追跡が 32 ビット境界を正しく更新しないため、Linux カーネル内で境界外読み書きが発生し、任意コード実行に至る。3 つの脆弱性関数はそれぞれ [scalar32_min_max_and()](https://elixir.bootlin.com/linux/v5.13-rc3/source/kernel/bpf/verifier.c#L7078)、[scalar32_min_max_or()](https://elixir.bootlin.com/linux/v5.13-rc3/source/kernel/bpf/verifier.c#L7149)、[scalar32_min_max_xor()](https://elixir.bootlin.com/linux/v5.13-rc3/source/kernel/bpf/verifier.c#L7219)。verifier 段階と実際の実行段階の不整合を利用して境界外読み書きを行う。カーネルベースアドレスを漏洩させ、関数テーブルを偽造し、任意読み書きを実現した後、現在のスレッドの cred を改ざんする。

#### 19. CVE-2021-22555

[writeup](https://bsauce.github.io/2021/09/23/CVE-2021-22555/)      [exploit](https://github.com/google/security-research/blob/master/pocs/linux/cve-2021-22555/exploit.c)

**テストバージョン**: Linux-5.11.14

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: `net/netfilter/x_tables.c` の `Netfilter` モジュールの `ip_tables` サブモジュールでは、`setsockopt()` とオプション `IPT_SO_SET_REPLACE`(または `IP6T_SO_SET_REPLACE`)を呼び出す際に、カーネル構造体を 32 ビットから 64 ビットへ変換する必要がある。変換サイズを誤って計算するため、[xt_compat_match_from_user()](https://elixir.bootlin.com/linux/v5.11.14/source/net/netfilter/x_tables.c#L731) 関数を呼び出す際に**ヒープオーバーフローで 0 を書き込み、UAF に変換できる**。攻撃者はこれを権限昇格に使用したり、docker や k8s コンテナ([kubernetes](https://zhuanlan.zhihu.com/p/29232090))からの脱出に使用したりできる。`CAP_NET_ADMIN` 権限、または `user+network` 名前空間のサポートが必要。

#### 20. CVE-2021-41073

[writeup](https://bsauce.github.io/2022/07/11/CVE-2021-41073/)      [reference](https://www.graplsecurity.com/post/iou-ring-exploiting-the-linux-kernel)

**テストバージョン**: Linux-5.14.6

**保護**: KASLR/SMEP/SMAP 有効。`CONFIG_SLAB_FREELIST_RANDOM` / `CONFIG_SLAB_FREELIST_HARDENED` / `CONFIG_BPF_JIT_ALWAYS_ON` / `CONFIG_MEMCG ` は無効(デフォルトでは有効)。

**脆弱性**: `fs/io_uring.c` の `loop_rw_iter()` 関数に **`type confusion` 脆弱性**が存在する。`io_kiocb->rw.addr` はカーネルアドレスとユーザーアドレスの両方の役割を担うが、`loop_rw_iter()` 関数内でインクリメントする際に区別されないため、ファイル読み取り時にカーネルアドレスを誤ってインクリメントし、最後に**制御可能なオフセットにある隣接バッファを誤って解放**する(kmalloc-32)。利用条件は非常に厳しく、脆弱性オブジェクトが kmalloc-32 にあるため、freelist 保護機構を無効化している。また、`seq_operations` オブジェクトが `GFP_KERNEL_ACCOUNT` フラグで割り当てられるため、`CONFIG_MEMCG*` 機構も無効化している。この脆弱性は eBPF 内の `sk_filter->prog` ポインタを改ざんし BPF プログラムを偽造する方法で権限昇格を行うため、`CONFIG_BPF_JIT_ALWAYS_ON` 設定も無効化している。

#### 21. CVE-2021-4154

[writeup](https://bsauce.github.io/2022/10/17/CVE-2021-4154/)      [reference](https://github.com/Markakd/DirtyCred)

**テストバージョン**: Linux-5.13.3

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: `kernel/cgroup/cgroup-v1.c` の [cgroup1_parse_param()](https://elixir.bootlin.com/linux/v5.13.3/source/kernel/cgroup/cgroup-v1.c#L905) 関数(`fsconfig` システムコール経由でトリガー)に型混乱が存在し、**UAF 脆弱性**が発生する。syscall `fsconfig` を呼び出して任意の fd を設定でき、最終的にそのファイルを閉じると fd に対応する `file` オブジェクトが解放される。これにより**任意のファイルディスクリプタに対応する `file` 構造体を解放**できる。この記事では 2 つの方法で悪用している。1 つは DirtyCred、もう 1 つは ROP の構築である。2 つの方法を比較すると、DirtyCred の利点はカーネルバージョンを跨いで汎用的で、適合の必要がないこと。欠点は特権ファイルを上書きして権限昇格する必要があるため、docker などのコンテナ内では権限昇格できないこと。ROP の利点はカーネルメモリを任意に読み書きし任意コードを実行できること。欠点は異なるカーネルバージョンへの適合が非常に面倒なこと。

#### 22. CVE-2021-42008

[writeup](https://bsauce.github.io/2021/12/09/CVE-2021-42008/)      [reference](https://syst3mfailure.io/sixpack-slab-out-of-bounds)

**テストバージョン**: Linux-5.13.12

**保護**: KASLR / SMEP / SMAP / PTI 有効。

**脆弱性**: `drivers/net/hamradio/6pack.c` の [decode_data()](https://elixir.bootlin.com/linux/v5.13.12/source/drivers/net/hamradio/6pack.c#L826) 関数に**ヒープオーバーフロー**が存在し、ユーザーは `CAP_NET_ADMIN` 権限を必要とする。[sixpack_decode()](https://elixir.bootlin.com/linux/v5.13.12/source/drivers/net/hamradio/6pack.c#L962) は [decode_data()](https://elixir.bootlin.com/linux/v5.13.12/source/drivers/net/hamradio/6pack.c#L826) を複数回呼び出せ、入力のデコード結果を [sixpack->cooked_buf](https://elixir.bootlin.com/linux/v5.13.12/source/drivers/net/hamradio/6pack.c#L98) に保存する。`sixpack->rx_count_cooked` メンバーは `sixpack->cooked_buf` にアクセスする際のインデックスとして機能し、デコードバイトの書き込み先オフセットを決定する。問題は、`decode_data()` を複数回呼び出すと `rx_count_cooked` が増加し続け、`cooked_buf` の長さ(400 バイト)を超えるまで達し、境界外書き込みが発生することである。[Linuxカーネルでmsg_msg構造体を利用した任意アドレス読み書き](https://www.anquanke.com/post/id/252558) を参照して境界外読み出しと任意アドレス書き込みを構築し、`modprobe_path` を改ざんして権限昇格する。欠点は `userfaultfd` を使用する必要があり、`CAP_NET_ADMIN` の壁を回避できないこと。

#### 23. CVE-2021-43267

[writeup](https://bsauce.github.io/2021/12/06/CVE-2021-43267/)      [reference](https://haxx.in/posts/pwning-tipc/)

**テストバージョン**: Linux-5.14.15

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: 脆弱性は `net/tipc/crypto.c` ファイルに存在し、TIPC(Transparent Inter-Process Communication)クラスタ内通信プロトコルにおいて `MSG_CRYPTO` タイプのメッセージ長の検証が誤っているため、**ヒープオーバーフロー**が発生する。[tipc_crypto_key_rcv()](https://elixir.bootlin.com/linux/v5.14.15/source/net/tipc/crypto.c#L2281) 関数では、TIPC メッセージ([tipc_msg](https://elixir.bootlin.com/linux/v5.14.15/source/net/tipc/msg.h#L148) 構造体)のデータ部分が `MSG_CRYPTO` メッセージ([tipc_aead_key](https://elixir.bootlin.com/linux/v5.14.15/source/include/uapi/linux/tipc.h#L241) 構造体)を指している。`tipc_aead_key` の領域を割り当てて `tipc_aead_key->key` をコピーする際に、`tipc_aead_key->keylen` の有効性を検証していないため、コピーが境界を越える。TIPC メッセージの `header size` と `msg size` のみがチェックされ、`MSG_CRYPTO` メッセージの `tipc_aead_key->keylen` はチェックされない。`elastic object` を利用してカーネルベースアドレスを漏洩させ、`tty_struct->tty_operations.ioctl` を任意書き込み gadget(`mov   QWORD PTR [rdx],rsi`)に書き換え、`modprobe_path` を改ざんして権限昇格する。

#### 24. CVE-2022-0185

[writeup](https://bsauce.github.io/2022/04/08/CVE-2022-0185/)  

**テストバージョン**: Linux-5.11.22

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: Google kctf で権限昇格に成功し、3 万ドルを獲得。カーネルの `File System Context` モジュール(ファイルシステム環境)の `fs/fs_context.c` ファイルに**整数オーバーフロー**が存在し、ヒープオーバーフローが発生する。攻撃者は `CAP_SYS_ADMIN` 権限を持つ必要があるか、名前空間を使用するか、`unshare(CLONE_NEWNS|CLONE_NEWUSER)`(コマンド `$ unshare -Urm` と同等)を使用して `CAP_SYS_ADMIN` 権限を持つ名前空間に入る必要がある。2 つの利用方法がある。1 つは **FUSE**(userfault に相当)を利用して任意アドレス書き込みを構築し `modprobe_path` を変更する方法。もう 1 つは `msg_msg` を利用して任意解放を構築し、ROP を組んで権限昇格する方法。

#### 25. CVE-2022-0847

[writeup](https://bsauce.github.io/2022/04/03/CVE-2022-0847/)      reference-[1](https://blog.csdn.net/Breeze_CAT/article/details/123393188) [2](https://www.anquanke.com/post/id/269886) [3](https://www.freebuf.com/vuls/324700.html)

**テストバージョン**: Linux-5.16.10

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: **DirtyPipe 脆弱性**。`splice` 呼び出しがファイルを含むページキャッシュ(page cache)を pipe のリングバッファ [pipe_buffer](https://elixir.bootlin.com/linux/v5.16.10/source/include/linux/pipe_fs_i.h#L26) にリンクする際、[copy_page_to_iter_pipe()](https://elixir.bootlin.com/linux/v5.16.10/source/lib/iov_iter.c#L384) と [push_pipe()](https://elixir.bootlin.com/linux/v5.16.10/source/lib/iov_iter.c#L547) の両関数が [pipe_buffer](https://elixir.bootlin.com/linux/v5.16.10/source/include/linux/pipe_fs_i.h#L26) -> `flag` メンバーを初期化しない(変数未初期化の脆弱性)。`PIPE_BUF_FLAG_CAN_MERGE` 属性がクリアされないため、後続の `pipe_write()` 時に write 操作がマージ可能だと誤って判断し、不正なデータがファイルのページキャッシュに書き込まれる(再起動で復元可能)。これにより任意ファイルの上書きが可能になる。この脆弱性は任意ファイルの page cache を書き換えられ、権限昇格の方法は `/etc/passwd` の page cache を変更することである。短時間の間、そのファイルにアクセスするすべてのプロセスが改ざんされたファイルキャッシュページにアクセスすることになる。

#### 26. CVE-2022-0995

[writeup](https://bsauce.github.io/2022/04/15/CVE-2022-0995/)     

**テストバージョン**: Linux-5.11.22

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: `watch_queue ` イベント通知サブシステムに**ヒープオーバーフロー**が存在し、脆弱性関数は [watch_queue_set_filter()](https://elixir.bootlin.com/linux/v5.16.14/source/kernel/watch_queue.c#L286) である。カーネルはユーザーから渡された [watch_notification_type_filter](https://elixir.bootlin.com/linux/v5.16.14/source/include/uapi/linux/watch_queue.h#L52) タイプの filter に対して 2 回の有効性チェックを行う。1 回目のチェックは割り当てるメモリサイズを決定するため、2 回目はユーザー filter をそのメモリに格納するためである。しかし、2 回のチェックは一致しないため、割り当て領域が小さすぎて、より多くの filter をオーバーフローして格納できる。2 回目のオーバーフローを利用して、隣接するヒープブロックの特定ビットを 1 に設定できる。以降の利用方法は [CVE-2021-22555](https://bsauce.github.io/2021/09/23/CVE-2021-22555/) と同じである。

#### 27. CVE-2022-1015

[writeup](https://bsauce.github.io/2022/07/16/CVE-2022-1015/)      [reference](https://blog.dbouman.nl/2022/04/02/How-The-Tables-Have-Turned-CVE-2022-1015-1016/)

**テストバージョン**: Linux-5.17

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: nftables モジュールにおいて、[nft_parse_register_load()](https://elixir.bootlin.com/linux/v5.17/source/net/netfilter/nf_tables_api.c#L9325) と [nft_parse_register_store()](https://elixir.bootlin.com/linux/v5.17/source/net/netfilter/nf_tables_api.c#L9377) 関数が渡されるレジスタインデックスの範囲を制限していないため、整数オーバーフロー(範囲チェックを通過できる)が発生し、**スタックオーバーフローによる境界外読み書き**が引き起こされる。悪用時は、割り込みコンテキストからユーザーモードに戻る必要があり、`__do_softirq()` 関数の末尾を利用して syscall のコンテキストへ完全に戻り、その後 `switch_task_namespaces(current, &init_nsproxy)` と `commit_cred(&init_cred)` を呼び出して権限昇格する。

#### 28. CVE-2022-2588

[writeup](https://bsauce.github.io/2022/10/21/CVE-2022-2588/)      [reference](https://github.com/Markakd/CVE-2022-2588)

**テストバージョン**: Linux-5.19.1

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: [CVE-2021-3715](https://access.redhat.com/security/cve/cve-2021-3715)([BlackHat 2021-Europe-Your Trash Kernel Bug, My Precious 0-day](https://zplin.me/talks/BHEU21_trash_kernel_bug.pdf) 16 ページを参照)と類似しており、`route4_filter` オブジェクトをリンクリストから削除する際と解放する際のチェック条件が一致しないため、オブジェクトが解放された後もリンクリストに残り、後で **Double-Free** をトリガーできる。トリガーには `User Namespaces` が必要。**DirtCred** 手法で権限昇格を行う。

#### 29. CVE-2022-2602

[writeup](https://bsauce.github.io/2022/06/08/CVE-2022-2602/)      [reference](https://1day.dev/notes/CVE-2022-2602-DirtyCred-File-Exploitation-applied-on-an-io_uring-UAF/)

**テストバージョン**: Linux-5.18.19

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: io_uring コンポーネントには `IORING_REGISTER_FILES` という機能があり、ファイルを io_uring の `sock->receive_queue` キューに入れることができる。Linux のガベージコレクション機構 GC(io_uring と sock ファイルの飛行カウントのみを処理する)が、io_uring に登録されたファイルをゴミとして解放する可能性がある。io_uring が次回そのファイルを使用する際(writev でファイルに書き込む、`IORING_OP_WRITEV` 機能に対応)**UAF 脆弱性**が発生する。利用方法としては、UNIX_GC のガベージコレクション機構が `io_uring` 内でまだ使用中のファイル構造体(`"/tmp/rwA"` の通常ファイルに悪意のあるデータを書き込んでいる最中)を誤って解放するため、**DirtyCred 手法**を採用できる。大量の `"/etc/passwd"` ファイルを開いて、解放されたばかりの `file` 構造体を上書きすることで、最終的に実際に `"/etc/passwd"` ファイルへ悪意のあるデータが書き込まれる。

#### 30. CVE-2022-2639

[writeup](https://bsauce.github.io/2022/11/24/CVE-2022-2639/)      [reference](https://veritas501.github.io/2022_10_18-CVE-2022-2639%20%20openvswitch%20LPE%20%20%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/)

**テストバージョン**: Linux-5.17.4

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: `openvswitch` カーネルモジュール内の [reserve_sfa_size()](https://elixir.bootlin.com/linux/v5.17.4/source/net/openvswitch/flow_netlink.c#L2439) に整数オーバーフローが存在し、**kmalloc-0x10000 ヒープオーバーフロー書き込み**が発生する。ページスプレーを利用して cross-cache オーバーフローを構築する必要がある。この記事は `pipe-primitive` に基づいて任意ファイルを改ざんするため、KASLR/SMEP/SMAP/KPTI 保護機構をバイパスする必要がなく、バージョンを跨いだ適合なしで悪用を完了できる。**まず pipe を作成し、読み取り専用ファイル `/usr/bin/mount` に splice する。ヒープスプレーで `pipe_buffer->flags = PIPE_BUF_FLAG_CAN_MERGE` を偽造すると、`/usr/bin/mount` ファイルに suid-shell を書き込んでから権限昇格を実行できる**。OOB を 2 回トリガーする。1 回目はオーバーフローで `msg_msg->m_ts` を改ざんし、隣接する `msg_msg->m_list.next` を境界外読み取りして **kmalloc-1024 ヒープアドレスを漏洩**させる。2 回目はオーバーフローで `msg_msg->m_list.next` を漏洩した kmalloc-1024 ヒープアドレスに書き換え、**任意解放を構築**する。

#### 31. CVE-2022-25636

[writeup](https://bsauce.github.io/2022/12/13/CVE-2022-25636/)      [reference](https://github.com/Bonfee/CVE-2022-25636)

**テストバージョン**: Linux-5.13.19

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: `nf_table` モジュールの `net/netfilter/nf_dup_netdev.c` にある [nft_fwd_dup_netdev_offload()](https://elixir.bootlin.com/linux/v5.16.11/source/net/netfilter/nf_dup_netdev.c#L67) 関数は、割り当て空間の計算と実際の初期化時の判定条件が一致しないため、**OOB write** が存在する(システムがパケット処理オフロード(Network Interface Cards (NICs))をサポートしている必要があるが、実際には稀)。**`net_device` オブジェクトのアドレス(kmalloc-4k 内)をオーバーフロー書き込み**し、脆弱性オブジェクトのサイズは可変である(`NFT_OFFLOAD_F_ACTION` フラグを含む rule の数によって決まり、`kmalloc-128` や `kmalloc-192` などに配置される)。`SYS_ADMIN` 権限が必要。利用時は、**`msg_msgseg` を介して `net_device` の kmalloc-4k ヒープポインタを漏洩させ、`msg_msg->security` ポインタを上書きして任意解放を構築し、標準機能の `ioctl(fd, SIOCGIFHWADDR, leak)` で `net_device->dev_addr` を読み取ってカーネルベースアドレスを漏洩させ、`net_device->ethtool_ops->begin` 関数ポインタを偽造して制御フローを乗っ取り権限昇格する**。

#### 32. CVE-2022-27666

[writeup](https://paper.seebug.org/1889/)      [reference](https://etenal.me/archives/1825)

**テストバージョン**: Linux-5.16.14

**保護**: KASLR/SMEP/SMAP 有効。

**脆弱性**: PWN2OWN コンテストで Ubuntu 21.10 の権限昇格を達成。カーネルの esp6 crypto モジュールでは、受信バッファは 8 ページだが、送信者は 8 ページより大きいデータを送信でき、[null_skcipher_crypt()](https://elixir.bootlin.com/linux/v5.16.14/source/crypto/crypto_null.c#L76) 関数によって**ページオーバーフロー**が発生する。全体としてページスプレー技術を採用し、まず `user_key_payload` 弾性オブジェクトを利用して `msg_msg->next` を漏洩させ、次に `msg_msg` を利用して `seq_operations->start` のカーネルアドレスを漏洩させ、最後に `msg_msg` と FUSE ページフォールト処理を利用して任意書き込みを構築し、`modprobe_path` を改ざんして権限昇格する。

#### 33. CVE-2022-32250[writeup](https://bsauce.github.io/2022/11/03/CVE-2022-32250/)      [reference](https://github.com/theori-io/CVE-2022-32250-exploit)

**Test version**: Linux-5.17.12

**Protection**: KASLR/SMEP/SMAP有効。

**Vulnerability**: `nftables` モジュールの `net/netfilter/nf_tables_api.c` が `NFT_MSG_NEWSET` 機能で `nft_set` を追加する際、`lookup` および `dynset` expression を処理するとき、誤った `NFT_EXPR_STATEFUL` チェックにより、`nft_expr` オブジェクトが解放された後も `nft_set->binding` リンクリストに残り、新しい `nft_expr` を追加すると**UAF書き込み**が発生します(脆弱性を発火させるには `CAP_NET_ADMIN` 権限が必要)。UAF書き込みは、`kmalloc-64` のオフセット 0x18 に、別の `kmalloc-64` ヒープチャンクのオフセット 0x18 のアドレス値を書き込みます。利用方法としては、**mqueue の `msg_msg` を使ってカーネルベースアドレスを漏洩させます**。mqueue の `posix_msg_tree_node->msg_list` のオフセットが 0x18(かつ `kmalloc-64` に位置する)であり、UAF書き込みのオフセットと一致するためです。また、**`posix_msg_tree_node->msg_list` は Unlink 利用を構築して `modprobe_path` を改ざんするためにも使用できます**。`user_key_payload` を使ってヒープアドレスを漏洩させる(unlink を構築しやすくする)のは、定番の手法です。なお、ubuntu21.04 以降のバージョンの libmnl または libnftnl を使用する必要があります。

#### 34. CVE-2022-34918

[writeup](https://bsauce.github.io/2022/07/26/CVE-2022-34918/)      [reference](https://www.randorisec.fr/crack-linux-firewall/)

**Test version**: Linux-5.17.15

**Protection**: KASLR/SMEP/SMAP有効。

**Vulnerability**: nftables モジュールの [nft_set_elem_init()](https://elixir.bootlin.com/linux/v5.18.10/source/net/netfilter/nf_tables_api.c#L5459) 関数に**ヒープオーバーフロー**が存在し、オーバーフロー長は最大 `64-16=48` バイトです。脆弱性オブジェクトは `kmalloc-{64,96,128,192}` に配置できます(本稿では kmalloc-64 の脆弱性オブジェクトを選択)。脆弱性の悪用——まずヒープレイアウト `vul_obj -> user_key_payload -> percpu_ref_data` を構築し、オーバーフローで `user_key_payload->datalen` を 0xffff に改ざんして、`percpu_ref_data->release` のカーネルベースアドレスと `percpu_ref_data->ref` の physmap ベースアドレスを漏洩させます。次にヒープレイアウト `vul_obj -> simple_xattr` を構築し、オーバーフローで `simple_xattr->list` リンクリストを改ざんします。この制限付き任意書き込みを使って `modprobe_path` を `/sbin/modprobe` から `/tmp/xxxxprobe` に変更して権限昇格します(xattr をリストから削除するときにこの任意書き込みがトリガーされます)。この任意書き込みの前提条件は physmap アドレスの漏洩が必要であり、`percpu_ref_data` / `shm_file_data` はどちらもカーネルベースアドレスと physmap アドレスの両方を含みます。

#### 35. CVE-2023-2598

[writeup](https://bsauce.github.io/2024/07/30/CVE-2023-2598/)      [reference](https://anatomic.rip/cve-2023-2598/)

**Test version**: Linux-6.3.1

**Protection**: KASLR/SMEP/SMAP有効。

**Vulnerability**: io_uring モジュールの OOB 書き込み脆弱性で、**物理メモリの範囲外読み書き**を引き起こす可能性があります。脆弱性は `io_uring/rsrc.c` の [io_sqe_buffer_register()](https://elixir.bootlin.com/linux/v6.3.1/source/io_uring/rsrc.c#L1230) 関数にあります。登録対象のページが同じコンパウンドページに属するかをチェックする際、コンパウンドページの先頭ページが一致するかだけを確認し、送信されたページが同一ページであるかを確認していません。同じ物理ページを(複数の物理ページからなるコンパウンドページになりすまして)登録し、物理ページに対する任意長の範囲外読み書きを構築できます。   

物理ページの任意長の範囲外読み書きを利用することで、その後の sock オブジェクトを任意に読み書きできます。`sock->sk_data_ready` からカーネルベースアドレスを漏洩させ、`sock.sk_error_queue.next` から sock オブジェクトのヒープアドレスを漏洩させ、`sock.__sk_common.skc_prot->ioctl` 関数ポインタを偽造して [call_usermodehelper_exec()](https://elixir.bootlin.com/linux/v6.3.1/source/kernel/umh.c#L434) 関数を指すことで**制御フローを乗っ取り**ます。さらに `subprocess_info` 構造体も偽造して利用を完了させ、最終的に **`/bin/sh -c /bin/sh &>/dev/ttyS0 </dev/ttyS0` を実行して権限昇格**します。

#### 36. CVE-2024-1086

[writeup](https://bsauce.github.io/2024/05/10/CVE-2024-1086/)      [reference](https://yanglingxi1993.github.io/dirty_pagetable/dirty_pagetable.html)

**Test version**: Linux-6.3.13

**Protection**: KASLR/SMEP/SMAP有効。

**Vulnerability**: netfilter サブシステムの nf_tables コンポーネントに**UAF脆弱性**が存在します。[nft_verdict_init()](https://elixir.bootlin.com/linux/v6.3.13/source/net/netfilter/nf_tables_api.c#L10321) 関数では、非常に大きな verdict 値(悪意のある値 0xffff0000)を設定できます。[nf_hook_slow()](https://elixir.bootlin.com/linux/v6.3.13/source/net/netfilter/core.c#L607) 関数では、`NF_DROP`(0) を処理するとき、先に skb パケットを解放し、[NF_DROP_GETERR()](https://elixir.bootlin.com/linux/v6.3.13/source/include/linux/netfilter.h#L19) を呼び出して戻り値を変更します(verdict 値に応じて `NF_ACCEPT`(正の値 1)に設定)。後続の skb 参照で UAF が発生し、[NF_HOOK()](https://elixir.bootlin.com/linux/v6.3.13/source/include/linux/netfilter.h#L407) が skb を再度解放します。利用方法は、**重複した PMD ページと PTE ページを構築**し、`PMD[0]`/`PMD[1]` が `PTE[0]`/`PTE[1]` を上書きします。PTE ページに対応するユーザー仮想アドレスへの書き込みによって、`PMD[0]` が対応する PTE ページ(エントリは物理アドレスに対応)を偽造し、PMD に対応するユーザー仮想アドレスへの書き込みで**任意物理アドレス書き込み**を実現します。

#### 37. CVE-2025-21702

[writeup](https://bsauce.github.io/2026/01/27/CVE-2025-21702/)      [reference](https://github.com/quanggle97/security-research/tree/master/pocs/linux/kernelctf/CVE-2025-21702_lts_cos)

**Test version**: Linux-6.6.75

**Protection**: KASLR/SMEP/SMAP有効。

**Vulnerability**: `net/sched` モジュールで、qdisc(`sch->limit == 0` に設定した)スケジューラに対して `pfifo_tail_enqueue()` 関数を呼び出すと、その qdisc のキューの長さ qlen が誤って増加します(キューが満杯であるにもかかわらず、packet を先に破棄せずに新しい packet を直接追加する)。一方、親 qdisc(呼び出し元)の長さ qlen は増加しないため、親キューの qlen が子キューの qlen の合計と等しくならず、UAF を構築できます。カーネルベースアドレスの漏洩——赤黒木ノード挿入の原理を使って `user_key_payload->datalen` を改ざんし、範囲外読み取りを構築して、隣接する `xfrm_policy` オブジェクト内の `xfrm_policy_timer` 関数ポインタを漏洩させます。制御フローの乗っ取り——`UAF_hfsc_class->dequeue` 関数ポインタを偽造し、packet のエンキュー後のデキューによって `hfsc_dequeue()` -> `qdisc_dequeue_peeked()` -> `sch->dequeue()` をトリガーして制御フローを乗っ取ります。RDI レジスタは制御可能です。

#### 38. CVE-2026-23271

[writeup](https://bsauce.github.io/2026/05/29/CVE-2026-23271/)      [reference](https://github.com/simond67/security-research/tree/Add-kernelCTF-CVE-2026-23271_lts/pocs/linux/kernelctf/CVE-2026-23271_lts)

**Test version**: Linux-6.12.24

**Protection**: KASLR/SMEP/SMAP有効。

**Vulnerability**: `kernel/events/`(perf サブシステム)に競合状態による UAF 脆弱性が存在します。`__perf_event_overflow()` と `perf_remove_from_context()` の間に競合状態があります。ソフトウェア/tracepoint 駆動の perf イベントでは、overflow 処理はプリエンプションの無効化のみ行います(ハード割り込みは無効化しません)。このコンテキストでは、`perf_event_release_kernel()` → `perf_remove_from_context()` のクリーンアップパスが別の CPU 上で並行して実行され、コールバック関連のイベント状態(例: `event->pending_task`)が overflow パスでまだ使用されている間に解放され、UAF を引き起こします。修正方法は、`__perf_event_overflow()` に適切な同期メカニズムを追加し、overflow パスがコールバック関連フィールドにアクセスしている間、解放パスが並行して進行できないようにすることです。
- 競合(Worker スレッドが tracepoint overflow パスをトリガーし、Closer スレッドが並行して perf_event fd を `close()` する)によって `WARN_ON_ONCE` が発火し、refcount がゼロになった後も `task_work_add` は解放済みイベントの `pending_task` を task_work リストに追加します。
- `/proc/sys/kernel/tainted` をポーリングして TAINT_WARN bit(512) を検出し、競合の成功を確認します。1024 個のスプレースレッドが同期して解放し、イベント A が解放した slab スロットをイベント B で占有します。
- futex_wait がユーザー空間に戻るときに `perf_pending_task` が `put_event(イベント B)` を実行し、イベント B の refcount を誤って 0 まで減らし、**安定したダングリング FD** を形成します。
- ID Oracle でイベント C を順次割り当てて ID の変化を調べ、被害者を正確に特定します。クロスキャッシュ攻撃では、`perf_event_cache` の slab ページを buddy に返却した後、`msg_msgseg` で reclaim します。
ツールをダウンロード