检测并(可选)缓解 Linux 主机上的 CVE-2026-31431(“Copy Fail”)漏洞。
该漏洞是一种可通过 AF_ALG 套接字族使用 authencesn(hmac(sha256),cbc(aes)) AEAD 变换触达的页缓存写入原语。此脚本复现了 Theori 演示的相同原语,但目标是自建的临时文件而非 setuid 二进制文件,因此测试本身是非破坏性的。
如果内核存在漏洞,脚本会提供缓解措施:通过 /etc/modprobe.d/disable-algif-aead.conf 将 algif_aead 加入黑名单并卸载该模块。彻底修复仍需更新内核。
os.splice)uv 用于以固定 Python 版本运行脚本sudo / root —— 应用缓解措施所需(写入 /etc/modprobe.d 并执行 rmmod);仅检测可在无特权下运行,但脚本会交互式询问是否进行修补sudo $(which uv) run --python 3.10 /path/to/copy_fail_test.py
使用 $(which uv) 是为了让 sudo 在 PATH 中保留正确的 uv 二进制文件。
脚本将:
AF_ALG + authencesn(hmac(sha256),cbc(aes)) 是否可触达。✅ NOT VULNERABLE —— 退出码 0🚨 VULNERABLE —— 提示应用缓解措施,然后重新测试⚠️ INCONCLUSIVE —— 退出码 2(例如 splice/sendmsg 调用出错)如果你接受提示,脚本将:
install algif_aead /bin/false 写入 /etc/modprobe.d/disable-algif-aead.conf。rmmod algif_aead。如果该模块已编译进内核(不可加载),则需要重启才能使黑名单生效。无论哪种情况,请在更新可用时修补内核 —— 黑名单仅移除了一个入口点。
手动等效操作:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
检测步骤写入的是其创建并随后删除的 tempfile.NamedTemporaryFile;不会触碰任何系统文件。缓解步骤是唯一会修改主机的部分,且仅在你于提示处确认后才会执行。