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), 模块化设计, 漏洞缓解脚本, 端点安全, 系统安全加固, 自动化修复, 补丁管理, 运维安全, 逆向工具