CVE-2026-31431(Copy Fail)检测脚本,用于检查内核版本、补丁存在情况、内核配置、AF_ALG 套接字可用性、setuid 二进制文件及缓解措施,以确定 Linux 系统上的漏洞状态。
仅检测。可用的 PoC 已存在于 copy.fail/#exploit。 此脚本面向系统管理员和安全团队,用于确定自身是否受影响——或在修补后是否仍然受影响。
2026年4月29日,一个名为 Copy Fail(CVE-2026-31431)的漏洞由 Xint 代码研究团队公开披露。这是一个逻辑缺陷,自大约 2017年 起便悄然存在于 Linux 内核中——近十年之久——它允许任何非特权本地用户获取 root 权限。
不是"在特定条件下、靠点运气和顺风才能获取 root"。而是……直接获取 root。稳定可靠。几乎在所有主流 Linux 发行版上皆如此。
它影响 Ubuntu、Amazon Linux、RHEL、SUSE,以及任何在过去约8年内运行主流内核的系统。同一脚本,无需重新编译,无需针对各发行版进行调整。
是的,情况确实如听起来那么严重。
Linux 内核有一个加密子系统,非特权用户可通过 AF_ALG 套接字访问。其中有一种名为 splice() 的机制,可以将文件数据直接送入该子系统而无需复制——这意味着内核内存中缓存的文件副本("页缓存")最终会进入加密操作。
其中一种特定算法——authencesn,用于 IPsec 扩展序列号——有一个特性:它将输出缓冲区用作临时空间,并在应写入位置之外多写入4字节。通常情况下无害。但当来自 setuid 二进制文件(如 /usr/bin/su)的页缓存页面因 algif_aead.c 中2017年的"优化"而链接到该输出缓冲区时,这4字节会直接落入内核缓存的二进制文件副本中。
操作会以错误失败。内核永远不会将该页标记为脏页。磁盘上的文件不受影响。检查磁盘校验和的文件完整性工具看不到任何异常。
但页缓存才是被执行的。而 su 是 setuid root。
完整技术文章位于 xint.io,确实值得一读。
原始发布版本中的7项,加上为弥补检测缺口而新增的6项检查:
Bash 脚本覆盖相同的核心检测逻辑,但省略了3项 Python 特定检查:
Shell 脚本中不存在(与 Python 相比):
| 缺失的检查项 | 原因 |
|---|---|
| CONFIG_CRYPTO_USER_API_AEAD | 尚未实现——计划中 |
| Python os.splice 可用性 | 不适用于 shell 脚本 |
| root 用户警告 | 尚未实现——计划中 |
两个脚本都不会修复任何问题,也不会利用任何漏洞。它们只是如实告知你系统的真实状况,以便你采取行动。
# 克隆或下载脚本,然后:
python3 cve-2026-31431-detect.py
就这么简单。输出彩色报告,末尾附有摘要。
脚本在发现易受攻击条件时以非零码退出,适合在流水线中使用:
| 代码 | 含义 |
|---|---|
0 | 未发现易受攻击条件 |
1 | 发现一个或多个易受攻击条件 |
# 示例:若主机易受攻击则使 CI 步骤失败
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — block deployment"
elif [ $rc -ne 0 ]; then
echo "ERROR — script failed to complete (exit $rc)"
fi
CVE-2026-31431 'Copy Fail' — Vulnerability Detection
authencesn page cache corruption / local privilege escalation
Running as uid=1001, euid=1001
=== Kernel Version ===
[VULNERABLE] Kernel version
Reason : Kernel is in the vulnerable range (4.10 – 6.14)
Detail : Release: 6.12.0-124.45.1.el10_1 — patch status must be confirmed
=== CONFIG_CRYPTO_AUTHENC (Kernel Config) ===
[VULNERABLE] CONFIG_CRYPTO_AUTHENC
Reason : Built as module (=m): auto-loads on AF_ALG bind(); modprobe blacklist is the correct mitigation
=== CONFIG_CRYPTO_USER_API_AEAD (Kernel Config) ===
[VULNERABLE] CONFIG_CRYPTO_USER_API_AEAD
Reason : AF_ALG AEAD interface is a loadable module — unprivileged users can access the crypto subsystem via AF_ALG sockets
...
SYSTEM IS LIKELY VULNERABLE TO CVE-2026-31431
Recommended actions:
1. Apply your distribution's kernel update for CVE-2026-31431
2. Until patched, blacklist the module:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
NOTE: this is ONLY effective when CONFIG_CRYPTO_AUTHENC=m (module).
If CONFIG_CRYPTO_AUTHENC=y (built-in), patching is the only fix.
提供了一个配套的 Bash 脚本(cve-2026-31431-detect.sh),适用于没有 Python 或更倾向于使用 shell 原生工具的环境。它执行 13项检查中的10项——有关差异详情,请参阅上方的检查对比表。
# 基本运行
bash cve-2026-31431-detect.sh
# JSON 输出——适用于 SIEM 摄取、Ansible facts、日志聚合
bash cve-2026-31431-detect.sh --json > scan-results.json
# 静默模式——仅打印摘要(适用于 CI 日志)
bash cve-2026-31431-detect.sh --quiet
# 禁用 ANSI 颜色(适用于日志文件)
bash cve-2026-31431-detect.sh --no-colour
Shell 脚本使用相同的退出码(0 = 正常,1 = 易受攻击),并生成等效的 JSON 输出供流水线消费。当系统上存在 Python 3 时,shell 脚本会使用它执行实时的 AF_ALG 套接字测试;否则回退到内核配置推断。
真正的修复是修补内核。 请查看您发行版的安全公告。
| 发行版 | 查看位置 |
|---|---|
| Ubuntu | ubuntu.com/security/CVE-2026-31431 |
| RHEL / Amazon Linux | dnf update kernel |
| SUSE |
如果 CONFIG_CRYPTO_AUTHENC 检查报告为 =m(构建为模块而非内建),您可以将其加入黑名单:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
重要提示: 如果
CONFIG_CRYPTO_AUTHENC=y(内建),此缓解措施无效。在这种情况下,修补内核是唯一修复方法。脚本中的 CONFIG_CRYPTO_AUTHENC 检查会告诉您属于哪种情况。请注意,CONFIG_CRYPTO_AUTHENC是正确的内核配置键——它通过单一选项同时构建authenc和authencesn模块。
如果您正在使用 IPsec,此操作可能会产生影响——在全面部署前请先验证。
上游修复是此提交——它回退了 algif_aead.c 中2017年的原地 AEAD 优化,将源和目标的 scatterlist 分离,使页缓存页面不再可能落入可写目标中。
如果您在 Docker 容器、Kubernetes Pod 或其他容器环境中运行此脚本,脚本会发出警告:容器共享宿主内核。漏洞存在于内核中,而非容器镜像中。您必须评估并修补宿主。
# GitHub Actions
# 当脚本以退出码1退出时,该步骤将自然失败并阻止流水线。
# 无需额外配置——非零退出码默认使步骤失败。
- name: Check CVE-2026-31431
run: |
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — pipeline blocked"
exit 1
elif [ $rc -ne 0 ]; then
echo "ERROR — detection script failed to complete (exit $rc)"
exit $rc
fi
# Ansible
# 使用 playbook_dir 确保脚本路径正确解析。
# failed_when 检查任何非零退出(漏洞或脚本错误)。
- name: Check for CVE-2026-31431
script: "{{ playbook_dir }}/cve-2026-31431-detect.py"
register: cve_check
failed_when: cve_check.rc != 0
# Nagios / 监控检查(shell 脚本——原生支持退出码)
bash cve-2026-31431-detect.sh --quiet
# exit 0 = OK, exit 1 = CRITICAL (vulnerable)
# 用于 SIEM / 日志聚合的 JSON 输出(shell 脚本)
bash cve-2026-31431-detect.sh --json --quiet > /var/log/cve-2026-31431-$(hostname)-$(date +%Y%m%d).json
感谢 Theori 的 Taeyang Lee 提供原始研究洞见,以及 Xint 代码研究团队完成完整披露文章。
发现误报?有遗漏的发行版?有应检查的内核配置?欢迎提交 PR。目标是准确的信号,而不仅仅是吓人的红色文字。
此工具按原样提供,用于防御性安全目的。请仅将其指向您有权评估的系统。别乱来。
| # | 检查项 | 检查内容 |
|---|
| 1 | 内核版本 | 该内核是否处于受影响范围(4.10–6.14)? |
| 2 | 补丁存在性 | 修复提交是否实际存在于当前运行的内核中? |
| 3 | algif_aead 模块 | 易受攻击的模块是否已加载或可加载? |
| 4 | CONFIG_CRYPTO_AUTHENC (新增) | CONFIG_CRYPTO_AUTHENC 是内建(=y)还是模块(=m)?此单一选项同时构建 authenc 和 authencesn。内建意味着 modprobe 黑名单缓解措施无效。 |
| 5 | CONFIG_CRYPTO_USER_API_AEAD (新增) | AF_ALG AEAD 用户空间接口是否已编译进内核?若未编译,则整个利用路径在编译时即被关闭。 |
| 6 | AF_ALG 套接字 | 非特权用户当前能否打开一个? |
| 7 | Python os.splice | 纯 Python 利用路径是否可用? |
| 8 | Setuid 二进制文件 | 系统上存在的可读 setuid-root 目标扩展列表。 |
| 9 | 缓解措施 | AppArmor、SELinux、seccomp——已部署哪些? |
| 10 | 用户命名空间 (新增) | 是否启用了非特权用户命名空间?(不直接阻止 Copy Fail,但影响更广泛的本地提权攻击面。) |
| 11 | 透明大页 (新增) | THP 状态——可能影响页缓存对齐和利用可靠性。 |
| 12 | 环境检测 (新增) | Docker/容器/虚拟机上下文——容器共享宿主内核;需要修补的是宿主。 |
| 13 | root 用户警告 (新增) | 若以 root 身份运行则发出警告,因为多项检查对 root 用户会产生误报,无论非特权限制如何。 |
| # | 检查项 | 备注 |
|---|
| 1 | 内核版本 | |
| 2 | 补丁存在性 | |
| 3 | algif_aead 模块 | |
| 4 | AF_ALG 套接字 | 若可用则借助 Python 作为辅助;否则回退到内核配置推断 |
| 5 | Setuid 二进制文件 | 扩展列表,与 Python 版本相同 |
| 6 | 缓解措施 | AppArmor、SELinux、seccomp |
| 7 | CONFIG_CRYPTO_AUTHENC | |
| 8 | 用户命名空间 | |
| 9 | 透明大页 | |
| 10 | 环境检测 |
zypper update kernel-default |
| Debian | apt update && apt upgrade |
| 日期 |
|---|
| 事件 |
|---|
| 2026-03-23 | 报告给 Linux 内核安全团队 |
| 2026-03-24 | 确认收到 |
| 2026-03-25 | 提出并审查补丁 |
| 2026-04-01 | 修复提交至主线内核 |
| 2026-04-22 | 分配 CVE-2026-31431 |
| 2026-04-29 | 公开披露 |