mym0us3r/COPY-FAIL-Detection-with-Wazuh-4.14.4
GitHub: mym0us3r/COPY-FAIL-Detection-with-Wazuh-4.14.4
针对 CVE-2026-31431(Copy Fail)Linux 本地提权漏洞提供基于 Wazuh 的 syscall 行为检测规则和 SCA 安全配置评估策略,解决传统 FIM 因漏洞仅篡改页缓存而完全失效的检测盲区问题。
Stars: 0 | Forks: 0
# 使用 Wazuh 4.14.4 检测 COPY FAIL - CVE-2026-31431





## 什么是 Copy Fail?
CVE-2026-31431 是 Linux 内核 `authencesn` 加密模板中的一个逻辑漏洞。它允许任何无特权的本地用户对系统上任何可读文件的**页缓存执行确定性的、受控的 4 字节写入**——无需竞态条件、内核偏移或提升的权限。
一个仅使用标准库模块(`os`、`socket`、`zlib`)的 **732 字节 Python 3.10+ 脚本**利用了该漏洞,可以在自 2017 年以来发布的所有主要 Linux 发行版上获取 root 权限。
**磁盘上的文件保持不变**,这使得传统的文件完整性监控(FIM)完全失效。
## 官方参考
| 资源 | 链接 |
|---|---|
| 官方 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/ |
## 为什么 FIM 会失效 - 为什么会有这个代码库
写入仅针对内存中的页缓存。内核从不将该页标记为脏页,因此回写机制从不将其持久化到磁盘。磁盘上的二进制文件与原始文件在字节级别上保持完全一致。
```
Traditional FIM approach:
read file from disk -> compute hash -> compare -> no anomaly reported
Copy Fail reality:
on-disk file = UNCHANGED
page cache = CORRUPTED
FIM result = BLIND
```
**唯一有效的检测方式是基于行为的**,通过 syscall 监控来实现。本代码库提供了经过生产验证的 Wazuh 规则,可在内核 syscall 级别检测漏洞利用链。
## 漏洞利用链
```
Step 1: socket(38, 5, 0) AF_ALG socket - no privileges required
Step 2: bind() Bind to authencesn - activates vulnerable code
Step 3: sendmsg() Craft AAD payload - bytes 4-7 = value to write
Step 4: splice() [!] TRIGGER - page cache pages enter writable SGL
Step 5: recv() authencesn writes seqno_lo into page cache
Step 6: execve(/usr/bin/su) Corrupted setuid binary runs shellcode as UID 0
```
`splice()` 是关键步骤。它将页缓存页面直接传送到 AF_ALG socket 的可写 scatterlist 中,而无需进行复制——这是 `algif_aead.c` 在 2017 年进行的一项原地优化,使得管道缓冲区中的页面可以在目标 SGL 中被重用。当 `authencesn.decrypt()` 运行时,它会向这些页面写入数据,而这些页面恰好就是目标文件的页缓存。
## 受影响的发行版
| 发行版 | 内核 | 状态 |
|---|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | 已确认获取 ROOT |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | 已确认获取 ROOT |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | 已确认获取 ROOT |
| SUSE 16 | 6.12.0-160000.9-default | 已确认获取 ROOT |
| Kali GNU/Linux 2026.1 | 6.18.12+kali-amd64 | 已确认获取 ROOT |
所有自提交 `72548b093ee3`(2017 年)以来发布内核的 Linux 发行版均受影响。
## 代码库结构
```
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # 8 Wazuh detection rules (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # auditd syscall sensor rules
│
├── sca/
│ └── cve_2026_31431.yml # SCA policy - kernel-version independent
│
└── docs/
├── pentlab_uid.png # PoC execution - root obtained on Kali
├── Rule-199604-TRIGs.png # Rule 199604 - 80 hits on pentlab
├── Rule_199604_Wazuh_Server_only.png # Rule 199604 - first validation
├── Splice_-_Non-root_process.png # Rules 199600/199601/199604 firing
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # Rule 199603
├── Pentlab-PoC.png # Rule 199603 on pentlab agent
└── SCA_CVE-2026-31431.png # SCA policy score 75%
```
## 检测架构
两个独立的层——均不依赖于内核版本。
### 第 1 层 - 行为检测 (auditd + Wazuh)
`uid!=0` 过滤器涵盖了交互式账户之外的用户:服务账户(`www-data`、`postgres`、`jenkins`)、容器以及没有登录会话的 Web shell。
**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
```
### 第 2 层 - 漏洞暴露面 (SCA 策略)
通过 `sca/cve_2026_31431.yml` 每 12 小时自动进行配置检查。无需特定内核版本。
### 规则链架构
| 规则 | 父规则 | 信号 | 深度 | 级别 |
|---|---|---|---|---|
| 80700 | decoded_as=auditd | auditd 锚点 (Wazuh 内置) | 0 | 0 |
| 92600 | 80700 | Python 进程执行 (Wazuh 内置) | 1 | 0 |
| **199600** | **92600** | AF_ALG socket - python 链 | **2** | **10** |
| **199601** | **92600** | splice() syscall - python 链 | **2** | **10** |
| **199604** | 199601 + if_matched=199600 | 漏洞利用链 - python (同 pid/120s) | 3 | **15** |
| **199602** | 80700 | /usr/bin/su 执行 | 1 | **6** |
| **199603** | 80700 | modprobe/kmod 执行 | 1 | **12** |
| **199605** | 80700 | AF_ALG socket - 非 python | 1 | **10** |
| **199606** | 80700 | splice() syscall - 非 python | 1 | **10** |
| **199607** | 199606 + if_matched=199605 | 漏洞利用链 - 非 python (同 pid/120s) | 2 | **15** |
## 部署
### 步骤 1 - 安装 auditd
```
# 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
```
### 步骤 2 - 部署 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
```
### 步骤 3 - 部署 Wazuh 检测规则
规则在 `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 退出且零警告
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# 重启 manager
systemctl restart wazuh-manager
```
### 步骤 4 - 部署 SCA 策略
```
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
```
在 `ossec.conf` 的 `` 块中添加:
```
/var/ossec/etc/shared/default/cve_2026_31431.yml
```
```
systemctl restart wazuh-manager
```
### 步骤 5 - 配置 ossec.conf localfile
确保 Wazuh 采集了 auditd 日志:
```
audit
/var/log/audit/audit.log
```
## 验证
### 快速测试(无漏洞利用 - 仅 syscall)
```
# 如果需要,创建一个测试用户
useradd -m testuser 2>/dev/null || true
# 生成 SIGNAL 1 - AF_ALG socket
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# 生成 SIGNAL 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 生成的 alerts
grep -E "199600|199602" /var/ossec/logs/alerts/alerts.log | tail -10
```
### 验证 SCA 结果
```
grep -E "31431|cve_2026" /var/ossec/logs/alerts/alerts.log | tail -10
```
预期 SCA 评分(未缓解的系统):**75%**(3 项通过 / 1 项失败 - algif_aead 未被列入黑名单)
## 生产验证证据
### PoC 执行 - 在 Kali 上获取 Root (pentlab)
`testuser (uid=1001)` 执行了 732 字节的 PoC 并获取了 root shell:

