
Ansible 플레이북으로, Debian/Ubuntu/RHEL 플릿 전반에 걸쳐 CVE-2026-31431(Copy Fail)에 대한 커널 cmdline 완화 조치를 감지하고 적용하며, 읽기 전용 감지 및 멱등 적용을 지원합니다.
CVE-2026-31431("Copy Fail")에 대한 커널 커맨드라인 완화 조치를 Debian / Ubuntu / RHEL 계열 시스템 전체에서 탐지하고 적용합니다.
이 CVE는 Linux 커널의 algif_aead AF_ALG 인터페이스에 존재하는 로컬 권한 상승 취약점입니다. www-data, mysql 같은 서비스 계정이나 RCE에 노출된 웹 앱 내부의 프로세스를 포함한 모든 비특권 로컬 사용자가 몇 번의 syscall만으로 루트 권한을 획득할 수 있습니다. 이 버그는 2017년 이후 출시된 모든 주요 배포판에 영향을 미칩니다.
-e apply_mitigation=true로 실행하면 범용 완화 조치(커널 커맨드라인에 initcall_blacklist=algif_aead_init 추가)를 적용합니다.커널 커맨드라인 블랙리스트는 내장형(RHEL 계열) 및 모듈형(Debian/Ubuntu) 구성 모두에서 작동하며, 자주 언급되는 modprobe blacklist algif_aead 우회 방법으로는 불가능합니다.
algif_aead_init()은 부팅 시 크립토 소켓 서브시스템에 aead AF_ALG 알고리즘을 등록하는 커널 함수입니다. 커맨드라인 매개변수 initcall_blacklist=algif_aead_init은 커널이 해당 initcall을 건너뛰도록 지시합니다. 취약한 코드는 여전히 커널 바이너리에 존재하지만, socket(AF_ALG, ..., "aead")가 ENOENT를 반환하므로 익스플로잇의 첫 번째 syscall이 실패합니다. 접근 가능한 표면이 없으므로 권한 상승도 불가능합니다.
벤더가 패치된 커널을 배포하고 해당 커널로 재부팅하면 완화 조치가 더 이상 필요하지 않으므로 제거할 수 있습니다.
# 1. 탐지(읽기 전용) — 호스트별 상태 보고서 생성
ansible-playbook -i inventory check_cve_2026_31431.yml
# 2. 먼저 단일 호스트에 완화 조치 스테이징(자동 재부팅 없음)
ansible-playbook -i inventory --limit <ip-or-host> \
-e apply_mitigation=true check_cve_2026_31431.yml
# 3. 일반적인 방법으로 해당 호스트 재부팅
# 4. 재탐지; "Mitigation active: yes" 확인
# 5. 나머지 시스템에 배치 단위로 롤아웃
취약한 호스트의 보고서는 다음과 같습니다:
═══════════════════════════════════════════
Host: 192.168.1.42
Distro: Ubuntu 24.04
Kernel: 6.8.0-60-generic
Mitigation active: no
Mitigation staged: no
═══════════════════════════════════════════
⚠️ 192.168.1.42: CVE-2026-31431 mitigation is NOT active.
이 레시피의 범위를 벗어납니다. 수동 원라이너:
# Debian / Ubuntu
sudo sed -i 's/ initcall_blacklist=algif_aead_init//' /etc/default/grub
sudo update-grub
sudo reboot
# RHEL 계열
sudo grubby --update-kernel=ALL --remove-args="initcall_blacklist=algif_aead_init"
sudo reboot
탐지 경로는 엄격히 읽기 전용입니다(uname, /proc/cmdline 읽기, /etc/default/grub 읽기, grubby --info=ALL). 프로브는 failed_when: false를 사용하므로 예상치 못한 출력이 플레이를 중단시키지 않습니다. ignore_unreachable: true는 연결할 수 없는 호스트에 대해 실행 실패 대신 명확한 "UNREACHABLE — treat as VULNERABLE" 경고를 표시합니다.
적용 경로는 block/rescue로 감싸져 있어 단일 호스트의 오류가 나머지 호스트를 중단시키지 않습니다. grub 편집은 멱등적이며 mitigation_staged로 게이트되므로 재실행 시 아무 작업도 수행하지 않습니다.
bash tests/run-checks.sh all
단계: lint(yamllint + ansible-lint) → syntax(ansible-playbook --syntax-check) → dry-run(-c local로 localhost에 대해 --check 모드로 플레이북 실행, 탐지 및 적용 경로 모두). 동일한 스크립트가 GitHub Actions 매트릭스에서 debian:12, ubuntu:22.04, ubuntu:24.04, almalinux:9 컨테이너에 대해 모든 push 및 pull request 시 호출됩니다.
dry-run이 검증하지 않는 사항:
update-grub을 실행하거나 재부팅을 트리거하지 않습니다./proc/cmdline은 컨테이너가 아닌 러너 호스트의 cmdline을 표시하므로 CI 출력의 mitigation_active는 의미가 없습니다. CI는 플레이북이 깨끗하게 실행됨을 증명할 뿐, 호스트가 완화되었음을 증명하지 않습니다.자세한 내용은 tests/README.md를 참조하세요.
취약점은 Taeyang Lee(Theori) 가 발견했으며, Xint Code Research Team이 전체 익스플로잇 체인으로 무기화하여 보안 커뮤니티의 주목을 받게 한 공로가 있습니다. 이 레시피는 그들이 권장한 완화 조치를 자동화한 것에 불과합니다.
Beerware. LICENSE 참조. 요약: 이 코드로 원하는 것은 무엇이든 하세요. 만나게 되면 맥주 한 잔 사주세요.
AESTECHNO — Hugues Orgitello — 프랑스 몽펠리에 소재 전자 설계 하우스.