DirtyFrag
0. 취약점 개요
CVE-2026-43500은 Linux 커널의 RxRPC 서브시스템에서 발생하는 로컬 권한 상승(Local Privilege Escalation, LPE) 취약점이다.
이 취약점은 Dirty Flag 계열 취약점으로 분류되며, Linux page cache와 fragment 소유권 처리 과정의 취약점을 이용해 읽기 전용 파일의 page cache를 변조한다.
Dirty Frag 전체 구조
1 2 3 4 5 6 7 8 9 10 11 [User Process] ↓ AF_RXRPC socket ↓ RxRPC receive path ↓ skb fragment ↓ page cache corruption ↓ root shell
1. Linux Page Cache와 Zero-Copy 구조
Page Cache
Linux 커널은 파일을 디스크에서 직접 읽지 않고, 성능 향상을 위해 메모리(RAM)에 캐시하는데 이 캐시를 page cache라고 한다. 대부분의 파일 I/O는 실제 디스크가 아닌 RAM 기반 page cache를 통해 수행된다.
즉, page cache란 파일 내용을 메모리로 캐싱한 것이다.
mmap()과 MAP_SHARED
1
mmap(NULL, 0x1000, PROT_READ, MAP_SHARED, fd, 0);
mmap()은 파일 내용을 현재 프로세스 메모리에 매핑하는 함수이다. 여기서 MAP_SHARED 인자는 프로세스 메모리와 page cache를 공유한다는 의미이다.
즉, MAP_SHARED 옵션을 사용하면 “mmap memory == page cache” 상태가 된다.
Zero-Copy I/O
파일/네트워크 I/O에서는 일반적으로 데이터를 여러 버퍼 간 반복적으로 복사한다. 예를 들어 파일을 네트워크로 전송할 때의 흐름은 아래와 같다.
1
2
3
4
5
6
7
8
9
Disk
↓
Page Cache
↓ (copy)
User Buffer
↓ (copy)
Socket Buffer
↓
NIC
이 과정에서 버퍼는 page cache -> user buffer -> socker buffer 형태로 계속 복사된다. 이러한 반복 복사는 파일의 크기가 커질 경우 CPU 사용량 증가, memory bandwidth 사용 증가, cache pollution 증가를 야기한다.
Linux에서는 이 문제를 방지하기 위해 가능한 한 데이터를 복사하지 않고 같은 memory page를 공유하는 방식인 Zero-Copy I/O 를 사용한다.