
CVE-2026-31431 복사 실패에 대한 빠르고 감사 가능한 Linux 완화: algif_aead 차단, 검증 및 AF_ALG seccomp 강화.
______ ______ _ __ ______ __
/ ____/___ ____ __ _/ ____/___ _(_) / / ____/_ ______ __________/ /
/ / / __ \/ __ \/ / / / /_ / __ `/ / / / / __/ / / / __ `/ ___/ __ /
/ /___/ /_/ / /_/ / /_/ / __/ / /_/ / / / / /_/ / /_/ / /_/ / / / /_/ /
\____/\____/ .___/\__, /_/ \__,_/_/_/ \____/\__,_/\__,_/_/ \__,_/
/_/ /____/
커널이 패치되는 동안 CVE-2026-31431 “Copy Fail”에 대한 빠르고 감사 가능한 Linux 노출 평가 및 완화 도구입니다.
CopyFail Guard는 Linux 시스템 관리자, DevSecOps 엔지니어, 플랫폼 팀 및 침해 대응 담당자를 위한 방어 운영 도구입니다. Linux algif_aead/AF_ALG 문제에 대한 노출을 다음과 같이 줄이는 데 도움을 줍니다:
algif_aead의 사용 가능 여부, 로드됨, 빌트인 또는 이미 차단됨 확인modprobe.d 차단 설치 및 안전한 경우 모듈 언로드최종 수정: 공급업체의 패치된 커널을 설치하고 재부팅하세요. 이 도구는 공개와 전체 플릿 패치 사이의 운영상의 공백을 메웁니다.
splice, setuid 변경, 권한 상승 또는 파괴적인 프로브 없이 노출과 AF_ALG 접근 가능성 확인./etc/modprobe.d/99-copyfail-guard.conf를 작성하며, 롤백은 해당 파일만 제거합니다.seccomp-patch는 기존 Docker/Podman/Kubernetes seccomp 프로필에 AF_ALG 거부를 추가하여 런타임 강화를 대체하지 않습니다.assess --json 및 문서화된 종료 코드로 플릿 스캔, SIEM 캡처 및 변경 관리 증거 지원.Linux 호스트에서 빠른 답변이 필요하다면:
git clone --depth 1 https://github.com/juliosuas/copyfail-guard.git
cd copyfail-guard
sudo ./bin/copyfail-guard.sh doctor
sudo ./bin/copyfail-guard.sh assess
판정이 노출됨이고 algif_aead가 모듈형이라면:
sudo ./bin/copyfail-guard.sh mitigate --yes
sudo ./bin/copyfail-guard.sh verify
반복 설치를 위해 릴리스 태그를 고정하려면:
git clone --branch v0.3.0 --depth 1 https://github.com/juliosuas/copyfail-guard.git
최신 태그된 릴리스가 나오면 v0.3.0을 해당 버전으로 바꾸세요.
먼저 안전한 노출 검사를 실행하세요:
sudo ./bin/copyfail-guard.sh assess
결과를 읽는 방법:
| 판정 계열 | 의미 | 조치 |
|---|---|---|
EXPOSED_* | algif_aead/AF_ALG가 접근 가능하거나 로드 가능한 것으로 보임 | 지금 완화, 이후 패치 후 재부팅 |
PARTIALLY_MITIGATED_* | 차단이 존재하지만 로드된 모듈이나 재부팅 상태가 여전히 중요함 | 안전하게 재부팅 또는 언로드 후 확인 |
INTERIM_MITIGATED_* | 로컬 완화가 활성화됨 | 유지하지만 여전히 패치 후 재부팅 |
LOW_OBVIOUS_EXPOSURE_* | 로컬 검사에서 명백한 algif_aead 노출을 찾지 못함 | 그래도 공급업체 패치 상태 확인 |
신뢰할 수 없는 컨테이너, CI 작업, 샌드박스 또는 다중 사용자 워크로드를 실행하는 경우 해당 런타임 내에서 AF_ALG 소켓 생성이 차단되었는지도 테스트하세요:
python3 tools/afalg-socket-test.py
PERMITTED는 성공적인 익스플로잇을 증명하지 않지만, 관련 사용자 공간 암호화 API에 접근 가능하다는 것을 증명합니다. 방어 운영의 경우, 패치된 커널 롤아웃을 확인하는 동안 완화를 적용할 충분한 이유입니다.
파괴적인 개념 증명은 포함되지 않았습니다. 이는 기능이지 결함이 아닙니다.
실제 Copy Fail 익스플로잇 증명은 커널 메모리/페이지 캐시 영향 또는 권한 상승을 검증해야 합니다. 공용 완화 저장소에 이를 포함하면 프로젝트의 안전성과 프로덕션 배포 가능성이 낮아집니다.
CopyFail Guard는 운영자가 안전하게 조치할 수 있는 사항을 증명합니다:
최종 취약점 상태에 대해서는 이 도구를 공급업체 권고/패키지 인벤토리 및 재부팅 증거와 결합하세요.
CopyFail Guard는 완화이지 치료가 아닙니다. 노출을 줄이고 임시 통제를 확인합니다. 지속적인 수정은 공급업체 패치 커널과 재부팅입니다.
이 도구는 침해 대응을 위해 의도적으로 클론 앤 런 방식입니다: 코어 호스트 워크플로우에는 컴파일러, 커널 헤더, 익스플로잇 코드 또는 타사 패키지 관리자가 필요하지 않습니다. python3는 --json 출력, seccomp-patch 및 비익스플로잇 AF_ALG 소켓 테스트에 필요합니다.
클론 앤 런:
git clone https://github.com/juliosuas/copyfail-guard.git
cd copyfail-guard
chmod +x bin/copyfail-guard.sh
sudo ./bin/copyfail-guard.sh doctor
sudo ./bin/copyfail-guard.sh assess
sudo ./bin/copyfail-guard.sh mitigate --yes
sudo ./bin/copyfail-guard.sh verify
선택적 시스템 설치:
git clone https://github.com/juliosuas/copyfail-guard.git
cd copyfail-guard
sudo ./scripts/install.sh
sudo copyfail-guard status
설치 프로그램은 소스와 대상을 고정하여 통제된 롤아웃을 지원합니다:
sudo env COPYFAIL_GUARD_REF=v0.3.0 ./scripts/install.sh
최신 태그된 릴리스가 나오면 COPYFAIL_GUARD_REF에 해당 버전을 사용하세요.
컨테이너/CI 강화:
./bin/copyfail-guard.sh seccomp-patch docker-default.json copyfail-seccomp.json
docker run --security-opt seccomp=./copyfail-seccomp.json IMAGE
보호된 컨테이너 내에서 AF_ALG가 차단되었는지 확인:
docker run --rm \
--security-opt seccomp=./copyfail-seccomp.json \
-v "$PWD/tools:/tools:ro" \
python:3.12-alpine \
python /tools/afalg-socket-test.py
예상 보호 결과:
BLOCKED: socket(AF_ALG) denied by policy (...)
예상 판정, JSON 형태 및 컨테이너 검증 결과는 샘플 출력을 참조하세요.
Copy Fail은 AF_ALG 사용자 공간 암호화 API의 algif_aead 구성 요소에서 발생하는 Linux 커널 로컬 권한 상승입니다. 공개 권고에서는 권한이 없는 로컬 사용자가 접근할 수 있고 특히 공유 커널 시스템(Kubernetes 노드, CI/CD 러너, 멀티 테넌트 호스트, 에이전트 샌드박스, 개발자 박스)에서 위험한 페이지 캐시 쓰기 프리미티브를 설명합니다.
올바른 수정은 업스트림 되돌리기/수정을 포함한 공급업체 커널 업데이트와 패치된 커널로 재부팅입니다. CopyFail Guard는 전 플릿에 재부팅이 완료되기 전의 기간을 위한 방어 운영 도우미입니다.
| 영역 | 명령 | 목적 |
|---|---|---|
| 안전한 평가 | assess | 비익스플로잇 노출 판정, 다음 조치 및 자동화 친화적 종료 코드 제공 |
| 종속성 확인 | doctor | 필요/선택 도구 확인 및 런타임 제한 설명 |
| 호스트 검사 | status | OS/커널, 모듈 사용 가능 여부, 로드 상태, 빌트인 경고, modprobe 차단 및 명백한 AF_ALG 소비자 표시 |
| 호스트 완화 | mitigate | /etc/modprobe.d/99-copyfail-guard.conf 작성 및 algif_aead 언로드 시도 |
| 확인 | verify | 모듈이 로드되었거나 빌트인이거나 차단되지 않은 경우 명확하게 실패 |
| 롤백 | rollback | CopyFail Guard가 관리하는 modprobe 파일만 제거 |
| 컨테이너 | seccomp-patch | 기존 seccomp 프로필에 socket(AF_ALG, ...)를 거부하도록 패치, 정상 소켓 사용은 유지 |
| 긴급 프로필 | seccomp-docker | 긴급 사용을 위한 대상 AF_ALG 거부 프로필 생성 |
| Kubernetes | k8s-example | Localhost seccomp 파드 예제 출력 |
코어 호스트 명령:
bashmodinfo, modprobe, lsmod, rmmod (사용 가능한 경우)grep, awk, mktemp, install선택적 가시성 도구:
lsof 또는 ss (AF_ALG 소비자 확인용)Seccomp 프로필 패치:
--json, seccomp-patch 및 tools/afalg-socket-test.py에는 python3 필요익스플로잇 코드, 컴파일러, 커널 헤더 또는 타사 패키지는 필요하지 않습니다.
CopyFail Guard는 익스플로잇 개념 증명을 포함하지 않습니다. 이는 의도적입니다. 취약점을 증명하나요? 참조.
대신 assess는 안전한 운영 점검을 수행합니다:
algif_aead가 사용 가능, 로드됨, 빌트인 또는 차단된 것으로 보이는지 감지자동화 JSON:
sudo ./bin/copyfail-guard.sh assess --json
./bin/copyfail-guard.sh doctor --json
종료 코드:
| 코드 | 의미 |
|---|---|
0 | 로컬 검사에서 명백한 노출 낮음 |
1 | 임시 완화 활성화, 패치/재부팅 여전히 필요 |
10 | 노출됨/완화 가능 |
11 | 부분 완화됨; 재부팅 또는 언로드 필요 |
12 | 빌트인 모듈 경로; 패치/재부팅 필요 |
20 | 알 수 없는 평가 상태 |
mitigate는 다음을 작성합니다:
/etc/modprobe.d/99-copyfail-guard.conf
내용:
# CopyFail Guard에서 CVE-2026-31431을 위해 관리함
install algif_aead /bin/false
blacklist algif_aead
그런 다음 시도:
sudo rmmod algif_aead
모듈이 현재 사용 중이면 rmmod가 실패할 수 있습니다. 그 경우에도 영구 차단은 설치된 상태로 유지됩니다; AF_ALG 소비자를 중지하거나 완화 적용 후 재부팅하세요.
스크립트는 관리되는 modprobe 경로에서 심볼릭 링크를 덮어쓰지 않으며 파일을 안전한 권한으로 원자적으로 작성합니다.
신뢰할 수 없는 워크로드의 경우 호스트를 패치하는 동안에도 seccomp로 AF_ALG 소켓 생성을 차단하세요.
권장 경로: 기존 런타임 seccomp 기준을 교체하는 대신 패치하세요:
./bin/copyfail-guard.sh seccomp-patch docker-default.json copyfail-seccomp.json
Docker와 함께 사용:
docker run --security-opt seccomp=./copyfail-seccomp.json IMAGE
Podman과 함께 사용:
podman run --security-opt seccomp=./copyfail-seccomp.json IMAGE
기준 프로필이 없는 경우 긴급 전용 경로:
./bin/copyfail-guard.sh seccomp-docker ./copyfail-afalg-seccomp.json
생성된 긴급 프로필은 AF_ALG를 차단하지만 다른 syscall은 허용합니다. Docker의 일반적인 기본 seccomp 강화를 대체하는 것이 아니라 대상 임시 방편으로 취급하세요.
Kubernetes의 경우 kubelet seccomp 루트 아래에 프로필을 배치하세요. 일반적으로: