
CVE-2026-31431 (Copy Fail) 신규 익스플로잇: 페이지 캐시를 통한 실시간 코드 변조. MAP_PRIVATE 페이지 공유를 통해 libc exit() 코드를 덮어씀 — 실행 중인 모든 프로세스에 영향.
Linux 커널의 페이지 캐시를 통해 실행 중인 프로세스의 실행 코드를 손상시켜 루트 권한 상승을 달성하는 CVE-2026-31431("Copy Fail")에 대한 새로운 공격 기법입니다.
이 CVE에 대해 공개된 모든 익스플로잇은 데이터 파일을 손상시킵니다 — /etc/passwd를 수정하여 root의 UID를 변경하거나, 디스크의 setuid 바이너리를 패치합니다. 이 익스플로잇은 근본적으로 다른 접근 방식을 사용합니다: 커널의 페이지 캐시 메커니즘을 통해 메모리 내 라이브 실행 코드를 손상시킵니다.
| 공개된 익스플로잇 | 이 익스플로잇 | |
|---|---|---|
| 대상 | 데이터 파일 (/etc/passwd, /usr/bin/su) | 실행 코드 (libc .text 섹션) |
| 메커니즘 | 프로그램이 파싱하는 파일 콘텐츠 | CPU가 직접 실행하는 코드 페이지 |
| 범위 | 단일 파일 | libc를 매핑하는 모든 프로세스 |
| 디스크 변경 | 있음 (파일 콘텐츠 수정) | 없음 (메모리 내 페이지 캐시만) |
| 탐지 | 파일 무결성 모니터링 | 파일시스템 검사에 보이지 않음 |
Linux가 MAP_PRIVATE로 공유 라이브러리를 매핑할 때, 파일 페이지를 즉시 복사하지 않습니다. 대신 프로세스의 페이지 테이블 엔트리가 페이지 캐시 물리 페이지를 직접 가리킵니다. 복사는 쓰기 시에만 발생합니다(COW, copy-on-write). 코드 페이지(.text)의 경우 프로세스가 절대 쓰지 않으므로 페이지 캐시와 영구적으로 공유됩니다.
Process A (bash) Process B (su) Page Cache (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit(): │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(clean page) (clean page) └──────────┘
↑
Copy Fail writes here!
CVE-2026-31431은 읽기 가능한 모든 파일의 페이지 캐시에 통제된 4바이트 쓰기를 제공합니다. libc의 코드 페이지를 손상시켜 모든 프로세스가 실행하는 명령어를 수정합니다.
on_exit() 함수 위치에 4바이트씩 10회 쓰기exit() 패치 — 셸코드로 점프하도록 4바이트 1회 쓰기exit()를 호출하는 모든 프로그램(사실상 모든 프로그램)이 셸코드를 실행셸코드는 setuid(0) → setgid(0) → execve("/bin/sh")를 수행하여 루트 셸을 제공합니다.
crypto/algif_aead.c의 논리 오류 — 2017년 in-place 최적화(72548b093ee3)로 인해 splice()가 페이지 캐시 페이지를 AEAD 복호화에 공급할 수 있습니다. authencesn 알고리즘의 ESN 재배열이 4개의 스크래치 바이트를 소스 scatterlist에 다시 쓰면서 splice된 파일의 페이지 캐시를 손상시킵니다.# 컴파일
gcc -o exploit exploit.c
# 권한 없는 사용자로 실행
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# 트리거 — 아무 프로그램이나 실행 (exit() 호출)
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — 셸코드 주입이 포함된 전체 익스플로잇copyfail_test.c — 프리미티브 검증 (4바이트 쓰기 테스트)72548b093ee3)이 도구는 승인된 보안 연구 및 교육 목적으로만 제공됩니다. 소유하지 않았거나 명시적 테스트 권한이 없는 시스템에 사용하지 마십시오.
Dirty Frag는 동일한 버그 클래스에서 두 가지 추가 페이지 캐시 쓰기 변형을 공개했습니다:
esp4/esp6): Copy Fail과 동일한 authencesn 싱크, IPsec ESP-in-UDP를 통해 도달. 사용자 네임스페이스 필요. 4바이트 쓰기.rxrpc/rxkad): splice 고정 페이지에 대한 pcbc(fcrypt) in-place 복호화. 네임스페이스 불필요. 8바이트 쓰기.이 저장소의 라이브 코드 손상 기법은 이러한 모든 페이지 캐시 쓰기 프리미티브와 함께 작동합니다 — write4() 함수를 ESP 또는 RxRPC 트리거로 교체하기만 하면 됩니다. 이 기법은 프리미티브에 독립적입니다.