
패시브 Linux 호스트 스캐너로, 커널 버전, 배포판 변경 로그, 모듈 상태 및 AF_ALG 도달 가능성을 통해 CVE-2026-31431 노출 여부를 분류하며, SIEM 통합을 위한 JSON 출력을 제공합니다.
저자/기여자: Patrick Doyle(저자/관리자), Effie Renard(공동 저자), Kimberly-Lee Banks(공동 저자), Chris F.(지원/코드 리뷰)
AI 공개: 테스트 파일 작성, 테스트 데이터 작성, 코드 보안 검토에 Claude Code가 사용되었습니다. 모든 편집은 기여자 중 한 명이 수동으로 감사했습니다.
Linux 호스트의 CVE-2026-31431 노출 여부를 분류하는 단일 정적 링크 Go 바이너리입니다.
이 도구는 수동적(passive) 입니다. 버그를 악용하지 않습니다. 메커니즘 프로브(아래 안전성 설명 참조)는 정확히 두 개의 syscall만 실행하며 취약한 코드 경로에는 절대 접근하지 않습니다.
| 신호 | 소스 | 플래그 |
|---|
| 커널 버전 vs. 업스트림 수정 | uname(2) | --kernel-version |
| 배포판 변경 로그에 CVE 언급 | apt/rpm/apk 또는 디스크의 changelog.Debian.gz | --changelog |
algif_aead 모듈 상태 | /proc/modules, modprobe.d, /lib/modules | --module |
| 취약한 표면 접근 가능 여부 | socket(AF_ALG) + bind(authencesn(...)) | --mechanism |
| vmlinux에 컴파일됨 | /boot/config-$(uname -r) 또는 /proc/config.gz | (--module의 일부) |
체크 플래그가 없으면 네 가지 모두 실행됩니다.
| 모드 | 트리거 | 사용 사례 |
|---|---|---|
| 스타일 적용(기본값) | TTY stdout, --format 재정의 없음, NO_COLOR 환경 변수 없음 | 대화형 셸 실행 |
| 일반 텍스트 | non-TTY stdout, 또는 --format=text, 또는 NO_COLOR=1, 또는 --no-color | 셸 스크립트, 파이프 |
| JSON | --format=json | Syslog/SIEM 수집, 셸 스크립트 |
| Quiet | --quiet | 종료 코드만(자동화/스크립트) |
파이프 시 스타일 강제: cvecheck --pretty | tee report.txt.
TTY에서 일반 텍스트 강제: cvecheck --no-color 또는 NO_COLOR=1 cvecheck.
프로브는 정확히 두 개의 syscall socket(AF_ALG, SOCK_SEQPACKET, 0)과 bind(fd, &SockaddrALG{Type:"aead", Name:"authencesn(hmac(sha256), cbc(aes))"})을 실행합니다. 그 후 close(fd)가 이어집니다. 키를 위한 setsockopt, accept, sendmsg, splice, 파이프 생성은 전혀 수행하지 않습니다. 취약한 코드 경로는 암호화 데이터의 sendmsg와 페이지 캐시 기반 파일 디스크립터의 splice가 결합되어야 하므로, 이러한 작업이 발생하지 않아 버그가 트리거될 수 없습니다.
프로브 성공은 표면에 접근 가능함을 의미합니다. 커널에 버그가 여전히 존재하는지 여부는 커널 버전 + 변경 로그 신호로 결정됩니다.
부작용: 성공적인 bind는 커널 모듈 자동 로더를 통해 algif_aead를 자동 로드합니다. 모듈 검사는 메커니즘 프로브 이전에 실행되므로 로드 상태 보고는 프로브 이전 상태입니다. 자동 로드를 완전히 억제하려면 먼저 algif_aead를 블랙리스트에 등록하세요.
| 코드 | 의미 |
|---|---|
0 | PATCHED / NOT_VULNERABLE / MITIGATED / LIKELY_NOT_EXPLOITABLE |
2 | VULNERABLE 또는 MECHANISM_REACHABLE(부분 검사, 커널 버전 미확인) |
3 | INCONCLUSIVE(신호 부족) |
| 배포판 | 감지 | 커널 패키지 | 참고 |
|---|---|---|---|
| Ubuntu / Debian / Mint / Pop!_OS | apt | linux-image-$(uname -r) | 디스크 우선 변경 로그 읽기로 서명된 커널에서 apt changelog 네트워크 불안정성 회피 |
| RHEL / CentOS / Rocky / Alma / Fedora / Amazon Linux | rpm | kernel | algif_aead가 내장(CONFIG_..._AEAD=y)되어 제공됨; 블랙리스트 완화 효과 없음 |
| Oracle Linux | rpm | kernel 또는 kernel-uek | UEK는 uname -r의 uek 하위 문자열로 감지 |
| openSUSE / SLES | rpm | kernel-default | |
| Alpine | apk | linux-lts / linux-virt 등 | 릴리스 접미사에서 플레이버 선택 |
| Arch / CachyOS / Manjaro / Endeavour / Gentoo | 없음 | 해당 없음 | 롤링/소스: 커널 버전 검사에 의존 |
아키텍처를 자동 감지하여 올바른 바이너리를 $(pwd)에 다운로드하고 게시된 SHA256SUMS에 대해 SHA-256을 검증합니다:
curl -fsSL https://copyfail.pcdoyle.dev/install.sh | sh
체크섬 불일치 시 스크립트는 0이 아닌 코드로 종료하고 잘못된 파일을 제거합니다.
호스트 아키텍처에 맞는 바이너리를 선택하세요:
| 아키텍처 | 바이너리 |
|---|---|
Intel/AMD 64비트(x86_64) | cvecheck-linux-x86_64 |
ARM 64비트(aarch64) | cvecheck-linux-arm64 |
Intel/AMD 32비트(i?86) | cvecheck-linux-x86 |
실행 전 검증:
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/cvecheck-linux-x86_64
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
chmod +x cvecheck-linux-x86_64
make build # bin/cvecheck-linux-{x86_64,arm64,x86}
# SCP(SFTP)로 서버에 전송:
scp ./bin/cvecheck-linux-x86_64 host:/tmp/ # 4MB 미만, 정적, glibc 의존성 없음
# SSH:
ssh <host>
# 바이너리 실행:
/tmp/cvecheck-linux-x86_64 # 사람이 읽기 쉬운 스타일 출력.
/tmp/cvecheck-linux-x86_64 --format=json # 스크립트, Syslog, SIEM 친화적
/tmp/cvecheck-linux-x86_64 --format=text # 스크립트, 파이프 친화적
ssh <host> /tmp/cvecheck-linux-x86_64 # 직접 실행 시 기본값은 --format=text
ssh <host> /tmp/cvecheck-linux-x86_64 --format=json # Syslog/SIEM 친화적
호스트 루트를 읽기 가능한 위치에 마운트하고 --root를 전달하세요:
docker run --rm -v /:/host:ro alpine /tmp/cvecheck --root /<host-path>
--root는 모든 디스크 기반 조회(/etc/os-release, modprobe.d, /lib/modules, /boot/config-*, 변경 로그 파일)를 제어합니다. 커널 버전 및 메커니즘 프로브는 여전히 uname(2) 및 socket(AF_ALG, ...)을 통해 실행 중인 커널에 접근합니다.
다음 순서로 해결됩니다(첫 번째 일치가 우선):
PATCHED: 배포판 변경 로그가 CVE ID를 참조함.NOT_VULNERABLE: 실행 중인 커널 >= 업스트림 수정 버전.MITIGATED: algif_aead가 블랙리스트에 등록됨 그리고 로드되지 않음 그리고 vmlinux에 내장되지 않음.LIKELY_NOT_EXPLOITABLE: AF_ALG를 사용할 수 없고 모듈이 디스크에 없음.MECHANISM_REACHABLE: 표면에 접근 가능하지만 커널 버전이 확인되지 않음.VULNERABLE: 커널이 취약 범위에 있고 메커니즘에 접근 가능.INCONCLUSIVE: 위 중 어느 것도 일치하지 않음.--mechanism이 --kernel-version과 함께 실행되고 둘 다 문제를 나타내면 결과는 완화 힌트와 함께 VULNERABLE입니다.
algif_aead를 블랙리스트에 등록하세요.
echo 'blacklist algif_aead' | sudo tee /etc/modprobe.d/cve-2026-31431.conf
sudo rmmod algif_aead 2>/dev/null
CONFIG_CRYPTO_USER_API_AEAD=y가 심볼을 vmlinux 내부에 넣기 때문에 블랙리스트 파일은 효과가 없습니다. 커널 업그레이드(또는 kpatch 스타일 라이브 패치)만이 노출을 해결합니다. 도구가 이를 감지합니다.| 증상 | 원인 | 해결책 |
|---|---|---|
changelog: error="apt: exit status 100 ... Changelog unavailable for linux-signed-amd64" | Debian/Ubuntu 서명 커널; apt 미러가 소스 패키지 변경 로그를 제공하지 않음 | 오류는 디스크의 파일이 없고 미러에 접근할 수 없는 경우에만 나타납니다. apt-doc을 설치하거나 미러를 기다리세요. |
module: ... config_src="" | 커널 구성 파일을 읽을 수 없음(/boot/config-* 없음, /proc/config.gz 없음, /boot가 root 전용) | root로 실행하거나 BuiltIn을 확인할 수 없음을 수용하세요. 다른 신호로 판정이 내려질 수 있습니다. |
mechanism: error="EAFNOSUPPORT" | 커널이 CONFIG_CRYPTO_USER_API 없이 빌드되어 AF_ALG를 통한 취약점이 없음 | 판정은 LIKELY_NOT_EXPLOITABLE이 됩니다. |