joltcan/ansible-role-cve-2026-31431
GitHub: joltcan/ansible-role-cve-2026-31431
针对 Linux 内核 AF_ALG/algif_aead 子系统 CVE-2026-31431 漏洞的 Ansible 自动化缓解角色,通过 modprobe.d 禁用内核模块并提供多重验证。
Stars: 0 | Forks: 0
# ansible-role-cve-2026-31431
用于应用(以及后续移除)`modprobe.d` 缓解措施的 Ansible 角色,针对 Linux 内核的 AF_ALG / `algif_aead` 子系统中的
CVE-2026-31431 ("Copy Fail") 漏洞。
已在 Debian 上测试。非常欢迎提交针对其他发行版、边缘情况或改进的 Pull requests。
## 它的功能
此角色会将一个配置片段放入 `/etc/modprobe.d/`,以阻止加载 `algif_aead` 内核模块:
```
install algif_aead /bin/false
```
然后,它会通过以下步骤验证缓解措施是否实际生效:
1. 断言主机属于 Debian 系列(这是此项技术唯一可靠运行的环境——请参阅下文的警告)。
2. 读取 `/boot/config-$(uname -r)`,如果 AEAD 是内建在内核中的(`CONFIG_CRYPTO_USER_API_AEAD=y`),则拒绝运行——modprobe.d 无法阻止内建的代码。
3. 如果当前有任何进程保持 AF_ALG 套接字处于打开状态,则发出警告(这些进程会使模块一直驻留在内存中,直到它们释放该模块)。
4. 确认 `algif_aead` 当前不在 `lsmod` 中。
5. 运行一个小型 Python 脚本,打开一个 `AF_ALG` 套接字并尝试 `bind()` 到 `aead/gcm(aes)`。应用缓解措施后,绑定操作必定会失败并返回 `FileNotFoundError`。
无需重启。
若要还原(例如,在已修补的内核就绪后),请设置 `cve_2026_31431_state=absent`。
## 警告:modprobe.d 变通方法并非在所有地方都有效
在 oss-security 上流传的缓解措施——即将 `install algif_aead /bin/false` 放入 `/etc/modprobe.d/` 并执行 `rmmod` 移除该模块——**在 CloudLinux、AlmaLinux、RHEL 或任何其他基于 RHEL 家族的发行版上无效**,在将 AEAD 编译进内核的自定义内核上同样无效。
在这些系统上,`algif_aead` 是内建在内核中的(`CONFIG_CRYPTO_USER_API_AEAD=y`),因此:
- `modprobe.d` 规则无法阻止其加载(因为没有需要加载的对象——代码已经存在于内核映像中)。
- `rmmod algif_aead` 无法移除内建的代码。
这些命令看起来会执行成功,但系统并未发生任何改变,从而产生安全的假象。您可以通过以下命令确认您的内核是否受影响:
```
zgrep '^CONFIG_CRYPTO_USER_API_AEAD=' /boot/config-$(uname -r)
```
- `=m` → 模块,此角色可以进行缓解。
- `=y` → 内建,您需要更新内核并重启,或者购买 livepatch 订阅。此角色会检测到这一情况并拒绝运行。
## 变量
| 名称 | 默认值 | 备注 |
|------------------------|--------------------------------------------|--------------------------------------|
| `cve_2026_31431_state` | `present` | 设置为 `absent` 以移除缓解措施 |
| `cve_2026_31431_conf` | `/etc/modprobe.d/disable-algif_aead.conf` | 黑名单文件的路径 |
## 用法
### 从 Ansible Galaxy 获取(推荐)
```
ansible-galaxy install joltcan.cve_2026_31431
ansible-playbook -i ~/.ansible/roles/joltcan.cve_2026_31431/playbook.yml
```
在已修补的内核运行后进行清理:
```
ansible-playbook -i ~/.ansible/roles/joltcan.cve_2026_31431/playbook.yml -e cve_2026_31431_state=absent
```
### 从您自己的 playbook 运行
```
- hosts: all
become: true
roles:
- role: joltcan.cve_2026_31431
```
## 贡献
欢迎提交 Issue 和 pull request——特别是:
- 针对 `algif_aead` 可加载的非 Debian 发行版的测试支持(Arch, Gentoo, Alpine 等)。
- 在没有 AF_ALG 用户处于活动状态时,安全卸载已加载的 `algif_aead` 的逻辑。
- 用于 CI 的 Molecule 场景。
## 许可证
MIT — 详见 `LICENSE`。
标签:AF_ALG, algif_aead, Ansible, Ansible Role, Cutter, CVE-2026-31431, Debian, Linux内核漏洞, modprobe.d, 内核模块禁用, 子域名枚举, 安全防护, 漏洞修复, 漏洞缓解, 系统安全, 系统提示词, 网络安全, 网络安全培训, 自动化运维, 逆向工具, 隐私保护