
Ansible 플레이북: CVE-2026-31431(Copy Fail) 탐지 및 수정 - Linux 커널 로컬 권한 상승 취약점
Copy Fail Detection and Remediation
Linux 커널의 algif_aead 모듈에서 발생하는 치명적인 로컬 권한 상승 취약점인 CVE-2026-31431(복사 실패)을 탐지하고 완화하기 위한 Ansible 역할 및 플레이북 모음입니다.
🔗 GitHub: https://github.com/parmstro/cfDr
cfDr라는 이름은 "Copy Fail Doctor"의 말장난으로, CVE-2026-31431에 대한 신뢰할 수 있는 해결책을 의미합니다.
CVE-2026-31431(CVSS 7.8)은 2026년에 발견된 Linux 커널의 AEAD 소켓 인터페이스(AF_ALG)의 논리적 결함입니다. 이 취약점을 통해 권한이 없는 모든 로컬 사용자가 몇 초 만에 루트 권한으로 상승할 수 있습니다.
algif_aead 커널 모듈(AF_ALG 암호화 인터페이스)커널 버전: Linux 커널 >= 4.10(2017년 출시)
영향을 받는 배포판:
참고: 커널 4.10 이상을 사용하는 모든 Linux 배포판은 잠재적으로 취약합니다.
이 취약점은 특히 다음과 같은 이유로 위험합니다:
공격자가 SSH, 웹 셸, 컨테이너 탈출 등 어떤 형태로든 로컬 액세스 권한을 얻으면 다음과 같은 행위가 가능합니다:
공급업체가 제공하는 커널 패치를 기다리는 동안 여러 완화 전략을 사용할 수 있습니다. cfDr는 시스템 구성을 기반으로 한 지능적인 권장 사항과 함께 이러한 모든 전략을 구현합니다.
모든 완화 조치가 동일한 것은 아닙니다. 알아야 할 사항은 다음과 같습니다:
| 방법 | 루트가 우회할 수 있나요? | 적용 범위 | 엔터프라이즈 Linux 지원 |
|---|---|---|---|
| 모듈 블랙리스트 | ✅ 예(insmod 통해) | modprobe 로딩 방지 | 모든 버전 |
| SELinux 정책 | ❌ 아니요(LSM 계층) | 구성된 도메인만 | 모든 버전(기본값) |
| systemd seccomp | ❌ 아니요(시스콜 필터) | 구성된 서비스만 | 모든 버전 |
| eBPF LSM | ❌ 아니요(LSM 계층) | 시스템 전체(구성된 경우) | RHEL 9+, Fedora 34+ |
cfDr의 기본 권장 사항: 플래그 3(모듈 블랙리스트 + SELinux)
이 방식은 두 개의 독립적인 보호 계층을 제공합니다:``` ┌─────────────────────────────────────────────────┐ │ Layer 1: Module Blacklist │ │ • Prevents modprobe algif_aead │ │ • Persists across reboots │ │ • CAN be bypassed by malicious root (insmod) │ ├─────────────────────────────────────────────────┤ │ Layer 2: SELinux Policy │ │ • Blocks AF_ALG socket() at syscall level │ │ • Works even if module is loaded │ │ • CANNOT be bypassed from userspace │ │ • Covers user_t, unconfined_t (majority cases) │ └─────────────────────────────────────────────────┘
Result: If either layer fails, the other still protects
### 모듈 블랙리스트만으로는 충분하지 않은 이유
루트 권한을 가진 결심한 공격자는 모듈 블랙리스트를 우회할 수 있습니다:```bash
# Module blacklist DOES NOT prevent:
insmod /lib/modules/$(uname -r)/kernel/crypto/algif_aead.ko.xz
그러나, 이는 허용 가능한 이유는 다음과 같습니다:
완전하고 우회 불가능한 보호를 위해서는 다음이 필요합니다:
모듈 블랙리스트 + 다음 중 하나 이상:
cfDr는 비트 플래그를 사용하여 여러 완화 조치를 활성화합니다:
| 플래그 값 | 활성화된 완화 조치 | 사용 사례 |
|---|---|---|
| 1 | 모듈 블랙리스트만 | 최소 보호, SELinux가 없는 시스템 |
| 2 | SELinux만 | SELinux 전용 환경 |
| 3 | 모듈 블랙리스트 + SELinux | 권장 기본값 |
| 5 | 모듈 블랙리스트 + seccomp | SELinux가 없는 서비스 강화 환경 |
| 7 | 모듈 블랙리스트 + SELinux + seccomp | 강화된 보호 |
| 15 | 모든 완화 조치 | 최대 보호(RHEL 9+ 전용) |
플래그 계산: 1(블랙리스트) + 2(SELinux) + 4(seccomp) + 8(eBPF) = 합계
SELinux 보호:
user_t, unconfined_t, httpd_t, postgresql_t, mysqld_tuser_t 및 unconfined_t는 대부분의 공격 시나리오를 포괄합니다systemd seccomp 보호:
httpd, nginx, postgresql, mariadb, redis, memcachedeBPF LSM 보호:
cfDr는 여러 차원에 걸쳐 포괄적인 평가를 수행합니다:
uname -r
- 커널 버전이 4.10 이상인지 확인합니다 (취약 범위)
- 커널 릴리스 및 배포판을 식별합니다
#### 2. 모듈 사용 가능 여부 확인```bash
modinfo algif_aead
algif_aead 모듈이 존재하는지 확인합니다lsmod | grep algif_aead
- 모듈이 현재 로드되었는지 확인
- **중요**: 로드된 모듈 = 적극적으로 악용 가능
#### 4. 활성 소켓 탐지```bash
lsof -U | grep AF_ALG
모듈 블랙리스트:```bash grep -E "blacklist algif_aead|install algif_aead" /etc/modprobe.d/*.conf
**SELinux 정책**:```bash
semodule -l | grep cve_2026_31431_af_alg_deny
systemd seccomp:```bash systemctl show | grep RestrictAddressFamilies
#### 6. 범주형 상태 판정
cfDr는 각 호스트를 다음 상태 중 하나로 분류합니다:
| 상태 | 조건 | 필요한 조치 |
|--------|-----------|-----------------|
| **취약 - 모듈 로드됨** | 커널 >= 4.10, 모듈 존재 및 로드됨 | **즉시** - 실제 악용 가능 |
| **취약 - 모듈 존재** | 커널 >= 4.10, 모듈 존재, 로드되지 않음 | **높음** - 로드 및 악용 가능 |
| **완화됨 - 모듈 블랙리스트** | 블랙리스트 감지됨 | **낮음** - 모니터링, 추가 보안 계층 적용 |
| **보호됨 - 심층 방어** | 블랙리스트 + SELinux/seccomp/eBPF | **없음** - 완전히 보호됨 |
| **취약하지 않음 - 구형 커널** | 커널 < 4.10 | **없음** - 취약점 이전 버전 |
| **취약하지 않음 - 모듈 없음** | algif_aead 모듈이 커널에 없음 | **없음** - 모듈 사용 불가 |
### 평가 출력
각 호스트는 다음을 받습니다:
1. **콘솔 출력**: 한 줄 요약 상태
2. **상세 파일**: `/root/cve-2026-31431-assessment-<hostname>.txt`
3. **JSON 보고서**: `/tmp/cve-2026-31431-<hostname>.json`
간단한 출력 예시:```
webserver1.example.com: VULNERABLE - Module exists and can be loaded
dbserver2.example.com: PROTECTED - Defense-in-depth (Module Blacklist + SELinux)
appserver3.example.com: NOT VULNERABLE - Module not available
cfDr은 여러 플레이북 진입점을 갖춘 현대적인 Ansible 역할로 구축되었습니다:``` cfDr/ ├── roles/ │ └── cve_2026_31431/ # Main role │ ├── tasks/ │ │ ├── main.yml # Role orchestration │ │ ├── assessment.yml # Vulnerability detection │ │ ├── remediation_module_blacklist.yml │ │ ├── remediation_selinux.yml │ │ ├── remediation_seccomp.yml │ │ ├── remediation_ebpf.yml │ │ ├── reporting.yml # Status reporting │ │ └── inventory_update.yml # Inventory generation │ ├── templates/ # Config file templates │ ├── defaults/ # Default variables │ └── handlers/ # Service restarts, etc. ├── quickstart.yml # Simplest usage ├── sample_playbook.yml # Multiple examples └── cve_2026_31431_playbook.yml # Full-featured playbook
### 실행 흐름