
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 구성)를 검사하여 머신이 노출된 것으로 보이는지 보고합니다.
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"
}
패치된 커널로 업그레이드한 후 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 참조.
| 하위 명령 | 동작 |
|---|
detect | 다섯 가지 신호(커널 버전, /proc/modules, modules.builtin, modules.dep, modprobe 구성)를 결합하여 여섯 가지 판정 중 하나로 보고 |
fix | install algif_aead /bin/false modprobe 규칙을 원자적으로 작성하고 algif_aead 언로드를 시도 |
reset | fix가 설치한 modprobe 규칙을 제거(패치된 커널로 업그레이드한 후 실행) |
| 코드 | 의미 |
|---|
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 | 커널 버전을 구문 분석할 수 없거나 평가 범위를 벗어남 |