
Python으로 구현된 copyfail (CVE-2026-31431)
badsectorlabs/copyfail-go의 Python 포트 (CVE-2026-31431). Linux 전용이며 Python 3.10+ (os.splice)이 필요합니다.
이 도구는 /etc/passwd 페이지 캐시 트릭을 사용하지 않습니다.
su 바이너리의 페이지 캐시를 내장된 셸코드(Go main.go와 동일한 페이로드)로 덮어쓴 다음, su를 실행합니다./etc/passwd를 통해 getpwnam()이 UID를 0으로 인식하게 만드는 것이 아니라, 손상된 su의 캐시 이미지를 setuid 루트 프로그램으로 실행함으로써 이루어집니다.동일한 CVE에 대한 다른 공개 Python PoC는 페이지 캐시의 **/etc/passwd**를 패치한 후 su <user>를 실행하라고 안내할 수 있습니다. 이는 이 스크립트와 다른 대상 파일 및 다른 후속 조치입니다.
승인된 테스트 전용 — 소유한 호스트 또는 명시적으로 평가가 허용된 호스트에서만 사용하세요.
chmod +x copyfail_su.py
# 대화형 방식 흐름 (--exec 없이 copyfail-go와 동일한 방식)
./copyfail_su.py --backup /tmp/su.bak
# 다른 프로그램을 권한 상승하여 실행 (경로를 argv로 su에 전달; exec-argv1 페이로드 사용)
./copyfail_su.py --backup /tmp/su.bak --exec /full/path/to/binary
성공적으로 실행한 후에는 실제 su를 복원하세요.
--backup 없이 복구하기이 PoC는 /usr/bin/su의 페이지 캐시를 손상시킵니다. 확인하거나 재설치할 때까지 디스크의 파일이 여전히 신뢰할 수 있다고 가정하지 마세요.
/usr/bin/su를 소유한 패키지 재설치 (먼저 찾은 후 재설치):
rpm -qf /usr/bin/su 실행 후 sudo dnf reinstall shadow-utils 실행 (보고된 패키지 이름 사용).dpkg -S /usr/bin/su 실행 후 sudo apt install --reinstall <package> 실행.검증: /usr/bin/su의 예상치 못한 변경 사항을 확인하려면 sudo rpm -V <package> 실행, 또는 Debian 계열 시스템에서는 debsums 실행.
선택 사항: 재설치 후 오래된 캐시 가정을 피하기 위해 재부팅.
루트로 재설치할 수 없는 경우: 복구 부팅, Live USB 사용, 또는 동일한 배포판/버전/아키텍처의 알려진 정상 이미지에서 /usr/bin/su 교체; 소유권 root:root 및 모드 4755 (-rwsr-xr-x) 확인.