Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
kernel-exploit-factory — Linux 커널 CVE 익스플로잇 분석 보고서 및 관련 디버그 환경. 더 이상 Linux 커널을 컴파일하고 환경을 구성할 필요가 없습니다. | Kitploit
도구/GitHubGitHub/bsauce/kernel-exploit-factory
Privilege EscalationVulnerability AnalysisExploitationLearning & EducationCurated ResourcesBinary ExploitationLabs & Practice
GitHubbsauce/kernel-exploit-factory

kernel-exploit-factory

Linux 커널 CVE 익스플로잇 분석 보고서 및 관련 디버그 환경. 더 이상 Linux 커널을 컴파일하고 환경을 구성할 필요가 없습니다.

저장소 보기
1.3k1962개월 전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주소 셸코드를 실행하거나 추측 가능한 범위의 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와 유사하다. 첫 번째로 취약점을 트리거하여 힙 스프레이로 `po->rx_ring->prb_bdqc->retire_blk_timer` 구조를 위조하고, `native_write_cr4(0x406e0)`를 실행하여 SMEP/SMAP를 비활성화한다. 두 번째로 취약점을 트리거하여 힙 스프레이로 `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) 함수가 블록 size를 올바르게 검사하지 않고, 길이 판단 조건이 잘못되어 **힙 오버플로**가 발생한다. `CAP_NET_RAW ` 권한이 필요하다. 함수 포인터를 두 번 탈취하여 먼저 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 모듈의 **정수 확장** 문제. 핵심 문제는 두 레지스터 값의 타입이 달라 check 함수와 실제 함수의 실행 방식이 일치하지 않는다는 점이다. 이 취약점은 스택 공격이나 제어 흐름 탈취를 포함하지 않으며, 오직 시스템 호출 데이터만으로 권한을 상승시킨다. 데이터 지향 공격(Data-Oriented Attacks)이 Linux 커널에 적용된 대표적인 사례다.

#### 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 패킷 처리의 일관성을 보장하지 않아, 두 번의 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 최소 주소 검사를 잘못하여, 잘못된 task에 대해 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` flag를 처리할 때 **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을 빼는 경계를 벗어난 연산(out-of-bounds -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비트를 그대로 취함), **정수 절단(integer truncation)**이 발생한다. 이로 인해 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 커널에서 경계를 벗어난 읽기/쓰기가 발생하고 이로 인해 임의 코드 실행이 가능해진다. 세 개의 취약 함수는 각각 [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()` 함수에서 증가시킬 때 구분하지 않아 파일을 읽을 때 커널 주소를 잘못 증가시키고, 결국 **제어 가능한 오프셋에 있는 인접 buffer를 잘못 해제**한다(kmalloc-32). 이용 조건이 매우 까다롭다. 취약 객체가 kmalloc-32에 있으므로 freelist 보호 메커니즘을 비활성화해야 한다. `seq_operations` 객체가 `GFP_KERNEL_ACCOUNT` flag로 할당되므로 `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` 시스템 콜로 트리거)에 타입 혼동(type confusion)이 존재하여 **UAF 취약점**이 발생한다. syscall `fsconfig`를 호출해 임의의 fd를 설정하면, 결국 해당 파일을 닫은 후 fd에 대응하는 `file` 객체가 해제된다. 이를 통해 **임의의 파일 디스크립터에 대응하는 `file` 구조체를 해제**할 수 있다. 이 글에서는 두 가지 방법으로 이용을 구현한다. 하나는 DirtyCred이고, 다른 하나는 ROP 구성이다. 두 방법을 비교하면, 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` 권한이 있는 네임스페이스에 진입해야 한다. 두 가지 방법으로 이용할 수 있다. 첫째는 **FUSE**(userfault와 유사)를 이용해 임의 주소 쓰기를 구성하여 `modprobe_path`를 수정하는 것이고, 둘째는 `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에 대해 두 번 유효성 검사를 수행한다. 첫 번째 검사는 할당할 메모리 크기를 결정하기 위한 것이고, 두 번째는 사용자 filter를 해당 메모리에 저장하기 위한 것이다. 그러나 두 검사가 일치하지 않아 할당 공간이 너무 작아 더 많은 filter를 저장할 때 오버플로가 발생할 수 있다. 두 번째 오버플로를 이용해 인접한 힙 블록의 특정 비트를 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를 두 번 트리거한다. 첫 번째는 오버플로로 `msg_msg->m_ts`를 변조하여 인접한 `msg_msg->m_list.next`를 경계를 벗어나 읽어 **kmalloc-1024 힙 주소를 유출**한다. 두 번째는 오버플로로 `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**가 존재한다(시스템이 패킷 처리 오프로드 - 네트워크 인터페이스 카드(NIC)를 지원해야 하지만, 실제로는 드물다). **`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-page이지만, 송신자는 8-page보다 큰 데이터를 보낼 수 있다. [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)

**테스트 버전**: Linux-5.17.12

**보호**: KASLR/SMEP/SMAP 활성화.

**취약점**: `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`로 힙 주소를 누출하는 것은 이미 잘 알려진 방법이다. 참고로, 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/)

**테스트 버전**: Linux-5.17.15

**보호**: KASLR/SMEP/SMAP 활성화.

**취약점**: 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/)

**테스트 버전**: Linux-6.3.1

**보호**: KASLR/SMEP/SMAP 활성화.

**취약점**: 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) 함수에 있다. 제출된 등록 대상 page가 동일한 복합 페이지(compound page)에 속하는지 검사할 때, 해당 복합 페이지의 첫 번째 page가 일치하는지만 확인했을 뿐 제출된 page들이 동일한 page인지는 확인하지 않는다. 따라서 동일한 물리 페이지를 (여러 물리 페이지로 구성된 복합 페이지로 위장해) 등록해 물리 페이지에 대한 임의 길이 OOB 읽기/쓰기를 구성할 수 있다.

물리 페이지에 대한 임의 길이 OOB 읽기/쓰기를 이용하면 그 뒤에 있는 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)

**테스트 버전**: Linux-6.3.13

**보호**: KASLR/SMEP/SMAP 활성화.

**취약점**: 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)

**테스트 버전**: Linux-6.6.75

**보호**: KASLR/SMEP/SMAP 활성화.

**취약점**: `net/sched` 모듈에서, 어떤 qdisc 스케줄러(`sch->limit == 0`으로 설정)에 `pfifo_tail_enqueue()` 함수를 호출하면 해당 qdisc의 큐 길이 qlen이 잘못 증가한다 (큐가 가득 찼는데도 패킷을 먼저 버리지 않고 새 패킷을 바로 추가). 반면 부모 qdisc(호출자)의 길이 qlen은 증가하지 않아, 부모 큐의 qlen이 자식 큐들의 qlen 합과 같지 않게 되며 UAF를 구성할 수 있다. 커널 베이스 주소 누출 — 레드-블랙 트리 노드 삽입 원리를 이용해 `user_key_payload->datalen`을 변조해 OOB 읽기를 구성하고, 인접한 `xfrm_policy` 객체의 `xfrm_policy_timer` 함수 포인터를 누출한다. 제어 흐름 탈취 — `UAF_hfsc_class->dequeue` 함수 포인터를 위조하고, packet이 enqueue된 후 dequeue될 때 `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)

