用于应用(以及之后移除)针对 Linux 内核 AF_ALG / algif_aead 子系统中 CVE-2026-31431(“Copy Fail”)的 modprobe.d 缓解措施的 Ansible 角色。
已在 Debian 上测试。欢迎针对其他发行版、边缘情况或改进提交 Pull Request。
该角色会在 /etc/modprobe.d/ 中写入一个配置片段,阻止 algif_aead 内核模块被加载:
install algif_aead /bin/false
随后通过以下步骤验证缓解措施确实生效:
/boot/config-$(uname -r),如果 AEAD 已编译进内核(CONFIG_CRYPTO_USER_API_AEAD=y)则拒绝运行——modprobe.d 无法阻止内建代码。algif_aead 当前不在 lsmod 中。AF_ALG 套接字并尝试 bind() 到 aead/gcm(aes)。缓解措施生效后,bind 必须失败并抛出 FileNotFoundError。无需重启。
要还原(例如在已安装修补内核后),请设置 cve_2026_31431_state=absent。
在 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 install joltcan.cve_2026_31431
ansible-playbook -i <your-inventory> ~/.ansible/roles/joltcan.cve_2026_31431/playbook.yml
在修补内核运行后执行清理:
ansible-playbook -i <your-inventory> ~/.ansible/roles/joltcan.cve_2026_31431/playbook.yml -e cve_2026_31431_state=absent
- hosts: all
become: true
roles:
- role: joltcan.cve_2026_31431
欢迎提交 Issue 和 Pull Request——特别是:
algif_aead 可加载的非 Debian 发行版(Arch、Gentoo、Alpine 等)的经过测试的支持。algif_aead 的逻辑。MIT——请参阅 LICENSE。