
Wazuh 4.14.4 CVE-2026-31431 (Copy Fail) 탐지 규칙 - authencesn 페이지 캐시 쓰기를 통한 Linux 로컬 권한 상승
Copy Fail 커널 LPE(로컬 권한 상승)용 탐지 엔지니어링 · Ubuntu / RHEL / SUSE / Amazon Linux 2023 / Kali
CVE-2026-31431은 Linux 커널의 authencesn 암호화 템플릿에 존재하는 로직 버그입니다. 이 취약점을 통해 권한이 없는 로컬 사용자는 경쟁 조건(race condition), 커널 오프셋, 또는 상승된 권한 없이도 시스템의 읽기 가능한 모든 파일의 페이지 캐시에 결정적이고 통제된 4바이트 쓰기를 수행할 수 있습니다.
표준 라이브러리 모듈(os, socket, zlib)만 사용하는 732바이트 Python 3.10+ 스크립트는 2017년 이후 출시된 모든 주요 Linux 배포판에서 루트 권한을 획득하는 데 악용됩니다.
디스크의 파일은 변경되지 않은 상태로 유지되므로 기존의 파일 무결성 모니터링(FIM)은 완전히 탐지할 수 없습니다.
Taeyang Lee(Theori / Xint) 가 Xint Code AI 도구의 지원을 받아 발견했습니다.
이 쓰기는 메모리 내 페이지 캐시만을 대상으로 합니다. 커널은 페이지를 더티(dirty)로 표시하지 않으므로 writeback 메커니즘이 디스크에 영구 저장하지 않습니다. 디스크의 바이너리는 원본과 바이트 단위로 동일하게 유지됩니다.
기존 FIM 방식:
디스크에서 파일 읽기 -> 해시 계산 -> 비교 -> 이상 없음 보고
Copy Fail 현실:
디스크의 파일 = 변경 없음
페이지 캐시 = 손상됨
FIM 결과 = 탐지 불가
유일하게 효과적인 탐지는 syscall 모니터링을 통한 행동 기반 탐지입니다. 이 저장소는 커널 syscall 수준에서 공격 체인을 탐지하는 프로덕션 검증된 Wazuh 규칙을 제공합니다.
1단계: socket(38, 5, 0) AF_ALG 소켓 - 권한 불필요
2단계: bind() authencesn에 바인딩 - 취약 코드 활성화
3단계: sendmsg() AAD 페이로드 제작 - 4~7번째 바이트 = 쓸 값
4단계: splice() [!] 트리거 - 페이지 캐시 페이지가 쓰기 가능한 SGL에 진입
5단계: recv() authencesn이 seqno_lo를 페이지 캐시에 기록
6단계: execve(/usr/bin/su) 손상된 setuid 바이너리가 UID 0으로 셸코드 실행
splice()가 핵심 단계입니다. 이 함수는 복사 없이 페이지 캐시 페이지를 AF_ALG 소켓의 쓰기 가능한 scatterlist로 전달합니다. 이는 2017년 algif_aead.c에 도입된 제자리(in-place) 최적화로, 파이프 버퍼의 페이지를 대상 SGL에서 재사용할 수 있게 만든 것입니다. authencesn.decrypt()가 실행되면 해당 페이지에 쓰기가 발생하며, 이 페이지가 바로 대상 파일의 페이지 캐시입니다.
커밋 72548b093ee3(2017년) 이후 커널을 탑재한 모든 Linux 배포판이 영향을 받습니다.
컨테이너 탈출: Copy Fail은 컨테이너 탈출 벡터이기도 합니다. 페이지 캐시는 컨테이너 경계를 포함하여 호스트의 모든 프로세스 간에 공유됩니다. Xint의 2부 문서에서 Kubernetes 악용에 대해 다룹니다.
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # Wazuh 탐지 규칙 8개 (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # auditd syscall 센서 규칙
│
├── sca/
│ └── cve_2026_31431.yml # SCA 정책 - 커널 버전 무관
│
└── docs/
├── pentlab_uid.png # PoC 실행 - Kali에서 루트 권한 획득
├── Rule-199604-TRIGs.png # 규칙 199604 - pentlab에서 80회 적중
├── Rule_199604_Wazuh_Server_only.png # 규칙 199604 - 첫 검증
├── Splice_-_Non-root_process.png # 규칙 199600/199601/199604 발동
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # 규칙 199603
├── Pentlab-PoC.png # pentlab 에이전트의 규칙 199603
├── exploit_chain_timeline.svg # 공격 체인
└── SCA_CVE-2026-31431.png # SCA 정책 점수 75%
두 개의 독립적인 계층 — 어느 것도 커널 버전에 의존하지 않습니다.
uid!=0 필터는 대화형 계정 외에도 서비스 계정(www-data, postgres, jenkins), 컨테이너, 로그인 세션이 없는 웹 셸까지 포함합니다.
Auditd 센서 규칙 (auditd/cve-2026-31431.rules):
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -k copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
sca/cve_2026_31431.yml을 통해 12시간마다 자동 구성 검사를 수행합니다. 커널 버전이 필요하지 않습니다.
엔지니어링 참고: 규칙 199600과 199601은 80700이 아닌 규칙 92600(Python 프로세스, 깊이 1)의 자식이어야 합니다. Wazuh 규칙 엔진은 이벤트당 하나의 체인 경로만 따릅니다. 탐지 규칙을 92600 아래 깊이 2에 배치하면 형제 규칙(예: 0850-audit_rules.xml의 92603-92606,
if_group=audit + exe=python도 일치)보다 체인 평가에서 우선적으로 승리합니다.
# Ubuntu / Debian / Kali
apt install auditd audispd-plugins -y
systemctl enable --now auditd
auditctl -s | grep enabled
# RHEL / Amazon Linux
yum install audit -y
systemctl enable --now auditd
# SUSE
zypper install audit -y
systemctl enable --now auditd
cp auditd/cve-2026-31431.rules /etc/audit/rules.d/
augenrules --load
auditctl -l | grep copy_fail
예상 출력:
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -F key=copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
규칙은 rules/local_rules.xml에 제공됩니다. 기존 /var/ossec/etc/rules/local_rules.xml에 내용을 병합하거나 독립 파일로 배포할 수 있습니다:
# 옵션 A - 독립 파일
cp rules/local_rules.xml /var/ossec/etc/rules/cve-2026-31431_rules.xml
# 옵션 B - local_rules.xml에 추가
cat rules/local_rules.xml >> /var/ossec/etc/rules/local_rules.xml
# 구문 검증 - 경고 0건으로 종료 코드 0이어야 함
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# 매니저 재시작
systemctl restart wazuh-manager
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
ossec.conf의 <sca> 블록 안에 추가:
<policies>
<policy>/var/ossec/etc/shared/default/cve_2026_31431.yml</policy>
</policies>
systemctl restart wazuh-manager
Wazuh가 auditd 로그를 수집하는지 확인:
<!-- <ossec_config> 안에 추가 -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>
# 필요한 경우 테스트 사용자 생성
useradd -m testuser 2>/dev/null || true
# 신호 1 생성 - AF_ALG 소켓
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# 신호 3 생성 - /usr/bin/su 실행
su - testuser -c "/usr/bin/su --help 2>/dev/null || true"
# auditd가 이벤트를 캡처했는지 확인
ausearch -k copy_fail_af_alg -ts recent 2>/dev/null | grep "key=\|exe=\|uid=" | head -5
# Wazuh가 알림을 생성했는지 확인
grep -E "199600|199602" /var/ossec/logs/alerts/alerts.log | tail -10
grep -E "31431|cve_2026" /var/ossec/logs/alerts/alerts.log | tail -10
예상 SCA 점수 (미완화 시스템): 75% (3개 통과 / 1개 실패 - algif_aead가 블랙리스트에 없음)
testuser (uid=1001)가 732바이트 PoC를 실행하여 루트 셸을 획득했습니다:

