一个轻量、依赖极少的 Bash 脚本,用于判断你的 Linux 系统是否容易受到 Copy Fail 本地权限提升漏洞(CVE-2026-31431)的影响。
该脚本是只读的:它绝不会利用该漏洞,不会加载内核模块,也不会修改系统。
Copy Fail 是 Linux 内核 authencesn AEAD 加密模板中的一个逻辑缺陷,可通过 AF_ALG(algif_aead)套接字接口从用户空间触达。
| 字段 | 值 |
|---|---|
| CVE | CVE-2026-31431 |
| 披露时间 | 2026-04-29 |
| CVSS v3.1 | 7.8(高危) |
| 类型 | 本地权限提升 |
| 受影响组件 | crypto/authencesn + crypto/algif_aead |
| 引入时间 | 2017 年(algif_aead.c 中的原地 AEAD 优化) |
| 主线修复 | 提交 a664bf3d603d,合并于 2026-04-01 |
非特权本地用户可以触发一次确定性的、受控的 4 字节写入,写入目标是其可读取的任何文件的页缓存。一个公开的概念验证程序(732 字节的 Python)利用该原语覆盖 setuid 二进制文件,从而在几乎所有 2017 年以来发布的主流发行版上获取 root 权限。
任何 Linux 发行版,只要其搭载的内核构建于 2017 年之后且启用了 algif_aead,均受影响。已确认受影响的发行版系列包括:
# Download the script
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# Make it executable
chmod +x check-copy-fail.sh
# Run it
./check-copy-fail.sh
或克隆仓库:
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
脚本不需要 root 权限。以你的普通用户身份运行能获得对攻击面最真实的评估,因为这正是攻击者所处的上下文。
脚本执行三项相互独立的检查,并将结果合并为一个判定结果。
它会读取 /etc/os-release 和 uname -r 的输出,然后将当前运行的内核与发行版安全团队发布的官方修复版本进行比较。该版本表目前覆盖:
如果你的发行版不在表中,脚本将回退到下面的运行时检查。
algif_aead 模块状态脚本在不修改任何内容的情况下检查以下四项:
lsmod)modinfo)/etc/modprobe.d、/usr/lib/modprobe.d 或 /run/modprobe.d 中是否被列入黑名单/boot/config-<uname> 或 /proc/config.gz 中是否为内建(builtin)即使内核未打补丁,一个被列入黑名单、未加载且非内建的模块也能关闭攻击面。
AF_ALG 套接字可达性最可靠的信号是攻击者实际能看到的情况。脚本使用一个极小的 Python 探针(socket.socket(AF_ALG, SOCK_SEQPACKET, 0) 后跟 bind() 到 authencesn(hmac(sha256),cbc(aes)) AEAD 模板),以确认在非特权上下文中能否创建并绑定 AF_ALG 套接字。该探针会创建、绑定并立即关闭套接字,不会留下任何可利用的痕迹。
如果未安装 python3,则跳过探针,判定结果仅依赖检查 1 和检查 2。
对于流水线、配置管理或大规模主机扫描,可传入 --json 参数:
./check-copy-fail.sh --json
示例输出:
{
"verdict": "vulnerable",
"distro_id": "ubuntu",
"distro_version_id": "24.04",
"kernel": "6.8.0-31-generic",
"patched_version": "",
"kernel_status": "unknown",
"module_loaded": 0,
"module_builtin": 0,
"module_available": 1,
"module_blacklisted": 0,
"af_alg_status": "reachable"
}
这是唯一完整的修复方式。更新后请重启,以确保新内核真正运行起来。
# Debian / Ubuntu
sudo apt update && sudo apt full-upgrade && sudo reboot
# RHEL / AlmaLinux / Rocky / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# openSUSE / SLES
sudo zypper refresh && sudo zypper update && sudo reboot
# Amazon Linux 2023
sudo dnf upgrade --releasever=latest && sudo reboot
algif_aead如果你目前无法立即重启到已修复的内核,请将该易受攻击的模块列入黑名单。这会影响任何合法使用 AF_ALG AEAD 密码算法的应用程序(在大多数服务器上很少见——请先在预发布环境中验证)。
# Persist the blacklist across reboots
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# Unload it from the running kernel right now
sudo rmmod algif_aead 2>/dev/null || true
如果模块是内建的,列入黑名单将不起作用,但可以禁用其 initcall。此时必须重启。
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
对于容器化工作负载,还应在你的 seccomp 配置文件中屏蔽 AF_ALG 套接字族,这样即使容器被攻破,也无法触及内核攻击面。
== System information ==
[INFO] Distribution : Ubuntu 24.04.2 LTS (ubuntu 24.04)
[INFO] Kernel : 6.8.0-31-generic
== Check 1 / 3 — Kernel version ==
[WARN] No vendor-fixed kernel version is recorded for ubuntu 24.04.
[WARN] Falling back to runtime mitigation checks below.
== Check 2 / 3 — algif_aead kernel module ==
[WARN] algif_aead is not loaded but can be autoloaded on demand (no blacklist found).
== Check 3 / 3 — AF_ALG socket reachability ==
[VULN] AF_ALG sockets are reachable from this unprivileged context.
== Verdict ==
[VULN] This system appears to be VULNERABLE to CVE-2026-31431.
[VULN] Apply the vendor kernel update or blacklist algif_aead as a temporary mitigation.
uname -r 的输出。如果你运行的是树外(out-of-tree)或重新编译的内核,版本比较可能无法反映修复是否真的被移植(backport)。AF_ALG 报告为 blocked_permission——宿主机内核本身可能仍然易受攻击。MIT —— 可自由使用、修改和分发。无任何担保。
| 发行版 | 已修复内核(≥) |
|---|
| AlmaLinux / RHEL / Rocky / CentOS 8 | 4.18.0-553.121.1.el8_10 |
| AlmaLinux / RHEL / Rocky / CentOS 9 | 5.14.0-611.49.2.el9_7 |
| AlmaLinux / RHEL / Rocky / CentOS 10 | 6.12.0-124.52.2.el10_1 |
| Ubuntu 26.04+("Resolute") | 不受影响 |
| Ubuntu 18.04 – 25.10 | 滚动更新,参见 apt |
| Debian(所有套件) | 滚动更新,参见 DSA |
| 判定结果 | 退出码 | 含义 |
|---|
patched | 0 | 正在运行的内核等于或高于厂商修复版本。 |
mitigated | 0 | AF_ALG 已被阻止,且模块未加载。 |
likely_mitigated | 0 | 模块已被列入黑名单且未加载;无法进行实时探针检测。 |
vulnerable | 1 | 内核未打补丁,且 algif_aead / AF_ALG 可达。 |
unknown | 2 | 信号不足,无法判定。请视为潜在易受攻击。 |
not_applicable | 3 | 当前并非运行在 Linux 上。 |