sec17br/CVE-2026-31431-Copy-Fail
GitHub: sec17br/CVE-2026-31431-Copy-Fail
用于评估 Linux 主机是否受 CVE-2026-31431 内核本地权限提升漏洞影响,并提供检测、缓解和内核更新的一站式 Bash 脚本。
Stars: 2 | Forks: 0
# CVE-2026-31431 - 验证与缓解脚本
本仓库记录了一个 Bash 脚本,用于评估 Linux 主机(尤其是 Ubuntu)是否受 `CVE-2026-31431` 影响,并通过阻止加载 `algif_aead` 模块来实施简单的缓解措施。
语言版本:
- 英语:`README.md`
- 葡萄牙语:`README.pt-BR.md`
该脚本支持三种模式:
- `--check`:收集主机信息并对当前状态进行分类。
- `--mitigate`:创建 `modprobe` 规则以阻止加载易受攻击的模块,并尝试卸载该模块。
- `--update`:通过 `apt` 运行内核软件包升级。
## 关于该漏洞
`CVE-2026-31431`,公开称为 `Copy Fail`,是 Linux 内核中与 `algif_aead` 模块相关的一个本地权限提升漏洞,该模块通过 `AF_ALG` 实现了内核用户空间 crypto API 的 AEAD 接口。
实际上,该问题允许低权限本地用户滥用此子系统内存处理路径中的逻辑缺陷,进而将影响升级为完全破坏系统完整性。由 `kernel.org` 发布并反映在 NVD 中的评分为 `CVSS 7.8`,向量字符串为 `AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H`,这意味着攻击需要本地执行权限,但对机密性、完整性和可用性有极高的影响。
### 引入与披露时间
- 易被利用的根本原因于 `2017` 引入内核,当时向 `algif_aead` 添加了一项就地优化。
- 该 CVE 于 `2026 年 4 月 22 日` 在 NVD 上发布。
- 该问题以 `Copy Fail` 为名并附带公开的概念验证代码进行了更广泛的公开披露,发生于 `2026 年 4 月 29 日`。
- 主要的上游修复已于 `2026 年 4 月 1 日` 提交,早于面向最终用户的广泛披露。
### 利用原理
根据已发布的技术公告,该缺陷依赖于以下几点的组合:
- 内核的 `AF_ALG` 接口
- `algif_aead` 模块
- 2017 年引入的就地操作优化
- 将此接口与 `splice()` 链接使用
其实际结果是,本地进程能够对可读文件的页缓存支持页面进行微小的受控写入。在有利条件下,这足以将有限的本地立足点转化为 `root` 权限提升。
### 对企业的影响
真正的风险不仅仅是“运行了存在漏洞的 Linux 内核”,而是允许低信任度的本地代码触达此内核路径。在企业环境中,这通常意味着以下环境的暴露风险更高:
- 多用户服务器
- 跳板机和堡垒机
- CI/CD 运行器
- 运行不受信任代码的容器化工作负载
- Kubernetes 集群
- 承载自动化、代理、插件或第三方任务的虚拟机
如果攻击者已经拥有某种形式的本地执行权限,即使没有 `root` 权限,此 CVE 也可能成为入侵主机的下一步。在实践中,这扩大了以下风险:
- 服务器被完全接管
- 本地二进制文件或制品被篡改
- 凭据、token 和驻留的机密信息被盗
- 向其他资产的横向移动
- 破坏流水线和构建链
### `algif_aead` 模块的用途
`algif_aead` 是内核用户空间 crypto 接口 (`AF_ALG`) 的一部分。它允许应用程序通过套接字使用内核密码学原语,特别是 `AEAD` (Authenticated Encryption with Associated Data) 操作。
对于大多数标准服务器工作负载而言,此模块通常不是必需的。根据 CERT-EU 发布的缓解指导,禁用 `algif_aead` 作为临时缓解措施:
- 不应影响 `dm-crypt` 或 `LUKS`
- 不应影响 `kTLS`
- 不应影响 `IPsec/XFRM`
- 不应影响标准使用下的 `OpenSSL`、`GnuTLS`、`NSS` 或 `SSH`
另一方面,禁用它可能会影响:
- 明确配置为使用 `afalg` 引擎的应用程序
- 直接打开 `AF_ALG` 套接字的软件
- 通过内核 crypto API 使用 `aead`、`skcipher` 或 `hash` 的自定义集成
换言之,对于大多数企业主机,阻止该模块通常影响较小。但在应用设备、自定义加密栈或高度优化的软件路径中,应在推出前验证其影响。
### 禁用该模块的运维影响
阻止该模块可立即降低暴露风险,但也需要权衡:
- 依赖 `AF_ALG` 的应用程序可能无法启动,或可能失去内核支持的加密加速功能
- 自定义工作负载可能仅在运行时失败,而不是在启动时失败
- 如果模块已被加载,只有在成功卸载或重新启动后,缓解措施才算完全生效
对于生产环境,更安全的做法是在受控的维护窗口内应用缓解措施,然后验证关键应用程序是否正常。
### 推荐的永久修复方案
将模块列入黑名单仅仅是临时缓解措施。永久修复方案是:
1. 安装发行版供应商提供的已修补内核
2. 重新启动主机,以便实际加载新内核
3. 验证主机不再被报告为受影响
4. 然后再决定是否将该模块继续保留在黑名单中
其他建议措施:
- 优先对具有本地用户、容器或不受信任代码执行能力的主机进行补丁修复
- 在适用的情况下,在容器和流水线中使用 `seccomp` 限制 `AF_ALG` 套接字的创建
- 审查 `afalg` 或内核 crypto API 被显式使用的位置
- 维护内核版本和待重启主机的清单
- 将 CI/CD 运行器和 Kubernetes 节点视为高优先级
## 脚本检查内容
该脚本会检查:
- 主机的主机名
- 正在运行的内核版本
- 通过 `/etc/os-release` 获取的操作系统信息
- 是否存在 `algif_aead` 模块
- 该模块当前是否已加载
- 该模块是否被 `modprobe` 规则阻止
- 主机是否需要重启 (`/var/run/reboot-required`)
- 在可用时,通过 `pro fix CVE-2026-31431 --dry-run` 报告的 Ubuntu Pro 状态
基于上述内容,它将返回以下分类之一:
- `PATCHED_OR_NOT_AFFECTED`
- `LIKELY_NOT_VULNERABLE`
- `MITIGATED`
- `VULNERABLE_MODULE_LOADED`
- `POTENTIALLY_VULNERABLE`
- `UNKNOWN`
## 分类逻辑
概述:
- 如果 Ubuntu 工具指示主机未受影响或已修复,则状态变为 `PATCHED_OR_NOT_AFFECTED`。
- 如果当前内核中不存在 `algif_aead` 模块,状态趋于 `LIKELY_NOT_VULNERABLE`。
- 如果模块存在但已被阻止加载且未加载,状态变为 `MITIGATED`。
- 如果 Ubuntu 指示主机受影响且模块已加载,状态变为 `VULNERABLE_MODULE_LOADED`。
- 如果模块存在且可加载,但无法确认补丁状态,状态变为 `POTENTIALLY_VULNERABLE`。
## 依赖项
- Bash
- `modinfo`
- `modprobe`
- `lsmod`
- `awk`
- `grep`
- `hostname`
- `uname`
- 用于 `--update` 的 `apt-get`
- 以非 root 用户身份运行时需要 `sudo`
- 可选 `pro`,用于丰富在 Ubuntu 上的分析
## 用法
如果脚本文件名为 `check_cve_2026_31431.sh`:
```
chmod +x check_cve_2026_31431.sh
./check_cve_2026_31431.sh --check
```
### 默认检查
```
./check_cve_2026_31431.sh --check
```
示例输出:
```
Host: srv-app-01
OS: Ubuntu 24.04 LTS
Kernel: 6.8.0-58-generic
CVE: CVE-2026-31431
Module exists: 1
Module loaded: 0
Module blocked: 1
Ubuntu affected: yes
Fix available: yes
Reboot required: 0
Status: MITIGATED
Reason: algif_aead exists but is blocked and not loaded
```
### JSON 输出
```
./check_cve_2026_31431.sh --check --json
```
示例:
```
{"host":"srv-app-01","os":"Ubuntu 24.04 LTS","kernel":"6.8.0-58-generic","cve":"CVE-2026-31431","module":"algif_aead","module_exists":1,"module_loaded":0,"module_blocked":1,"ubuntu_affected":"yes","fix_available":"yes","reboot_required":0,"status":"MITIGATED","reason":"algif_aead exists but is blocked and not loaded"}
```
此输出对自动化、资产盘点和合规性流水线非常有用。
## 缓解措施
`--mitigate` 模式会创建以下文件:
```
/etc/modprobe.d/disable-algif_aead-CVE-2026-31431.conf
```
包含以下内容:
```
install algif_aead /bin/false
blacklist algif_aead
```
之后,脚本会尝试使用以下命令从内存中移除该模块:
```
modprobe -r algif_aead
```
用法:
```
./check_cve_2026_31431.sh --mitigate
```
如果用户不是 `root`,脚本将尝试使用 `sudo`。
## 更新
`--update` 模式运行:
```
apt-get update
apt-get install --only-upgrade -y 'linux-image-*' 'linux-modules-*' 'linux-aws*'
```
用法:
```
./check_cve_2026_31431.sh --update
```
此模式尝试在基于 Debian 和 Ubuntu 的系统上升级与内核相关的软件包。在其他环境中,此步骤可能不适用。
## 帮助
```
./check_cve_2026_31431.sh --help
```
输出:
```
Usage: ./check_cve_2026_31431.sh [--check|--mitigate|--update] [--json]
```
## 重要限制
- 该脚本使用启发式方法。它不能证明漏洞已被利用;它只是评估暴露程度和缓解状态。
- `ubuntu_affected` 和 `fix_available` 字段依赖于 `pro` 命令的存在。
- `--update` 步骤使用针对 Ubuntu 和 Debian 的软件包匹配模式,可能无法涵盖所有自定义内核。
- 在某些发行版上,模块可能存在,但其行为与脚本预期的不同。
- 阻止该模块在某些环境中可能需要重启,以保证状态的一致性。
## 推荐工作流
1. 运行 `--check` 评估主机。
2. 如果模块可用且未应用补丁,运行 `--mitigate`。
3. 运行 `--update` 或应用官方供应商更新。
4. 如果需要,重启主机。
5. 运行 `--check --json` 验证最终状态并保留证据。
## 备注
为了发布的清晰性,脚本最好使用具有描述性的名称,例如:
```
check_cve_2026_31431.sh
```
## 致谢
资料整理与发布,致谢 `SEC17`。
官方网站:
- `https://sec17.com`
标签:AF_ALG, algif_aead, Copy Fail, CVE-2026-31431, CVSS 7.8, Linux内核安全, LPE, modprobe, Web报告查看器, 内存管理缺陷, 内核模块屏蔽, 子域名枚举, 安全基线, 安全渗透, 应用安全, 教学环境, 数字取证, 本地提权, 漏洞缓解, 系统加固, 系统安全, 系统运维, 网络安全, 自动化脚本, 隐私保护