동일한 python 프로세스의 AF_ALG 소켓 + splice() - pid=46784 - 즉시 조사 필요:






Wazuh 대시보드 Discover 결과 (에이전트=pentlab, 오늘):
wazuh-analysisd -t: 종료 코드 0 - 경고 0건 - 규칙 8개 모두 로드됨.
rmmod algif_aead 2>/dev/null || true
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
이 조치는 dm-crypt/LUKS, kTLS, IPsec, OpenSSL, GnuTLS 또는 SSH에는 영향을 주지 않습니다.
배포판의 커널 업데이트를 통해 커널 커밋 a664bf3d603d를 적용하세요. 이 커밋은 algif_aead.c의 2017년 제자리 최적화를 되돌려 req->src(splice가 페이지를 전달하는 TX SGL)와 req->dst(사용자 버퍼인 RX SGL)를 분리합니다. 모든 주요 배포판에서 이 수정 사항을 제공하고 있습니다.
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
Kislley Rodrigues (m0us3r) Wazuh 앰배서더 | 탐지 엔지니어링 | 블루 팀
탐지 규칙, auditd 센서 구성 및 SCA 정책은 Wazuh 4.14.4, Ubuntu 24.04.2 LTS (커널 6.8.0-106-generic) 및 Kali GNU/Linux 2026.1 (커널 6.18.12+kali-amd64)에서 검증되었습니다.
| 출처 | 링크 |
|---|---|
| CISA, 적극적으로 악용되는 Linux 루트 접근 버그 CVE-2026-31431을 KEV에 추가 | https://thehackernews.com/2026/05/cisa-adds-actively-exploited-linux-root.html |
이 프로젝트는 Wazuh 앰배서더 프로그램의 일환으로 개발되었습니다.
Wazuh는 통합 XDR 및 SIEM 보호를 제공하는 무료 오픈소스 보안 플랫폼입니다. 자세한 내용은 wazuh.com에서 확인하세요.
| 리소스 | 링크 |
|---|
| 공식 CVE 사이트 | https://copy.fail/ |
| 기술 분석 문서 - Xint Research | https://xint.io/blog/copy-fail-linux-distributions |
| PoC - copy_fail_exp.py | https://github.com/theori-io/copy-fail-CVE-2026-31431/blob/main/copy_fail_exp.py |
| 커널 패치 - a664bf3d603d | https://github.com/torvalds/linux/commit/a664bf3d603d |
| 취약 커밋 - 72548b093ee3 | https://github.com/torvalds/linux/commit/72548b093ee3 |
| MITRE ATT&CK T1068 | https://attack.mitre.org/techniques/T1068/ |
| 배포판 | 커널 | 상태 |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | 루트 권한 확인됨 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | 루트 권한 확인됨 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | 루트 권한 확인됨 |
| SUSE 16 | 6.12.0-160000.9-default | 루트 권한 확인됨 |
| Kali GNU/Linux 2026.1 | 6.18.12+kali-amd64 | 루트 권한 확인됨 |
| 규칙 | 부모 | 신호 | 깊이 | 수준 |
|---|
| 80700 | decoded_as=auditd | auditd 앵커 (Wazuh 내장) | 0 | 0 |
| 92600 | 80700 | Python 프로세스 실행 (Wazuh 내장) | 1 | 0 |
| 199600 | 92600 | AF_ALG 소켓 - python 체인 | 2 | 10 |
| 199601 | 92600 | splice() syscall - python 체인 | 2 | 10 |
| 199604 | 199601 + if_matched=199600 | 공격 체인 - python (동일 pid/120초) | 3 | 15 |
| 199602 | 80700 | /usr/bin/su 실행 | 1 | 6 |
| 199603 | 80700 | modprobe/kmod 실행 | 1 | 12 |
| 199605 | 80700 | AF_ALG 소켓 - 비-python | 1 | 10 |
| 199606 | 80700 | splice() syscall - 비-python | 1 | 10 |
| 199607 | 199606 + if_matched=199605 | 공격 체인 - 비-python (동일 pid/120초) | 2 | 15 |
| 규칙 |
|---|
| 적중 수 |
|---|
| 설명 |
|---|
| 199604 | 80 | 공격 체인 탐지됨 - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | 비루트 프로세스가 AF_ALG 소켓 생성 |
| 199603 | 28 | modprobe 실행 탐지됨 |
| 199602 | 12 | /usr/bin/su 실행됨 |
| 날짜 | 이벤트 |
|---|
| 2026-03-23 | Linux 커널 보안 팀에 취약점 보고 |
| 2026-03-24 | 초기 확인 접수 |
| 2026-03-25 | 패치 제안 및 검토 |
| 2026-04-01 | 메인라인 커널에 패치 커밋 (a664bf3d603d) |
| 2026-04-22 | CVE-2026-31431 지정 |
| 2026-04-29 | 공개 공개 - Xint 분석 문서 + PoC 게시 |
| Dirty Cow (2016-5195) | Dirty Pipe (2022-0847) | Copy Fail (2026-31431) |
|---|
| 경쟁 조건 | 예 - 여러 번 시도 필요 | 아니요 | 아니요 - 결정적 로직 |
| 시스템 충돌 가능 | 예 | 아니요 | 아니요 |
| 이식성 | 제한적 | 버전별 상이 | 2017년 이후 모든 배포판 |
| 익스플로잇 크기 | 킬로바이트 (C) | 수백 바이트 | 732바이트 (Python 표준 라이브러리) |
| FIM 탐지 | 가능 | 가능 | 불가능 |
| 검사 |
|---|
| 제목 |
|---|
| 위험도 |
|---|
| 31431001 | algif_aead가 메모리에 로드되지 않음 | 치명적 |
| 31431002 | modprobe.d를 통해 algif_aead 비활성화 | 높음 |
| 31431003 | auditd 활성 및 실행 중 | 높음 |
| 31431004 | CVE-2026-31431 센서 규칙 배포됨 | 높음 |
| 알려진 악용 취약점 카탈로그 | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| CVE-2026-31431 - crypto: algif_aead - 제자리(out-of-place) 운영으로 되돌림 | https://www.cve.org/CVERecord?id=CVE-2026-31431 |