samanzamani/copy-fail-checker
GitHub: samanzamani/copy-fail-checker
一个纯Bash编写的只读脚本,用于检测Linux系统是否存在Copy Fail本地提权漏洞CVE-2026-31431。
Stars: 0 | Forks: 0
# Copy Fail 检查器 — CVE-2026-31431
一个轻量级、无外部依赖的 Bash 脚本,用于检测您的 Linux 系统是否存在 **Copy Fail** 本地提权漏洞(CVE-2026-31431)。
该脚本是**只读**的:它不会利用该漏洞,不会加载内核模块,也不会修改系统。
## 什么是 Copy Fail?
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 权限。
### 受影响群体
每个自 2017 年以来发布内核且启用了 `algif_aead` 的 Linux 发行版都会受到影响。已确认受影响的系列包括:
- Ubuntu 18.04 → 25.10(Ubuntu 26.04 "Resolute" 不受影响)
- Debian(所有当前支持的版本)
- RHEL / AlmaLinux / Rocky / CentOS Stream 8、9、10
- SUSE Linux Enterprise / openSUSE
- Amazon Linux 2023
- 大多数基于上述发行版的容器主机和托管 Kubernetes 节点镜像
## 快速开始
```
# 下载脚本
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# 使其可执行
chmod +x check-copy-fail.sh
# 运行它
./check-copy-fail.sh
```
或克隆仓库:
```
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
```
该脚本不需要 `root` 权限。以普通用户身份运行可以最真实地反映攻击面,因为这正是攻击者所拥有的上下文。
## 脚本检查内容
该脚本运行三个独立检查并将它们合并为单一判定。
### 1. 内核版本
它读取 `/etc/os-release` 和 `uname -r`,然后将正在运行的内核与发行版安全团队发布的官方修复版本进行比较。当前版本表覆盖:
| 发行版 | 修复的内核(≥) |
|---|---|
| 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 |
如果您的发行版不在表中,脚本将回退到下面的运行时检查。
### 2. `algif_aead` 模块状态
脚本检查三件事而不修改任何内容:
- 模块是否**当前已加载**(`lsmod`)
- 模块是否**可加载**(`modinfo`)
- 模块是否在 `/etc/modprobe.d`、`/usr/lib/modprobe.d` 或 `/run/modprobe.d` 中被**列入黑名单**
即使内核未修复,被列入黑名单且未加载的模块也会关闭攻击面。
### 3. `AF_ALG` 套接字可达性
最可靠的信号是攻击者实际看到的内容。脚本使用一个微小的 Python 探针(`socket.socket(AF_ALG, SOCK_SEQPACKET, 0)`)来查明 `AF_ALG` 套接字是否可以从无权限上下文创建。探针创建后立即关闭套接字——没有加密状态,没有 AEAD 操作,没有任何可利用的内容。
如果未安装 `python3`,则跳过探针,判定依赖于检查 1 和检查 2。
## 可能的判定
| 判定 | 退出代码 | 含义 |
|---|---|---|
| `patched` | `0` | 运行的内核版本等于或高于供应商修复版本。 |
| `mitigated` | `0` | `AF_ALG` 被阻止且模块未加载。 |
| `likely_mitigated` | `0` | 模块被列入黑名单且未加载;无法进行实时探针。 |
| `vulnerable` | `1` | 内核未修复且 `algif_aead` / `AF_ALG` 可达。 |
| `unknown` | `2` | 信号不足,无法确定。视为可能存在漏洞。 |
| `not_applicable` | `3` | 未运行在 Linux 上。 |
## 自动化 JSON 输出
对于流水线、配置管理或批量扫描,传递 `--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_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 加密的应用(在大多数服务器上很少见——首先在预发布环境中验证)。
```
# 在重启后保留黑名单
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# 立即从当前运行的 kernel 中卸载它
sudo rmmod algif_aead 2>/dev/null || true
```
对于容器化工作负载,还应在您的 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.
```
## 局限性
- 修复版本表仅覆盖上述系列。欢迎提交 PR 来扩展它。
- 脚本信任 `uname -r`。如果您运行的是非主线或重新构建的内核,版本比较可能无法反映修复是否实际被回移植。
- 实时容器 / 沙箱环境可能因为 seccomp 生效而报告 `blocked_permission`——主机内核本身可能仍然存在漏洞。
## 参考资料
- [CERT-EU 公告 2026-005](https://cert.europa.eu/publications/security-advisories/2026-005/)
- [Xint 披露:732 字节在每个主要 Linux 发行版上获取 root](https://xint.io/blog/copy-fail-linux-distributions)
- [AlmaLinux:CVE-2026-31431 补丁已发布](https://almalinux.org/blog/2026-05-01-cve-2026-31431-copy-fail/)
- [Ubuntu:Copy Fail 漏洞修复可用](https://ubuntu.com/blog/copy-fail-vulnerability-fixes-available)
- [Microsoft 安全博客:云环境中的 Copy Fail](https://www.microsoft.com/en-us/security/blog/2026/05/01/cve-2026-31431-copy-fail-vulnerability-enables-linux-root-privilege-escalation/)
- [Sophos:PoC 漏洞利用可用](https://www.sophos.com/en-us/blog/proof-of-concept-exploit-available-for-linux-copy-fail-cve-2026-31431)
- [SUSE 对 copy.fail 的响应](https://www.suse.com/c/suse-responds-to-the-copy-fail-vulnerability/)
- [The Hacker News 报道](https://thehackernews.com/2026/04/new-linux-copy-fail-vulnerability.html)
- [Bugcrowd:我们所知道的关于 Copy Fail 的信息](https://www.bugcrowd.com/blog/what-we-know-about-copy-fail-cve-2026-31431/)
- [The Register 报道](https://www.theregister.com/2026/04/30/linux_cryptographic_code_flaw/)
## 许可证
MIT——自由使用、修改和分发。无担保。
标签:AF_ALG, algif_aead, authencesn, Copy Fail, CVE-2026-31431, Linux内核安全, Privilege Escalation, TLS, 内核漏洞, 加密安全, 应用安全, 本地权限提升, 系统加固, 网络安全, 逆向工具, 防御工具, 隐私保护