bryanvine/copy-fail-fix
GitHub: bryanvine/copy-fail-fix
针对 CVE-2026-31431 Linux 内核本地提权漏洞的多发行版自动化缓解脚本,优先安装补丁内核,无补丁时通过黑名单阻断漏洞利用路径。
Stars: 0 | Forks: 0
# copy-fail-fix
针对 [CVE-2026-31431 ("Copy Fail")](https://ubuntu.com/security/CVE-2026-31431) 的各发行版缓解脚本——这是一个 Linux 内核 `algif_aead` 本地提权漏洞,几乎影响了自 2017 年以来发布的所有发行版。
每个脚本要么从你的发行版软件源安装修补过的内核(如果有可用的),要么在无可用补丁时,将存在漏洞的 `algif_aead` 内核模块加入黑名单,以阻断漏洞利用路径,直到你可以重启并切换到修复后的内核。
## 太长不看
选择适合你发行版的脚本,检查其内容,然后以 root 身份运行。
```
# Ubuntu
sudo bash scripts/ubuntu.sh
# Debian
sudo bash scripts/debian.sh
# RHEL / Rocky / AlmaLinux / CentOS Stream
sudo bash scripts/rhel.sh
# Fedora
sudo bash scripts/fedora.sh
# Arch
sudo bash scripts/arch.sh
# openSUSE Leap / Tumbleweed
sudo bash scripts/opensuse.sh
# Alpine
sudo bash scripts/alpine.sh
# 其他 (Gentoo, NixOS, 不可变发行版, ...)
sudo bash scripts/universal.sh
```
如果你只想预览而不做任何更改,请先使用 `--check`。
## 每个脚本的作用
各发行版的脚本会运行以下算法;`universal.sh` 会跳过第 4–5 步。
1. **提权至 root。** 如果当前不是 root 用户,则在 `sudo` 下重新执行。
2. **确认发行版。** 除非使用 `--force`,否则拒绝在不匹配的主机上运行。
3. **读取 `uname -r`。**
4. **已修补?** 如果为你的发行版记录了 `PATCHED_KERNEL_VERSION`,并且你正在运行的内核版本等于或高于该版本,脚本将删除所有残留的缓解文件并退出。
5. **有可用补丁?** 询问你的包管理器。如果存在大于等于修补版本的候选内核,则会提示你(使用 `--yes` 跳过)进行安装。安装完成后,需要你手动重启。
6. **实施缓解措施。** 如果尚无修补过的内核可用(或者你拒绝了安装),脚本会在 `/etc/modprobe.d/cve-2026-31431.conf` 中写入 `blacklist algif_aead` 和 `install algif_aead /bin/true`,然后通过 `AF_ALG` socket-bind 探测来验证漏洞利用路径是否已被阻断。
## 补丁状态
`PATCHED_KERNEL_VERSION = PENDING` 表示维护者尚未记录该发行版的修复内核版本。每一行都可通过单行 PR 进行更新。
| 发行版 | 内核包 | 修复版本 | 最后检查时间 |
|---|---|---|---|
| Ubuntu (24.04) | `linux-image-generic` | PENDING | 2026-05-01 |
| Debian | `linux-image-amd64` | PENDING | 2026-05-01 |
| RHEL / Rocky / Alma | `kernel` | PENDING | 2026-05-01 |
| Fedora | `kernel` | PENDING | 2026-05-01 |
| Arch | `linux` | PENDING | 2026-05-01 |
| openSUSE | `kernel-default` | PENDING | 2026-05-01 |
| Alpine | `linux-lts` | PENDING | 2026-05-01 |
## 标志
| 标志 | 含义 |
|---|---|
| `-y`, `--yes` | 非交互式;跳过内核安装提示。 |
| `--force` | 绕过发行版不匹配检查。 |
| `--check` | 只读预览;打印将要执行的操作,不进行任何更改。 |
| `--undo` | 移除 `/etc/modprobe.d/cve-2026-31431.conf`。在安装了修补过的内核之后使用。 |
| `-h`, `--help` | 使用帮助信息。 |
## 手动验证缓解措施
脚本会自动运行此探测。要自行检查:
```
python3 - <<'PY'
import socket, errno
try:
s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
s.bind(("aead", "authencesn(hmac(sha1),cbc(aes))"))
print("BAD: bind succeeded — host is NOT mitigated")
s.close()
except OSError as e:
print(f"OK: bind blocked, errno={e.errno} ({e.strerror})" if e.errno == errno.ENOENT
else f"INCONCLUSIVE: errno={e.errno}")
PY
```
已缓解或已修补的主机将打印 `OK: bind blocked, errno=2 ...`。
## 撤销操作
在你的发行版发布了修复后的内核,并且你重启进入该内核后,请移除 modprobe 黑名单,以便合法使用 AF_ALG aead 的应用程序能恢复正常工作:
```
sudo bash scripts/.sh --undo
```
## 贡献
当你的发行版发布了修复后的内核时:
1. 编辑 `scripts/.sh` 中的一行——将 `PATCHED_KERNEL_VERSION` 设置为修复后的软件包版本(格式需与 `dpkg-query -W` / `rpm -q VERSION-RELEASE` / `pacman -Q` 返回的一致)。
2. 更新此 README 补丁状态表中的对应行。
3. 提交标题为 `: fix shipped in ` 的 PR。
## 免责声明
本仓库提供的是安全缓解工具。在将互联网上找到的任何脚本通过管道传递给 `sudo bash` 执行之前,请务必检查其内容。维护者在 MIT 许可证下不承担任何责任。
## 许可证
[MIT](LICENSE)。
标签:0day挖掘, AF_ALG, algif_aead模块, Alpine, Arch Linux, Bash Shell, CentOS, Copy Fail漏洞, CVE-2026-31431, cybersecurity, Debian, Fedora, Linux内核漏洞, openSUSE, osquery, RHEL, Web报告查看器, 内核安全, 内核模块黑名单, 安全渗透, 应用安全, 本地提权(LPE), 模块化设计, 漏洞缓解脚本, 端点安全, 系统安全加固, 自动化修复, 补丁管理, 运维安全, 逆向工具