juliosuas/copyfail-guard

GitHub: juliosuas/copyfail-guard

针对Linux内核CVE-2026-31431「Copy Fail」漏洞的快速评估与缓解工具,可检查algif_aead暴露面、安装模块阻止配置并为容器添加seccomp加固规则。

Stars: 2 | Forks: 0

# CopyFail Guard [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/6fcfdf5bc7181938.svg)](https://github.com/juliosuas/copyfail-guard/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) ![Platform](https://img.shields.io/badge/platform-Linux-blue) ![Shell](https://img.shields.io/badge/shell-bash-4EAA25) ![No exploit code](https://img.shields.io/badge/exploit%20code-not%20included-important) ``` ______ ______ _ __ ______ __ / ____/___ ____ __ _/ ____/___ _(_) / / ____/_ ______ __________/ / / / / __ \/ __ \/ / / / /_ / __ `/ / / / / __/ / / / __ `/ ___/ __ / / /___/ /_/ / /_/ / /_/ / __/ / /_/ / / / / /_/ / /_/ / /_/ / / / /_/ / \____/\____/ .___/\__, /_/ \__,_/_/_/ \____/\__,_/\__,_/_/ \__,_/ /_/ /____/ ``` **快速、可审计的 Linux 暴露面评估和缓解工具,针对 CVE-2026-31431 "Copy Fail",在内核修复期间使用。** CopyFail Guard 帮助运维人员降低 Linux `algif_aead` / `AF_ALG` 问题的暴露面: - 在不使用漏洞代码的情况下安全评估暴露面 - 检查 `algif_aead` 是否可用、已加载、内置或已被阻止 - 安装持久的 `modprobe.d` 阻止配置并在安全时卸载模块 - 为 Docker、Podman 和 Kubernetes seccomp 配置文件添加 AF_ALG 拒绝规则 - 验证 AF_ALG 可达性,且不包含漏洞代码 ## 我是否受影响? 首先运行安全暴露检查: ``` sudo ./bin/copyfail-guard.sh assess ``` 如何解读结果: | 结果类别 | 含义 | 应对措施 | |---|---|---| | `EXPOSED_*` | `algif_aead` / AF_ALG 似乎可达或可加载 | 立即缓解,然后打补丁并重启 | | `PARTIALLY_MITIGATED_*` | 存在阻止配置,但已加载模块或重启状态仍需关注 | 安全重启或卸载,然后验证 | | `INTERIM_MITIGATED_*` | 本地缓解措施已启用 | 保持,但仍需打补丁和重启 | | `LOW_OBVIOUS_EXPOSURE_*` | 本地检查未发现明显的 `algif_aead` 暴露 | 仍需确认供应商补丁状态 | 如果您运行不受信任的容器、CI 任务、沙箱或多用户工作负载,还需测试该运行时环境内是否阻止了 AF_ALG 套接字创建: ``` python3 tools/afalg-socket-test.py ``` `PERMITTED` 不能证明成功利用,但能证明相关的用户空间加密 API 是可达的。对于防御性运营而言,这足以成为应用缓解措施的理由,同时您可以确认已打补丁内核的部署情况。 ## 这是否能证明漏洞? 不包含破坏性概念验证代码。这是一个功能,而非缺陷。 真正的 Copy Fail 漏洞利用概念验证需要验证内核内存/页缓存影响或权限提升。在公共缓解仓库中包含这些内容会使项目安全性降低,且难以在生产环境中部署。 CopyFail Guard 可以证明运维人员可以安全采取行动的以下事项: - 危险组件是否可用、已加载、内置或被阻止 - AF_ALG 套接字创建在目标运行时是否被允许 - 主机是否已有临时缓解措施 - 剩余需要的操作是卸载、重启、seccomp 还是供应商打补丁 要获得最终漏洞状态,请将此工具与供应商公告/软件包清单和重启证据结合使用。 ## 可用性和解决模式 本项目面向 Linux 系统管理员、DevSecOps 工程师、平台团队和事件响应人员。设计为克隆即用:核心主机工作流程不需要编译器、内核头文件、漏洞代码或第三方包管理器。 目标用户的高操作性体验:`doctor`、`assess`、`mitigate`、`verify`、`rollback` 和 `--json` 直接对应事件响应流程。普通用户的中等体验是必然的,因为这是内核/容器加固,仍需要 Linux 管理判断。 解决模式:**缓解,而非治愈**。CopyFail Guard 减少暴露面并验证控制措施。持久的修复仍然是供应商打补丁的内核加上重启。 ## 快速开始 克隆即用: ``` 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 ``` 容器 / 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 (...) ``` ## 为什么这很重要 Copy Fail 是 Linux 内核中的本地权限提升漏洞,位于 AF_ALG 用户空间加密 API 的 `algif_aead` 组件中。公开公告描述了一个页面缓存写入原语,可由非特权本地用户访问,在共享内核系统上尤其危险:Kubernetes 节点、CI/CD 运行器、多租户主机、代理沙箱和开发机。 正确的修复是包含上游回滚/修复的供应商内核更新,并重启进入打补丁的内核。CopyFail Guard 是该重启在全部设备上完成之前的防御性运营辅助工具。 ## 工具功能 | 领域 | 命令 | 用途 | |---|---|---| | 安全评估 | `assess` | 给出非漏洞利用的暴露结论、后续操作和自动化友好的退出码 | | 依赖检查 | `doctor` | 检查必需/可选工具并解释运行时限制 | | 主机检查 | `status` | 显示 OS/内核、模块可用性、加载状态、内置警告、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 示例 | ## 安装要求 核心主机命令: - Linux - `bash` - kmod 工具:`modinfo`、`modprobe`、`lsmod`、`rmmod`(如可用) - `grep`、`awk`、`mktemp`、`install` 可选的可见性工具: - `lsof` 或 `ss` 用于 AF_ALG 消费者检查 Seccomp 配置文件修补: - `seccomp-patch` 需要 `python3` 不需要漏洞代码、编译器、内核头文件或第三方包。 ## 安全评估 vs 概念验证 CopyFail Guard **不**包含漏洞利用概念验证。这是故意的。请参阅[这是否能证明漏洞?](#does-this-prove-vulnerability)。 相反,`assess` 执行安全运营检查: - 检测 `algif_aead` 是否可用、已加载、内置或被阻止 - 区分"临时缓解"和"实际解决" - 建议主机缓解、seccomp 或打补丁/重启 - 返回用于批量自动化的退出码 自动化 JSON: ``` sudo ./bin/copyfail-guard.sh assess --json ./bin/copyfail-guard.sh doctor --json ``` 退出码: | 代码 | 含义 | |---|---| | `0` | 本地检查显示低明显暴露 | | `1` | 临时缓解已启用,仍需打补丁/重启 | | `10` | 已暴露/有缓解可用 | | `11` | 部分缓解;需要重启或卸载 | | `12` | 内置模块路径;需要打补丁/重启 | | `20` | 未知评估状态 | ## 主机缓解详情 `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 路径上覆盖符号链接,并以安全权限原子写入文件。 ## 容器和 CI 加固 对于不受信任的工作负载,即使在打补丁主机时也用 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 ``` 然后引用它: ``` securityContext: seccompProfile: type: Localhost localhostProfile: profiles/copyfail-seccomp.json ``` 请参阅 `examples/kubernetes-seccomp-pod.yaml`。 ## 安全验证 本项目包含非漏洞利用的 AF_ALG 可达性测试: ``` python3 tools/afalg-socket-test.py ``` 它只尝试创建和关闭一个 `AFG` 套接字。它不会绑定加密操作、调用 `splice`、触碰 setuid 二进制文件、损坏页缓存或尝试权限提升。 结果: - `BLOCKED` 表示策略拒绝该进程的 AF_ALG。 - `PERMITTED` 表示该进程仍允许创建 AF_ALG 套接字。 - `UNSUPPORTED` 表示该运行时中 AF_ALG 不可用。 ## 命令 ``` copyfail-guard assess Safe exposure assessment, no exploit attempt copyfail-guard status Inspect host exposure indicators copyfail-guard doctor Check dependencies and runtime readiness copyfail-guard mitigate Disable algif_aead persistently and unload it copyfail-guard verify Verify host mitigation is active copyfail-guard rollback Remove CopyFail Guard's modprobe mitigation copyfail-guard seccomp-docker [FILE] Generate emergency AF_ALG-deny profile copyfail-guard seccomp-patch BASE OUT Patch existing seccomp profile safely copyfail-guard k8s-example Print Kubernetes seccomp example ``` 标志可以放在命令之前或之后: ``` --dry-run Show planned changes without writing files or unloading modules --yes Non-interactive confirmation --no-logo Disable ASCII banner --json Emit JSON for supported commands: assess, doctor ``` ## 什么不应该被破坏 在典型配置中,禁用 `algif_aead` 预计不会影响: - LUKS / dm-crypt - SSH - OpenSSL、GnuTLS、NSS 默认构建 - kTLS / 内核内 TLS - IPsec / XFRM - 正常的内核加密消费者 它可能会影响明确配置为使用 AF_ALG 引擎的应用程序或直接创建 AF_ALG 套接字的应用程序。首先检查: ``` sudo lsof | grep AF_ALG || true ss -xa | grep -i alg || true ``` ## 运维人员文档 - [事件响应运行手册](docs/incident-response-runbook.md) - [Seccomp 验证说明](docs/seccomp-validation.md) - [安全策略](SECURITY.md) - [变更日志](CHANGELOG.md) ## 可用性评级 当前目标受众:Linux 系统管理员、DevSecOps 工程师、平台团队和事件响应人员。 - 安装摩擦:低。克隆即用不需要标准 Linux 工具之外的包管理器;`python3` 仅在 `seccomp-patch` 时需要。 - 运维人员体验:高。`doctor`、`assess`、`mitigate`、`verify` 和 `rollback` 对应事件响应流程。 - 普通用户体验:中等。这是内核/容器加固;工具保持语言直接,但仍需要 Linux 管理判断。 解决评级:缓解,而非治愈。工具减少暴露面并验证控制措施;供应商内核更新 + 重启是最终解决方案。 ## 限制 CopyFail Guard **不能**: - 为您打补丁内核 - 证明您的具体内核构建是否可被利用 - 包含漏洞代码 - 保护已被入侵的 root 用户 - 取代 EDR、批量清单、供应商公告或重启规划 主机模块缓解对模块化 `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 套接字创建是否可达。 ### 为什么在主机缓解后还要在容器中阻止 AF_ALG? 纵深防御。容器和 CI 工作负载是共享内核上运行不受信任代码的常见地方。Seccomp 使这类攻击的第一步对该工作负载不可达。 ### 为什么修补现有 seccomp 配置文件而不是生成新的? 因为默认运行时配置文件包含许多加固决策。用最小的紧急配置文件替换它们可能会意外移除保护。`seccomp-patch` 保留您的基线并添加 AF_ALG 拒绝。 ## 参考资料 - NVD:CVE-2026-31431 - CERT-EU 公告:Linux 内核高危漏洞("Copy Fail") - copy.fail 公开技术公告 - Linux 上游修复/回滚:`crypto: algif_aead - Revert to operating out-of-place` ## 作者 由 **Julio César Suástegui Calderón** 构建。 安全工程、Linux 系统和实用的防御自动化。 ## 许可证 MIT
标签:AF_ALG, algif_aead, Chrome Headless, CopyFail, CVE-2026-31431, Docker安全, Kubernetes安全, Linux内核安全, Linux防护, modprobe, Podman, seccomp, Web截图, 内核模块, 反取证, 子域名突变, 安全评估, 安全资源, 容器安全, 应用安全, 暴露面评估, 漏洞修复, 漏洞缓解, 系统加固, 网络安全培训, 请求拦截