
更新し続けています......
LinuxカーネルCVEエクスプロイト解析レポートと関連デバッグ環境。もうLinuxカーネルをコンパイルしたり、環境を設定したりする必要はありません。
このリポジトリは、すべてのLinuxカーネルエクスプロイトと関連デバッグ環境をまとめたものです。Qemuを使用してカーネルを起動し、エクスプロイトをテストできます。
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 #
---
## カタログ
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 有効。