
Linux 시스템에서 CVE-2026-31431(Copy Fail)을 탐지하고 완화합니다.
Linux 호스트가 CVE-2026-31431("Copy Fail")에 노출되어 있는지 익스플로잇을 실행하지 않고 확인하는 제로 의존성 Python CLI입니다. 영향을 받는 구성 요소가 커널 모듈로 로드 가능한 경우 보수적인 임시 완화 조치를 적용할 수도 있습니다. Debian/Ubuntu, RHEL/Rocky/AlmaLinux, Fedora, SUSE를 지원합니다.
pip install copyfail-guard
copyfail-guard
CVE-2026-31431은 algif_aead(AF_ALG AEAD 소켓) 커널 인터페이스의 논리 버그로,
권한이 없는 로컬 사용자가 읽기 가능한 모든 파일의 페이지 캐시에 통제된 4바이트 쓰기를 수행하여
루트 권한 상승으로 이어질 수 있습니다.
CVSS 7.8, 커널 4.14부터 존재하며, 2026년 4월부터 안정 릴리스에서 패치되었습니다.
공개 익스플로잇이 존재하며 이 취약점은 CISA KEV에 등재되어 있습니다.
일부 취약점 점검은 "익스플로잇을 실행해서 작동하는지 확인"하는 방식입니다. 프로덕션 호스트에서 그렇게 하는 것은 좋은 방법이 아닙니다. copyfail-guard는 비익스플로잇 방식을 사용합니다. 버그를 트리거하거나, setuid 바이너리를 수정하거나, 익스플로잇 가능성을 증명하려고 시도하지 않습니다. 대신 호스트 상태(커널 버전, 모듈 로드 상태, modprobe 구성)를 검사하여 머신이 노출된 것으로 보이는지 보고합니다.
| 하위 명령 | 동작 |
|---|---|
detect | 다섯 가지 신호(커널 버전, /proc/modules, modules.builtin, modules.dep, modprobe 구성)를 결합하여 여섯 가지 판정 중 하나로 보고 |
fix | install algif_aead /bin/false modprobe 규칙을 원자적으로 작성하고 algif_aead 언로드를 시도 |
reset | fix가 설치한 modprobe 규칙을 제거(패치된 커널로 업그레이드한 후 실행) |
fix는 의도적으로 최소한의 기능만 수행합니다 — 패키지 관리자를 호출하지 않습니다.
영구적인 해결은 배포판의 일반적인 업데이트 메커니즘을 통해 커널을 업그레이드해야 합니다.
pip install copyfail-guard
또는 설치 없이 체크아웃에서 직접 실행:
PYTHONPATH=src python3 -m copyfail_guard detect
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — VULNERABLE
Distribution: Ubuntu 24.04.1 LTS (debian family)
Kernel: 6.8.0-50-generic (branch 6.12, fixed at 6.12.85)
Module: algif_aead — loaded as .ko
Mitigation: none
Recommended actions:
1. Apply mitigation now:
sudo copyfail-guard fix
2. Update the kernel for a permanent fix:
Update the kernel on this system to 6.12.85 or later (whatever your
distribution ships once it has integrated the CVE-2026-31431 fix), then reboot.
적용 전에 항상 --dry-run으로 미리 확인하세요:
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Pre-flight checks (Linux, host, root)
[skip] Would write modprobe blacklist [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Would attempt to unload algif_aead (not currently loaded) [algif_aead]
[skip] Would append audit record [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Pre-flight checks (Linux, host, root)
[ ok ] Wrote modprobe blacklist [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] Unloaded algif_aead [algif_aead]
[ ok ] Appended audit record [/var/log/copyfail-guard.log]
Next step for a permanent fix:
Update the kernel to a CVE-2026-31431-patched version using your
distribution's normal update mechanism, then reboot.
모듈이 현재 사용 중이면 언로드 단계가 실패할 수 있습니다. 이 경우에도 영구적인 modprobe 규칙은 성공적으로 설치될 수 있으며, copyfail-guard는 모듈이 제거된 것처럼 가장하지 않고 언로드 실패를 경고 스타일의 동작 레코드로 보고합니다.
--json은 jq, Ansible 또는 SOAR 파이프라인에 적합한 구조화된 문서를 stdout에 출력합니다:
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
| 코드 | 의미 |
|---|---|
0 | 안전 — 판정이 patched, mitigated, 또는 not_applicable; 또는 영구 수정 단계가 성공 |
1 | 취약 — 판정이 vulnerable 또는 unmitigable_builtin |
2 | 오류 — 상태를 확인할 수 없거나, 사전 조건이 거부되었거나, 영구 수정 단계가 실패 |
| 판정 | 설명 |
|---|---|
patched | 실행 중인 커널이 수정 버전 이상 |
mitigated | 커널은 취약하지만 algif_aead가 modprobe 구성에 의해 차단됨 |
not_applicable | 커널은 취약하지만 algif_aead가 이 시스템에 존재하지 않음 |
vulnerable | 커널이 취약하고, 모듈을 로드할 수 있으며, 완화 조치가 없음 |
unmitigable_builtin | algif_aead가 커널 이미지에 컴파일되어 있음 — modprobe 완화가 효과 없음; 커널 업그레이드 필요 |
unknown | 커널 버전을 구문 분석할 수 없거나 평가 범위를 벗어남 |
패치된 커널로 업그레이드한 후 reset 하위 명령을 사용하여 fix가 설치한
modprobe 규칙을 제거하세요:
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Would remove /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] Removed /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
Reboot to allow algif_aead to load again if needed.
reset은 멱등적입니다 — 파일이 이미 없으면 "할 일 없음" 메시지와 함께 0으로 종료합니다. 그런 다음 재부팅하세요.
컨테이너. fix는 컨테이너 내부에서 실행을 거부합니다. /proc/modules는 호스트 커널을 반영하지만
컨테이너에는 모듈을 로드하거나 언로드할 권한이 없기 때문입니다. copyfail-guard를 호스트에서 직접 실행하세요.
내장 algif_aead. 일부 커널은 algif_aead를 이미지에 직접 컴파일합니다
(CONFIG_CRYPTO_USER_API_AEAD=y). 이 구성에서는 modprobe 완화가 효과가 없습니다;
유일한 해결책은 커널 업그레이드입니다. 이 경우 detect는 unmitigable_builtin을 보고합니다.
fix를 실행하면 modprobe 규칙이 여전히 설치되지만(공존하는 로드 가능한 복사본의 로드를 방지)
내장 인스턴스는 영향을 받지 않습니다 — 커널 업그레이드와 재부팅만이 유일한 실제 해결책입니다.
blacklist vs install … /bin/false. 두 지시문 모두 일반적인 자동 로드를 차단하지만,
install algif_aead /bin/false가 더 강력합니다. 일반적인 명시적 modprobe algif_aead 호출도 차단하기 때문입니다.
충분한 권한이 있는 관리자는 여전히 저수준 모듈 로드 도구나 특수 modprobe 플래그를 사용하여
modprobe 정책을 우회할 수 있습니다. copyfail-guard는 항상 더 강력한 형태를 설치합니다.
시스템에 이미 일반 blacklist 지시문이 있는 경우 도구는 mitigated를 보고하지만 업그레이드를 권장하는 메모를 출력합니다.
SELinux/AppArmor. RHEL에서 /etc/modprobe.d/에 대한 쓰기는 일반적으로 상위 디렉터리에서
system_u:object_r:modules_conf_t:s0를 상속하므로, copyfail-guard가 작성하는 파일에 대해
수동 재라벨링이 일반적으로 필요하지 않습니다.
initramfs. algif_aead는 주요 배포판의 부팅 이미지에 일반적으로 포함되지 않으므로,
copyfail-guard는 modprobe 규칙 설치 후 update-initramfs -u 또는 dracut -f를 실행하지 않습니다.
배포판이나 로컬 빌드에 algif_aead가 initramfs에 포함된 경우, 배포판의 커널/모듈 지침을 따르세요.
Apache 2.0 — LICENSE 참조.