
# CVE-2026-31431용 Rust 익스플로잇 AF_ALG splice를 통한 Linux 커널 페이지 캐시 쓰기 프리미티브로, /etc/passwd 패치 또는 셸코드 실행을 통해 루트 권한 상승을 가능하게 합니다.
CVE-2026-31431(Copy Fail)의 Rust 구현 — AF_ALG splice를 통한 Linux 커널 페이지 캐시 쓰기 프리미티브.
Linux 커널의 algif_aead 구현은 권한이 없는 사용자가 splice() 시스템 콜을 통해 읽기 가능한 모든 파일의 페이지 캐시에 임의의 데이터를 쓸 수 있게 합니다. authencesn AEAD 알고리즘은 seqno_lo(사용자 제어 AAD 바이트 4-7)를 오프셋 assoclen + cryptlen의 대상 scatterlist에 기록하며, 이는 splice()를 통해 페이지 캐시 페이지에 연결될 때 임의의 4바이트 쓰기를 초래합니다. 디스크의 콘텐츠는 변경되지 않지만, 이후 모든 읽기 작업은 손상된 페이지 캐시 데이터를 보게 됩니다.
영향을 받는 커널: Linux < 6.12.23, < 6.13.11, < 6.14.2
| 플래그 | 설명 |
|---|---|
--check | 안전한 사전 점검: 확인된 su 대상을 검사하고 종료 |
--escalate | 페이지 캐시의 /etc/passwd를 패치하여 root 비밀번호를 제거한 후 su root 실행 |
--set-password | 먼저 권한 상승 후, stdin에서 새 root 비밀번호를 읽어 chpasswd로 적용 |
--uid | /etc/passwd에서 현재 사용자의 UID를 0으로 변경한 후 su <username> 실행 |
--backup <path> | 덮어쓰기 전에 su 바이너리 백업 |
--exec <path> | 덮어쓰기 후 root로 특정 명령 실행 |
1. --uid — 페이지 캐시 쓰기를 통해 /etc/passwd의 현재 사용자 UID 필드를 0000으로 변경합니다. 패치 후, 자신의 비밀번호로 su <username>을 실행하면 root 셸이 열립니다. 이 도구는 인증 후 셸 시작 전에 페이지 캐시를 비우려 시도하므로, SSH가 계정을 계속 UID 0으로 인식할 가능성을 줄입니다. root 비밀번호 수정이 필요 없습니다. 4자리 UID(1000-9999) 모두에서 작동합니다.
2. --escalate — 페이지 캐시 쓰기를 통해 /etc/passwd의 root 줄을 패치합니다: root:x:0:0:root:... → root::0:0:root :.... 줄 길이를 동일하게 유지하기 위해 주석 필드에 공백이 채워집니다. 패치 후, su root는 비밀번호 없이 작동합니다.
3. --set-password — 먼저 권한을 상승시키고(root 비밀번호 제거), 그 다음 stdin에서 새 비밀번호를 읽어 chpasswd로 적용합니다.
4. 기본 모드(플래그 없음) — su 바이너리의 페이지 캐시를 아키텍처별 셸코드 페이로드(x86_64, x86, aarch64)로 덮어쓴 후 su를 실행하여 root 셸을 획득합니다.
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
페이지 캐시 수정은 휘발성입니다 — 캐시를 비우면 원래 디스크 콘텐츠가 복원됩니다:
echo 3 > /proc/sys/vm/drop_caches
이 프로젝트는 공인된 보안 테스트 및 교육 목적으로만 제공됩니다.
| OS | 커널 | 결과 |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate 통과, --set-password 통과, --uid 통과 |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate 통과, --uid 통과 |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, 커널 패치됨 |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid 통과 |
| Alpine Linux edge | 6.19.12 | 익스플로잇 실행됨, 페이지 캐시 쓰기가 커널 수정으로 차단됨 |