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 ![rules](https://img.shields.io/badge/wazuh_rules-8-brightgreen) ![sca](https://img.shields.io/badge/SCA_checks-4-blue) ![status](https://img.shields.io/badge/status-production--validated-success) ![mitre](https://img.shields.io/badge/MITRE-T1068-red) ![cve](https://img.shields.io/badge/CVE-2026--31431-critical) ## 什么是 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: ![PoC - 在 Kali 上获取 Root](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/f8122d51d6091011.png) ### 规则 199604 - 检测到漏洞利用链 (pentlab, 80 次命中) 来自同一 Python 进程的 AF_ALG socket + splice() - pid=46784 - 需要立即调查: ![规则 199604 - pentlab 80 次命中](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/4c55da4734091012.png) ### 规则 199604 - 首次验证 (Wazuh 服务器, pid=53447) ![规则 199604 - Wazuh 服务器](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/4b5d88f2d8091013.png) ### 规则 199600 / 199601 / 199604 - splice() 和 AF_ALG 触发 ![Splice 和 AF_ALG - 非_root_进程](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/b83473ee96091014.png) ### 规则 199603 - 检测到 modprobe 执行 (93 次命中) ![Modprobe - 可能的 algif_aead 加载尝试](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/44c987a07c091016.png) ### 规则 199603 - pentlab 代理 (35 次命中) ![Pentlab - 规则 199603](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8496df257c091017.png) ### SCA 策略 - 评分 75% (3 项通过 / 1 项失败) ![SCA CVE-2026-31431](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d06fa0760c091018.png) **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报告查看器, 内存恶意修改, 内核漏洞, 子域名枚举, 安全态势管理, 安全检测规则, 安全渗透, 密码学模板, 提权漏洞, 数字签名, 本地提权, 系统安全, 网络安全, 隐私保护, 页缓存