### 规则 199604 - 检测到漏洞利用链 (pentlab, 80 次命中)
来自同一 Python 进程的 AF_ALG socket + splice() - pid=46784 - 需要立即调查:

### 规则 199604 - 首次验证 (Wazuh 服务器, pid=53447)

### 规则 199600 / 199601 / 199604 - splice() 和 AF_ALG 触发

### 规则 199603 - 检测到 modprobe 执行 (93 次命中)

### 规则 199603 - pentlab 代理 (35 次命中)

### SCA 策略 - 评分 75% (3 项通过 / 1 项失败)

**Wazuh 仪表板 Discover 结果 (agent=pentlab, 今日)**:
| 规则 | 命中次数 | 描述 |
|---|---|---|
| 199604 | 80 | 检测到漏洞利用链 - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | 由非 root 进程创建的 AF_ALG socket |
| 199603 | 28 | 检测到 modprobe 执行 |
| 199602 | 12 | /usr/bin/su 已执行 |
`wazuh-analysisd -t`:exit 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`。它还原了 2017 年在 `algif_aead.c` 中的原地优化,将 `req->src`(TX SGL,splice 传送页面的位置)与 `req->dst`(RX SGL,用户缓冲区)分离开来。所有主要发行版都在发布此修复。
```
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
```
## 披露时间线
| 日期 | 事件 |
|---|---|
| 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 stdlib) |
| FIM 检测 | 可能 | 可能 | 不可能 |
## SCA 策略摘要
| 检查项 | 标题 | 风险 |
|---|---|---|
| 31431001 | algif_aead 未加载到内存中 | 严重 |
| 31431002 | algif_aead 已通过 modprobe.d 禁用 | 高 |
| 31431003 | auditd 处于活跃并运行状态 | 高 |
| 31431004 | 已部署 CVE-2026-31431 传感器规则 | 高 |
## 作者
**Kislley Rodrigues (m0us3r)**
Wazuh Ambassador | 检测工程 | 蓝队
## 致谢
- **Taeyang Lee (Theori / Xint)**,负责发现、撰写报告以及协调披露 CVE-2026-31431
- **Wazuh 团队**,提供了开源 SIEM/XDR 平台及 Ambassador 计划
- **Xint Research**,在 https://xint.io/blog/copy-fail-linux-distributions 提供的详尽技术细节
*检测规则、auditd 传感器配置和 SCA 策略已在 Wazuh 4.14.4、Ubuntu 24.04.2 (内核 6.8.0-106-generic) 和 Kali GNU/Linux 2026.1 (内核 6.18.12+kali-amd64) 上通过验证。*
标签:0day, authencesn, Cloudflare, CVE, CVE-2026-31431, Exploit, FIM绕过, MITRE ATT&CK, Nday, Page Cache, Python提权脚本, Root权限, Wazuh, Web报告查看器, 内存恶意修改, 内核漏洞, 子域名枚举, 安全态势管理, 安全检测规则, 安全渗透, 密码学模板, 提权漏洞, 数字签名, 本地提权, 系统安全, 网络安全, 隐私保护, 页缓存