**테스트 버전**: Linux-6.12.24

**보호**: KASLR/SMEP/SMAP 활성화.

**취약점**: `kernel/events/` (perf 서브시스템)에 경쟁 조건 UAF 취약점이 있다. `__perf_event_overflow()`와 `perf_remove_from_context()` 사이에 경쟁 조건이 존재한다. 소프트웨어/tracepoint 기반 perf 이벤트의 경우 overflow 처리는 선점(preemption)만 비활성화한다 (하드 인터럽트는 끄지 않음). 이 컨텍스트에서 `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가 0이 된 후에도 `task_work_add`가 해제된 이벤트의 `pending_task`를 task_work 목록에 추가한다.
- `/proc/sys/kernel/tainted`를 폴링해 TAINT_WARN bit(512)로 경쟁 성공을 감지하고, 1024개의 spray 스레드가 동기화되어 해제를 수행하며, 이벤트 B로 이벤트 A가 해제된 slab 슬롯을 차지한다.
- futex_wait가 사용자 모드로 복귀할 때 `perf_pending_task`가 `put_event(이벤트 B)`를 실행해 이벤트 B의 refcount를 잘못 0으로 감소시키며, **안정적인 매달린 FD(dangling FD)**를 형성한다.
- ID Oracle이 이벤트 C를 순차적으로 할당하며 ID 변화를 탐지해 피해자를 정확히 찾아낸다. 크로스 캐시(cross-cache) 공격으로 `perf_event_cache` slab 페이지를 buddy 시스템에 반환한 후 `msg_msgseg`로 reclaim한다.
도구 다운로드