______ ______ _ __ ______ __
/ ____/___ ____ __ _/ ____/___ _(_) / / ____/_ ______ __________/ /
/ / / __ \/ __ \/ / / / /_ / __ `/ / / / / __/ / / / __ `/ ___/ __ /
/ /___/ /_/ / /_/ / /_/ / __/ / /_/ / / / / /_/ / /_/ / /_/ / / / /_/ /
\____/\____/ .___/\__, /_/ \__,_/_/_/ \____/\__,_/\__,_/_/ \__,_/
/_/ /____/
快速、可审计的 Linux 暴露评估与缓解工具,用于 CVE-2026-31431 “Copy Fail”,在内核修补完成前提供防护。
CopyFail Guard 是一款面向 Linux 系统管理员、DevSecOps 工程师、平台团队及事件响应人员的防御性运维工具。它通过以下方式帮助降低 Linux algif_aead / AF_ALG 问题的暴露风险:
algif_aead 是否可用、已加载、内建或已被阻止modprobe.d 阻止规则,并在安全时卸载模块最终修复:安装供应商打过补丁的内核并重启。 本工具覆盖了从漏洞披露到全面补丁部署之间的运维空白。
/etc/modprobe.d/99-copyfail-guard.conf,回滚时仅删除该文件。seccomp-patch 在现有的 Docker/Podman/Kubernetes seccomp 配置文件中添加 AF_ALG 拒绝规则,而不是替换您的运行时加固措施。assess --json 以及文档化的退出码支持大规模扫描、SIEM 捕获和变更管理证据。如果您在 Linux 主机上,需要快速获得答案:
git clone --depth 1 https://github.com/juliosuas/copyfail-guard.git
cd copyfail-guard
sudo ./bin/copyfail-guard.sh doctor
sudo ./bin/copyfail-guard.sh assess
如果判定为已暴露且 algif_aead 为模块化:
sudo ./bin/copyfail-guard.sh mitigate --yes
sudo ./bin/copyfail-guard.sh verify
对于可重复安装,请固定一个发布标签:
git clone --branch v0.3.0 --depth 1 https://github.com/juliosuas/copyfail-guard.git
当新版本发布时,请将 v0.3.0 替换为最新的标签版本。
首先运行安全暴露检查:
sudo ./bin/copyfail-guard.sh assess
结果解读说明:
如果您运行不受信任的容器、CI 任务、沙箱或多用户工作负载,还需测试在该运行时内 AF_ALG 套接字创建是否被阻止:
python3 tools/afalg-socket-test.py
PERMITTED 并不证明成功利用,但它证明相关用户空间密码学 API 是可访问的。对于防御性运维而言,这足以在您确认修补内核部署之前应用缓解措施。
不包含破坏性的概念验证代码。这不是缺陷,而是一个特性。
真正的 Copy Fail 漏洞利用验证需要验证内核内存/页面缓存影响或权限提升。在公开的缓解仓库中包含此类代码会使项目变得更不安全,且在生产环境中更难部署。
CopyFail Guard 证明了运维人员可以安全采取行动的内容:
关于最终漏洞状态,请将此工具与供应商公告/软件包清单及重启证据结合使用。
CopyFail Guard 是 缓解措施,而非治愈手段。它减少暴露并验证临时控制措施。持久的修复仍是供应商修补内核并重启。
该工具有意设计为“克隆即运行”模式用于事件响应:核心主机工作流无需编译器、内核头文件、漏洞利用代码或第三方包管理器。python3 用于 --json 输出、seccomp-patch 以及非利用性的 AF_ALG 套接字测试。
克隆并运行:
git clone https://github.com/juliosuas/copyfail-guard.git
cd copyfail-guard
chmod +x bin/copyfail-guard.sh
sudo ./bin/copyfail-guard.sh doctor
sudo ./bin/copyfail-guard.sh assess
sudo ./bin/copyfail-guard.sh mitigate --yes
sudo ./bin/copyfail-guard.sh verify
可选系统安装:
git clone https://github.com/juliosuas/copyfail-guard.git
cd copyfail-guard
sudo ./scripts/install.sh
sudo copyfail-guard status
安装器支持固定源和目标路径,用于受控部署:
sudo env COPYFAIL_GUARD_REF=v0.3.0 ./scripts/install.sh
当新版本发布时,请使用最新的标签版本作为 COPYFAIL_GUARD_REF。
容器 / CI 加固:
./bin/copyfail-guard.sh seccomp-patch docker-default.json copyfail-seccomp.json
docker run --security-opt seccomp=./copyfail-seccomp.json IMAGE
验证在受保护的容器内 AF_ALG 已被阻止:
docker run --rm \
--security-opt seccomp=./copyfail-seccomp.json \
-v "$PWD/tools:/tools:ro" \
python:3.12-alpine \
python /tools/afalg-socket-test.py
预期的受保护结果:
BLOCKED: socket(AF_ALG) denied by policy (...)
有关预期的判定、JSON 格式及容器验证结果,请参见 示例输出。
Copy Fail 是 Linux 内核 algif_aead 组件中的一个本地权限提升漏洞,该组件属于 AF_ALG 用户空间密码学 API。公开公告描述了一种可通过非特权本地用户访问的页缓存写入原语,在共享内核系统上尤其危险:Kubernetes 节点、CI/CD 运行器、多租户主机、代理沙箱及开发人员机器。
正确的修复是供应商的内核更新(包含上游的回退/修复)并重启到修补后的内核。CopyFail Guard 是一个防御性运维助手,用于填补重启完成之前的窗口期。
核心主机命令:
bashmodinfo、modprobe、lsmod、rmmod(可用时)grep、awk、mktemp、install可选可见性工具:
lsof 或 ss 用于检查 AF_ALG 使用者Seccomp 配置文件修补:
python3 用于 --json、seccomp-patch 和 tools/afalg-socket-test.py不需要漏洞利用代码、编译器、内核头文件或第三方包。
CopyFail Guard 不包含漏洞利用概念验证代码。这是有意的设计。参见 这能证明漏洞存在吗?。
相反,assess 执行安全运维检查:
algif_aead 是否可用、已加载、内建或已被阻止自动化 JSON:
sudo ./bin/copyfail-guard.sh assess --json
./bin/copyfail-guard.sh doctor --json
退出码:
mitigate 写入:
/etc/modprobe.d/99-copyfail-guard.conf
内容:
# Managed by CopyFail Guard for CVE-2026-31431
install algif_aead /bin/false
blacklist algif_aead
然后尝试:
sudo rmmod algif_aead
如果模块正在使用中,rmmod 可能会失败。在这种情况下,持久阻止规则仍然保留;请停止 AF_ALG 使用者或在应用缓解措施后重启。
脚本拒绝覆盖其管理的 modprobe 路径中的符号链接,并以安全权限原子性地写入文件。
对于不受信任的工作负载,在修补主机的同时,使用 seccomp 阻止 AF_ALG 套接字创建。
推荐路径:修补现有的运行时 seccomp 基线,而不是替换它:
./bin/copyfail-guard.sh seccomp-patch docker-default.json copyfail-seccomp.json
与 Docker 一起使用:
docker run --security-opt seccomp=./copyfail-seccomp.json IMAGE
与 Podman 一起使用:
podman run --security-opt seccomp=./copyfail-seccomp.json IMAGE
如果您没有基线配置文件,仅限紧急情况下使用:
./bin/copyfail-guard.sh seccomp-docker ./copyfail-afalg-seccomp.json
生成的紧急配置文件会阻止 AF_ALG,但允许其他系统调用。将其视为有针对性的权宜之计,而非 Docker 正常默认 seccomp 加固的替代品。
对于 Kubernetes,将配置文件放在 kubelet seccomp 根目录下,通常是:
/var/lib/kubelet/seccomp/profiles/copyfail-seccomp.json
然后在 Pod 配置中引用它:
securityContext:
seccompProfile:
type: Localhost
localhostProfile: profiles/copyfail-seccomp.json
参见 examples/kubernetes-seccomp-pod.yaml。
本项目包含一个非利用性的 AF_ALG 可达性测试:
python3 tools/afalg-socket-test.py
它仅尝试创建并关闭一个 AF_ALG 套接字。不会绑定密码学操作、调用 splice、操作 setuid 二进制文件、破坏页面缓存或尝试提权。
结果:
BLOCKED:策略对该进程拒绝了 AF_ALG。PERMITTED:该进程仍被允许创建 AF_ALG 套接字。UNSUPPORTED:该运行时中 AF_ALG 不可用。CopyFail Guard 需要来自 Linux 主机、容器运行时、CI 运行器和 Kubernetes 节点的真实世界兼容性报告。如果您能安全测试,请使用经过脱敏处理的 doctor、assess --json、verify 或 AF_ALG 套接字测试输出,打开一个 兼容性报告 问题。
有用的报告有助于回答:
algif_aead 是内建的,只能通过补丁/重启解决参见 社区验证指南。
copyfail-guard assess 安全暴露评估,不进行利用尝试
copyfail-guard status 检查主机暴露指示器
copyfail-guard doctor 检查依赖项和运行时就绪状态
copyfail-guard mitigate 持久禁用 algif_aead 并卸载
copyfail-guard verify 验证主机缓解是否生效
copyfail-guard rollback 移除 CopyFail Guard 的 modprobe 缓解
copyfail-guard seccomp-docker [文件] 生成紧急 AF_ALG 拒绝配置文件
copyfail-guard seccomp-patch 基础 输出 安全地修补现有 seccomp 配置文件
copyfail-guard k8s-example 打印 Kubernetes seccomp 示例
标志可以放在命令之前或之后:
--dry-run 显示计划中的更改,而不写入文件或卸载模块
--yes 非交互式确认
--no-logo 禁用 ASCII 横幅
--json 对支持的命令(assess、doctor)输出 JSON
在典型配置中,禁用 algif_aead 预计不会影响:
它可能影响明确配置使用 AF_ALG 引擎的应用程序,或直接创建 AF_ALG 套接字的应用程序。请先检查:
sudo lsof | grep AF_ALG || true
ss -xa | grep -i alg || true
algif_aead 的主机缓解、针对不受信任工作负载的 seccomp 加固、以及回滚。CopyFail Guard 不会:
主机模块缓解仅适用于模块化的 algif_aead。如果 algif_aead 内建于您的内核中,modprobe.d 和 rmmod 无法禁用;必须进行补丁/重启,并且在补丁期间应使用 seccomp 保护不受信任的工作负载。
Seccomp 仅保护使用该配置文件启动的工作负载。现有正在运行的容器或 Pod 必须使用加固的配置文件重启。
sudo ./bin/copyfail-guard.sh rollback --yes
回滚仅删除此工具管理的文件。不会重新加载模块。仅当您明确需要它并且已接受风险或已修补内核时,才需手动 modprobe algif_aead。
不能。修补并重启仍然是最终解决方案。
不能。该项目有意避免利用行为。tools/afalg-socket-test.py 仅检查 AF_ALG 套接字创建是否可达。
纵深防御。容器和 CI 工作是未受信任代码在共享内核上运行的常见场所。Seccomp 使此类攻击的第一步对该工作负载不可达。
因为默认运行时配置文件包含许多加固决策。用最小的紧急配置文件替换它们可能会意外移除保护。seccomp-patch 保留您的基线并添加 AF_ALG 拒绝规则。
可以。从 doctor 和 assess --json 开始,在少量 Linux 样本上暂存缓解措施,然后分别推出主机缓解和 seccomp 配置文件更改。参见 大规模部署指南。
crypto: algif_aead - Revert to operating out-of-place由 Julio César Suástegui Calderón 构建。
专注于安全工程、Linux 系统及实用的防御性自动化。
MIT
| 判定系列 | 含义 | 操作 |
|---|
EXPOSED_* | algif_aead / AF_ALG 似乎可达或可加载 | 立即缓解,然后修补并重启 |
PARTIALLY_MITIGATED_* | 存在阻止规则,但已加载的模块或重启状态仍有关联 | 安全地重启或卸载,然后验证 |
INTERIM_MITIGATED_* | 本地缓解措施已生效 | 保留该措施,但仍需修补并重启 |
LOW_OBVIOUS_EXPOSURE_* | 本地检查未发现明显的 algif_aead 暴露 | 仍应确认供应商补丁状态 |
| 领域 | 命令 | 用途 |
|---|
| 安全评估 | assess | 给出非利用性的暴露判定、后续操作以及自动化友好的退出码 |
| 依赖检查 | doctor | 检查必需/可选工具,并解释运行时限制 |
| 主机检查 | status | 显示操作系统/内核、模块可用性、加载状态、内建警告、modprobe 阻止规则及明显的 AF_ALG 使用者 |
| 主机缓解 | mitigate | 写入 /etc/modprobe.d/99-copyfail-guard.conf 并尝试卸载 algif_aead |
| 验证 | verify | 如果模块已加载、内建或未被阻止,则明确报告失败 |
| 回滚 | rollback | 仅删除 CopyFail Guard 管理的 modprobe 文件 |
| 容器 | seccomp-patch | 修补现有的 seccomp 配置文件,拒绝 socket(AF_ALG, ...),同时保留正常的套接字使用 |
| 紧急配置 | seccomp-docker | 生成用于紧急情况的针对性 AF_ALG 拒绝配置文件 |
| Kubernetes | k8s-example | 打印一个使用 Localhost seccomp 的 Pod 示例 |
| 码 | 含义 |
|---|
0 | 本地检查未发现明显暴露 |
1 | 临时缓解已生效,但仍需补丁/重启 |
10 | 已暴露,可获得缓解 |
11 | 部分缓解;需要重启或卸载 |
12 | 内建模块路径;需要补丁/重启 |
20 | 未知评估状态 |