
CVE-2026-31431 "Copy Fail" 및 CVE-2026-43284 "Dirty Frag"에 대한 안전한 탐지 도구입니다. 2017년 이후 모든 주요 배포판에 영향을 미치는 리눅스 커널의 algif_aead 모듈에서의 로컬 권한 상승 취약점입니다.
두 가지 관련 Linux 커널 로컬 권한 상승 취약점 계열 — Copy Fail (CVE-2026-31431) 및 Dirty Frag (CVE-2026-43284 / CVE-2026-43500) — 에 대한 안전한 탐지 도구입니다. 두 계열 모두 2017년 이후 모든 주요 배포판에 영향을 미치며, 권한이 없는 로컬 사용자에 의해 악용될 수 있으며, 독립적인 완화 조치가 필요합니다.
이 프로브는 소켓을 열지 않으며 암호화 또는 네트워크 작업을 수행하지 않습니다.
탐지는 전적으로 커널 버전, 배포판 패키지 메타데이터, 모듈 상태 및 활성 완화 플래그(모두sudo없이 읽을 수 있는 세계 읽기 가능 정보)에 기반합니다.
Copy Fail 완화 조치를 적용한다고 해서 Dirty Frag로부터 보호되지는 않습니다.
두 프로브를 모두 실행하고 두 완화 조치를 각각 적용해야 합니다.
.
├── cve-2026-31431-check.sh Copy Fail 프로브 (모든 출력 모드)
├── copy_fail_userparameter.conf Zabbix 에이전트 UserParameter — Copy Fail
├── zabbix_template_copy_fail.yaml Zabbix 6.4 템플릿 — Copy Fail
├── copy_fail_auditd.rules auditd 행동 감지 — Copy Fail
├── cve-2026-43284-check.sh Dirty Frag 프로브 (모든 출력 모드)
├── dirty_frag_userparameter.conf Zabbix 에이전트 UserParameter — Dirty Frag
├── wazuh_sca/
│ └── copy_fail_sca.yml Wazuh SCA 컴플라이언스 정책
└── ansible/
└── copy_fall_scan.yml 플릿 전체 Ansible 스캔 플레이북
이 익스플로잇은 정확히 다음과 같은 syscall 체인을 필요로 합니다:
socket(AF_ALG, SOCK_SEQPACKET, 0)
bind(fd, {alg_type="aead", alg_name="authencesn(hmac(sha256),cbc(aes))"})
accept(fd, ...)
splice(suid_binary_fd, op_fd) ← 페이지 캐시가 암호화 서브시스템으로 공급됨
sendmsg / recvmsg ← 4바이트 스크래치 쓰기가 페이지 캐시에 기록됨
프로브는 이 중 어떤 것도 사용하지 않습니다. 탐지는 다음을 기반으로 합니다:
.ko 존재 (자동 로드 가능)modprobe.d 블랙리스트 및 initcall_blacklist 커널 파라미터chmod +x cve-2026-31431-check.sh
./cve-2026-31431-check.sh # 사람이 읽기 쉬운 출력
./cve-2026-31431-check.sh --json # 기계가 읽기 쉬운 출력
./cve-2026-31431-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-31431-check.sh --zabbix # Zabbix 아이템용 정수 0/1/2
종료 코드: 0 = PATCHED 또는 MITIGATED · 1 = VULNERABLE · 2 = UNKNOWN
스크립트는 이러한 임계값을 자동으로 비교하여 실행 중인 패키지가 임계값 이상일 경우 PATCHED로 판정합니다.
RHEL, AlmaLinux, Rocky Linux 및 그 파생 배포판에서는 algif_aead가 커널에 내장되어 컴파일됩니다. modprobe.d 우회 조치는 효과가 없습니다. 오직 커널 명령줄의 initcall_blacklist=algif_aead_init만 작동합니다. 프로브가 이를 감지하여 명시적으로 경고합니다.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Frag는 Hyunwoo Kim(@v4bel)이 발견하고 2026년 5월 7일경에 공개된 두 가지 인플레이스 복호화 고속 경로 버그를 연결합니다. Copy Fail보다 1주 후에 공개되었습니다:
esp4, esp6); upstream 수정 f4c50a4034e6rxrpc); upstream 수정 aa54b1d27fe0이 익스플로잇은 /usr/bin/su 페이지 캐시의 파이프 페이지를 페이징된 소켓 버퍼 조각으로 연결한 다음, 공격자가 선택한 키로 인플레이스 복호화를 수행하여 setuid 바이너리의 캐시된 사본에 임의의 바이트를 직접 쓰며, 디스크의 파일을 건드리지 않습니다.
Copy Fail 완화 조치(algif_aead 블랙리스트)는 Dirty Frag를 막지 못합니다.
chmod +x cve-2026-43284-check.sh
./cve-2026-43284-check.sh # 사람이 읽기 쉬운 출력
./cve-2026-43284-check.sh --json # 기계가 읽기 쉬운 출력
./cve-2026-43284-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-43284-check.sh --zabbix # Zabbix 아이템용 정수 0/1/2
프로브는 esp4, esp6 및 rxrpc를 각각 검사하고 JSON 출력에 별도의 cve_43284_safe / cve_43500_safe 불리언을 보고합니다.
esp4 및 esp6은 IPsec(strongSwan, Libreswan)에서 사용되는 커널 측 ESP 변환입니다. 이들을 블랙리스트에 추가하면 IPsec 터널이 중단됩니다. 프로브는 ip xfrm state 및 데몬 탐지를 통해 활성 IPsec 사용을 감지하고, 그에 따라 수정 권고를 조정합니다:
modprobe.d 블랙리스트를 적용합니다.rxrpc도 별도로 블랙리스트):
# RHEL 계열
sysctl -w user.max_user_namespaces=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
# Ubuntu / Debian
sysctl -w kernel.unprivileged_userns_clone=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
| 배포판 | CVE-2026-43284 | CVE-2026-43500 (rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | 해당 없음 — RHEL 8에 rxrpc 미포함 |
| RHEL / Rocky / Alma 9.x | 대기 중 | 대기 중 |
패치된 커널을 기다리는 동안 즉시 modprobe.d 블랙리스트를 적용하십시오(IPsec 주의 사항을 고려).
AlmaLinux / RHEL 8은 rxrpc 모듈을 빌드하지 않습니다. 프로브는 RHEL/Rocky/Alma 8.x에서 자동으로 kernel_vuln_rxrpc=not_affected로 표시합니다.
각 모니터링 대상 호스트에 두 프로브를 배포합니다:
mkdir -p /etc/zabbix/scripts
install -m 750 -o zabbix -g zabbix cve-2026-31431-check.sh /etc/zabbix/scripts/
install -m 750 -o zabbix -g zabbix cve-2026-43284-check.sh /etc/zabbix/scripts/
cp copy_fail_userparameter.conf /etc/zabbix/zabbix_agentd.d/
cp dirty_frag_userparameter.conf /etc/zabbix/zabbix_agentd.d/
systemctl restart zabbix-agent # 또는 zabbix-agent2
Configuration → Templates → Import에서 zabbix_template_copy_fail.yaml을 가져옵니다.
제공되는 UserParameter 아이템:
Copy Fail 템플릿에는 status=1에 HIGH 트리거, status=2에 WARNING 트리거가 포함됩니다. sudo가 필요하지 않습니다 — 두 스크립트가 읽는 모든 파일은 세계 읽기 가능입니다.
install -m 755 cve-2026-31431-check.sh /usr/lib/nagios/plugins/
install -m 755 cve-2026-43284-check.sh /usr/lib/nagios/plugins/
# NRPE — /etc/nagios/nrpe.cfg에 추가:
command[check_copy_fail]=/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios
command[check_dirty_frag]=/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios
# CheckMK 로컬 검사:
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios); RC=$?
echo "$RC CVE-2026-31431 - $OUT"' > /usr/lib/check_mk_agent/local/copy_fail
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios); RC=$?
echo "$RC CVE-2026-43284 - $OUT"' > /usr/lib/check_mk_agent/local/dirty_frag
chmod +x /usr/lib/check_mk_agent/local/copy_fail \
/usr/lib/check_mk_agent/local/dirty_frag
현재 진행 중인 익스플로잇 시도를 탐지하여 두 정적 프로브를 보완합니다.
cp copy_fail_auditd.rules /etc/audit/rules.d/
augenrules --load
# 예상치 못한 AF_ALG 호출자 감시:
ausearch -k copy_fail_af_alg --interpret | \
grep -v -E 'cryptsetup|veritysetup|systemd-crypt|kcapi'
Wazuh 규칙 스텁(레벨 13 / 15)이 .rules 파일 주석에 포함되어 있습니다.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
결과: Security → SCA → Filter by policy cve_2026_31431_copy_fail
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml
# 하위 집합으로 제한:
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml --limit webservers
컨트롤러의 /tmp/copy_fail_results/에 호스트별 JSON + summary.txt를 작성합니다. 호스트가 VULNERABLE인 경우 플레이는 0이 아닌 종료 코드로 종료됩니다.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| 모듈 | algif_aead | esp4, esp6, rxrpc |
| 도입 시기 | 2017년 8월 (커널 4.14) | 2017년 1월 / 2023년 6월 |
| 완화 방법 | modprobe.d 블랙리스트 (algif_aead) | modprobe.d 블랙리스트 (esp4/esp6/rxrpc) |
| 프로브 스크립트 | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| 배포판 | 패치 버전 | 권고 |
|---|
| RHEL / Rocky / Alma 8.10 | kernel-4.18.0-553.123.1.el8_10 | Rocky 2026-05-11 |
| RHEL / Rocky / Alma 9.7 | kernel-5.14.0-611.54.1.el9_7 | same |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | same |
| Debian 11 (bullseye) | linux 5.10.251-3 | DLA-4560-1 |
| Debian 12 (bookworm) | linux 6.1.170-1 | DSA-6243-1 |
| Debian 13 (trixie) | linux 6.12.85-1 | DSA-6238-1 |
| Ubuntu 22.04 / 24.04 | 아직 패치된 커널 없음 — USN-8226-1을 통한 kmod 완화 | USN-8226-1 |
| SLES 12 SP5 | kernel-default 4.12.14-122.299.1 | SUSE-SU-2026:1669-1 |
| SLES 15 SP5 | kernel-default 5.14.21-150500.55.144.1 | SUSE-SU-2026:1670-1 |
| SLES 15 SP6 | kernel-default 6.4.0-150600.23.92.1 | SUSE-SU-2026:1671-1 |
| SLES 15 SP7 | kernel-default 6.4.0-150700.53.40.1 | SUSE-SU-2026:1669-1 |
| SLES 16.0 | kernel-default 6.12.0-160000.29.1 | SUSE 권고 |
| Debian / Ubuntu / SLES | 대기 중 | 대기 중 |
| 키 | 유형 | 의미 |
|---|
copy_fail.status | int | 0=안전 · 1=취약 · 2=알 수 없음 |
copy_fail.detail | str | 사람이 읽을 수 있는 Copy Fail 판정 |
dirty_frag.status | int | 0=안전 · 1=취약 · 2=알 수 없음 |
dirty_frag.detail | str | 사람이 읽을 수 있는 Dirty Frag 판정 |
| 배포판 | Copy Fail | Dirty Frag |
|---|