
CVE-2026-46331 및 CVE-2026-43503
Linux 커널 로컬 권한 상승 익스플로잇 3종. Dirty COW 및 Dirty Pipe와 동일한 버그 클래스. 몇 초 만에 루트 셸. 모든 주요 배포판이 영향받음.
세 익스플로잇 모두 커널의 페이지 캐시 — 프로세스가 실제로 읽고 실행하는 파일의 메모리 내 복사본 — 를 손상시킵니다. 디스크의 파일은 절대 건드리지 않습니다. 파일 무결성 도구는 아무것도 감지하지 못합니다. execve("/usr/bin/su")가 캐시에서 로드 → 셸코드 실행 → root.
| 익스플로잇 | CVE | 메커니즘 | 루트까지 걸리는 시간 | 라인 수 |
|---|---|---|---|---|
| Dirty Pedit | CVE-2026-46331 | TC pedit COW 갭 (u32 랩어라운드) | < 1초 | 275 |
| skb_shift | CVE-2026-43503 | TCP SACK frag 전송 플래그 손실 | ~10초 | 500 |
| GRO Flag Loss | CVE-2026-43503 | GRO 병합 시 frag 전송 플래그 손실 | ~10초 | 550 |
세 가지 모두: 비특권 → root. 특별한 권한 없음. 사용자 네임스페이스만 있으면 됨.
이 저장소의 모든 익스플로잇은 동일한 패턴을 따릅니다:
1. Get page-cache pages into a kernel buffer (splice)
2. Bypass the copy-on-write defense
3. Write in-place → read-only file corrupted in memory
차이점은 방어가 어떻게 우회되는지, 그리고 무엇이 쓰기를 수행하는지입니다:
2016 Dirty COW COW race via mmap + fork
2022 Dirty Pipe Stale PIPE_BUF_FLAG_CAN_MERGE in splice
2026 Copy Fail AF_ALG in-place AEAD on page-cache scatterlist
2026 Dirty Frag ESP skip_cow on splice'd frags (missing flag)
2026 Fragnesia skb_try_coalesce drops SHARED_FRAG flag
2026 Dirty Pedit ← TC pedit COW gap, no crypto needed
2026 skb_shift ← TCP SACK drops SHARED_FRAG, ESP writes
2026 GRO Flag Loss ← GRO merge drops SHARED_FRAG, ESP writes
기본 구성입니다. 취약해지기 위해 하드닝이 필요하지 않습니다. Linux를 실행 중이라면 영향을 받았습니다.
skb_shift와 GRO는 동일한 익스플로잇 기법을 사용합니다: SKBFL_SHARED_FRAG 플래그를 잃게 만든 다음, 미리 계산된 IV 조회 테이블을 사용해 ESP 암호화가 페이지 캐시 페이지에 한 번에 1바이트씩 XOR 연산을 수행하게 합니다.
Dirty Pedit은 완전히 다른 방식입니다:
skb_store_bits를 통해 지정한 바이트를 정확히 기록합니다.skb_ensure_writable을 무력화합니다.# Build all three
cd dirty_pedit && gcc -static -O2 -o exploit exploit.c && cd ..
cd skb_shift && gcc -static -O2 -o exploit exploit.c && cd ..
cd gro && gcc -static -O2 -o exploit exploit.c && cd ..
각 익스플로잇은 단일 자체 포함 C 파일입니다. libc 외에는 의존성이 없습니다.
# Any of the three (as unprivileged user):
./exploit
# → root shell
요구 사항: 영향받는 버전 범위의 Linux 커널 + CONFIG_USER_NS=y (모든 주요 배포판의 기본값).
[*] Dirty Pedit — Local Privilege Escalation
[*] uid=1000 pid=42
[*] Victim line at offset 186: nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
[*] Injecting user 'a' (uid=0, no password) over victim line...
[+] User 'a' injected with uid=0!
[+] Running: su a
# id
uid=0(root) gid=0(root) groups=0(root)
[*] uid=1000 euid=1000
[*] IV table pre-computed (256 entries)
[*] Writing 192 bytes to /usr/bin/su...
[120] 0x00→0x48 ... OK
[121] 0x00→0x31 ... OK
[*] Write complete: 192/192
[!] /usr/bin/su page cache overwritten!
# whoami
root
모든 취약점은 Linux 커널 보안 팀과 네트워킹 유지보수자에게 책임 있게 공개되었습니다. 패치는 업스트림에 병합되었고 안정 트리에 백포트되었습니다.
899ee91156e548f6a5356a33이 익스플로잇은 패치가 적용 가능해진 이후 교육 및 방어 목적으로 공개되었습니다. 페이지 캐시 손상은 메모리 전용입니다 — 재부팅하거나 echo 1 > /proc/sys/vm/drop_caches를 실행하면 원래 파일이 복원됩니다.
Rajat Gupta — Qualcomm 오펜시브 시큐리티
MIT
| 익스플로잇 | 우회된 방어 | 쓰기 수행자 |
|---|
| Dirty Pedit | skb_ensure_writable (u32 랩어라운드 → 부분 COW) | skb_store_bits (직접 4바이트 쓰기) |
| skb_shift | SKBFL_SHARED_FRAG 플래그가 TCP SACK 중 손실됨 | ESP AES-GCM 복호화 (패킷당 1바이트) |
| GRO Flag Loss | SKBFL_SHARED_FRAG 플래그가 GRO 병합 중 손실됨 | ESP AES-GCM 복호화 (패킷당 1바이트) |
| 익스플로잇 | 도입 | 수정됨 | 영향받는 배포판 |
|---|
| Dirty Pedit | v5.18 (2022년 5월) | v7.1-rc7 | Ubuntu, RHEL, Debian, Fedora, SUSE |
| skb_shift | v3.9 (2013) | v7.1-rc5 | 13년간 모든 배포판 |
| GRO Flag Loss | v3.9 (2013) | v7.1-rc5 | 13년간 모든 배포판 |
| 속성 | Dirty Pedit | skb_shift | GRO |
|---|
| 권한 | 없음 (userns) | 없음 (userns) | 없음 (userns) |
| 파일 접근 | O_RDONLY | O_RDONLY | O_RDONLY |
| 암호화 필요 | 아니요 | 예 (AES-GCM) | 예 (AES-GCM) |
| 쓰기 제어 | 패킷당 4바이트 | 패킷당 1바이트 | 패킷당 1바이트 |
| 신뢰성 | 결정적 | 결정적 | 확률적 (재시도) |
| K8s 컨테이너 탈출 | 아니요 (veth 불필요) | 아니요 | 예 (veth+GRO 기본) |
| 공격 표면 | geneve + TC | loopback + espintcp | veth + ESP-in-UDP |