haydenjames/CVE-2026-31431-check
GitHub: haydenjames/CVE-2026-31431-check
针对Linux内核algif_aead本地提权漏洞(CVE-2026-31431)的只读检测脚本,可快速评估内核模块状态、AF_ALG可达性及缓解措施是否生效,并输出明确的检查结论与修复建议。
Stars: 6 | Forks: 0
# CVE-2026-31431 检查
用于 `algif_aead` 本地提权漏洞([CVE-2026-31431](https://access.redhat.com/security/cve/CVE-2026-31431))的只读检查工具。
它会检查内核配置、模块状态、AF_ALG 套接字的可达性以及您已采取的任何缓解措施,然后输出检查结论。它不会运行漏洞利用代码。
我写这个脚本是因为在这个 CVE 公布时,我需要扫描几十台机器,但不想部署配置管理变更。发布出来,希望能帮别人省下二十分钟的时间。

## 快速运行
固定到某个发布标签,因此即使 `main` 分支发生变动也不会影响你:
```
curl -fsSL https://raw.githubusercontent.com/haydenjames/CVE-2026-31431-check/v1.0.1/cve-2026-31431.sh | bash
```
如果你想先查看代码(在生产环境中这是明智之举):
```
curl -fsSLO https://raw.githubusercontent.com/haydenjames/CVE-2026-31431-check/v1.0.1/cve-2026-31431.sh
less cve-2026-31431.sh
chmod +x cve-2026-31431.sh && ./cve-2026-31431.sh
```
`-q` 提供单行摘要,适用于批量fleet运行。`-h` 查看帮助。退出码:0 表示正常,1 表示存在漏洞,2 表示未知。
## 批量 (Fleet) 使用方法
`-q` 为每台主机打印一行摘要,因此你可以通过管道将其传递给任何现有的远程执行工具:
```
# parallel-ssh
parallel-ssh -h hosts.txt -i 'bash -s -- -q' < cve-2026-31431.sh
# ansible
ansible all -m script -a "cve-2026-31431.sh -q"
```
如果你的工具会按状态聚合结果,退出码(0 正常,1 存在漏洞,2 未知)也同样适用。
## 环境要求
需要 bash 4+,以及常用的 `awk`/`grep`/`sed`/`lsmod`/`modprobe`。如果系统中有 `python3`,它还会测试 AF_ALG 套接字的可达性;如果没有,则跳过该检查。检查本身不需要 root 权限。但应用缓解措施需要 root 权限。
## 检查内容
1. **`algif_aead` 状态。** 已内建、可加载模块、已加载或不存在。读取 `/boot/config-*` 或 `/proc/config.gz`,如果不可用则回退到 `lsmod`。
2. **AF_ALG 套接字。** 用户空间是否可以实际打开它。检测 seccomp 和 LSM 阻断(在 Python 可用时使用)。
3. **缓解措施。** 查找 modprobe 黑名单文件,并通过 `modprobe -n -v` 验证黑名单是否实际生效。还会标记在网络上流传的有问题的 `DefaultRestrictAddressFamilies` systemd `[Manager]` 技巧——该指令只在单元 (units) 中有效,不能用于 `system.conf.d`。报告 SELinux 和 AppArmor 的状态。
4. **内核包与正在运行的内核对比。** 捕获已安装修补过的内核包但尚未重启进入该内核的情况。
## 检查结论
- **OK** — AF_ALG 不可达,或该模块不存在,或你的黑名单已生效。
- **REBOOT NEEDED** — 已安装修补过的内核,但你仍在运行旧内核。
- **VULNERABLE** — 模块已加载且未安装修补过的内核,或者模块已内建到内核中但有可用的修补包。
- **LIKELY PATCHED** — 模块已加载,但当前运行的内核已是最新版本。脚本无法内省已加载的模块来区分已修复版本和易受攻击版本,因此此结论取决于你的包管理器。请对照你的发行版 CVE 跟踪器进行确认。
- **AT RISK** — 模块可加载,且没有任何措施阻止它。
- **WAITING ON VENDOR PATCH** — 内核已是最新版本,但 `algif_aead` 已内建。这是尽力而为的判断;它依赖于 `dnf check-update` 的退出码,该退出码可能由于不相关的原因(如网络问题、过期的元数据)而非零。不要在没有查阅发行版跟踪器的情况下就认为你只能等待。
## 临时缓解措施
如果模块是可加载的(未内建):
```
echo 'install algif_aead /bin/false' | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
```
如果 `rmmod` 提示“module is in use”(模块正在使用中),说明系统中有程序正在主动使用 AF_ALG(某些 VPN、磁盘加密、加密用户空间工具)。不要强制卸载它。请打好补丁并重新启动。
如果 `algif_aead` 被编译到你的内核中,将其列入黑名单无济于事。只有更新内核才能修复它。
## 测试环境
AlmaLinux 8, AlmaLinux 9.7, CentOS 7 (TuxCare ELS), Ubuntu 22.04, Ubuntu 24.04。
## 讨论
- 论坛帖子:[CVE-2026-31431 — danger (linuxcommunity.io)](https://linuxcommunity.io/t/cve-2026-31431-danger/7383)
- 议题:[GitHub](https://github.com/haydenjames/CVE-2026-31431-check/issues)
## 致谢
塑造了 v1.0.1 版本的 Bug 报告:
- [u/throwaway234f32423df](https://www.reddit.com/user/throwaway234f32423df) — 指出 Ubuntu 的 `kmod` 黑名单更新未被检测到,导致在已打补丁的 Ubuntu 主机上出现错误的 VULNERABLE(存在漏洞)结论。
- [u/aliendude5300](https://www.reddit.com/user/aliendude5300) — 指出已就地修补的已加载模块仍会报告 VULNERABLE。
## 许可证
MIT — 参见 [LICENSE](LICENSE)。
标签:AF_ALG, algif_aead, AlmaLinux, Ansible自动化, Claude, CVE-2026-31431, CVE检测, Linux内核漏洞, Linux服务器安全, meg, osquery, RedHat, Root权限提升, Shell脚本, Web报告查看器, 信息安全, 关系图谱, 基线检查, 子域名枚举, 安全检测脚本, 库, 应急响应, 应用安全, 批量主机扫描, 无线安全, 本地提权, 漏洞缓解, 系统安全, 网络安全, 运维安全, 配置核查, 隐私保护