作者/贡献者:Patrick Doyle(作者/维护者)、Effie Renard(合著者)、Kimberly-Lee Banks(合著者)、Chris F.(支持/代码审查)
AI 披露:Claude Code 用于编写测试文件、编写测试数据以及进行代码安全审查。所有编辑均由其中一位贡献者手动审核。
单个静态链接的 Go 二进制文件,用于对 Linux 主机暴露于 CVE-2026-31431 的风险进行分类。
该工具是被动式的。它不会利用该漏洞。机制探测(见下文安全声明)仅发出两次系统调用,且从不触及易受攻击的代码路径。
| 信号 | 来源 | 标志 |
|---|
| 内核版本与上游修复对比 | uname(2) | --kernel-version |
| 发行版变更日志提及该 CVE | apt/rpm/apk 或磁盘上的 changelog.Debian.gz | --changelog |
algif_aead 模块状态 | /proc/modules、modprobe.d、/lib/modules | --module |
| 易受攻击面是否可达 | socket(AF_ALG) + bind(authencesn(...)) | --mechanism |
| 是否编译进 vmlinux | /boot/config-$(uname -r) 或 /proc/config.gz | (属于 --module 的一部分) |
如果未提供任何检查标志,则全部四项都会运行。
| 模式 | 触发条件 | 使用场景 |
|---|---|---|
| 美化样式(默认) | TTY 标准输出,无 --format 覆盖,无 NO_COLOR 环境变量 | 交互式 Shell 运行 |
| 纯文本 | 非 TTY 标准输出,或 --format=text,或 NO_COLOR=1,或 --no-color | Shell 脚本、管道 |
| JSON | --format=json | Syslog/SIEM 接入、Shell 脚本 |
| 静默 | --quiet | 仅退出码(自动化/脚本) |
通过管道时强制美化:cvecheck --pretty | tee report.txt。
在 TTY 中强制纯文本:cvecheck --no-color 或 NO_COLOR=1 cvecheck。
该探测仅发出两次系统调用 socket(AF_ALG, SOCK_SEQPACKET, 0) 和 bind(fd, &SockaddrALG{Type:"aead", Name:"authencesn(hmac(sha256), cbc(aes))"}),随后执行 close(fd)。它不会执行用于密钥的 setsockopt、不会执行 accept、不会执行 sendmsg、不会执行 splice,也不会创建管道。易受攻击的代码路径需要将加密数据的 sendmsg 与来自页缓存支持的文件描述符的 splice 结合使用;这些操作均未发生,因此该漏洞无法被触发。
探测成功意味着该攻击面可达。内核是否仍包含该漏洞由内核版本 + 变更日志信号决定。
副作用:成功的 bind 会通过内核模块自动加载器自动加载 algif_aead。模块检查在机制探测之前运行,因此加载状态报告是探测前的状态。要完全抑制自动加载,请先对 algif_aead 进行黑名单设置。
| 代码 | 含义 |
|---|---|
0 | PATCHED / NOT_VULNERABLE / MITIGATED / LIKELY_NOT_EXPLOITABLE |
2 | VULNERABLE 或 MECHANISM_REACHABLE(部分扫描,未检查内核版本) |
3 | INCONCLUSIVE(信号不足) |
| 发行版 | 检测方式 | 内核包 | 备注 |
|---|---|---|---|
| Ubuntu / Debian / Mint / Pop!_OS | apt | linux-image-$(uname -r) | 优先从磁盘读取变更日志,避免签名内核上 apt changelog 的网络脆弱性 |
| RHEL / CentOS / Rocky / Alma / Fedora / Amazon Linux | rpm | kernel | 内置 algif_aead(CONFIG_..._AEAD=y);黑名单缓解措施无效 |
| Oracle Linux | rpm | kernel 或 kernel-uek | 通过 uname -r 中的 uek 子字符串检测 UEK |
| openSUSE / SLES | rpm | kernel-default | |
| Alpine | apk | linux-lts / linux-virt 等 | 根据发布后缀选择 flavor |
| Arch / CachyOS / Manjaro / Endeavour / Gentoo | 无 | 不适用 | 滚动/源码发行版:依赖内核版本检查 |
自动检测您的架构,将正确的二进制文件下载到 $(pwd),并根据发布的 SHA256SUMS 验证其 SHA-256:
curl -fsSL https://copyfail.pcdoyle.dev/install.sh | sh
该脚本在校验和不匹配时以非零状态退出,并删除损坏的文件。
为您的宿主机架构选择对应的二进制文件:
| 架构 | 二进制文件 |
|---|---|
Intel/AMD 64 位(x86_64) | cvecheck-linux-x86_64 |
ARM 64 位(aarch64) | cvecheck-linux-arm64 |
Intel/AMD 32 位(i?86) | cvecheck-linux-x86 |
运行前验证:
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/cvecheck-linux-x86_64
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
chmod +x cvecheck-linux-x86_64
make build # bin/cvecheck-linux-{x86_64,arm64,x86}
# SCP(SFTP) 到服务器:
scp ./bin/cvecheck-linux-x86_64 host:/tmp/ # 小于 4 MB,静态链接,无 glibc 依赖
# SSH:
ssh <host>
# 运行二进制文件:
/tmp/cvecheck-linux-x86_64 # 人类友好的美化输出。
/tmp/cvecheck-linux-x86_64 --format=json # 适合脚本、Syslog 和 SIEM
/tmp/cvecheck-linux-x86_64 --format=text # 适合脚本和管道
ssh <host> /tmp/cvecheck-linux-x86_64 # 直接运行默认使用 --format=text
ssh <host> /tmp/cvecheck-linux-x86_64 --format=json # 适合 Syslog/SIEM
将宿主机根目录挂载到可读位置并传递 --root:
docker run --rm -v /:/host:ro alpine /tmp/cvecheck --root /<host-path>
--root 控制所有磁盘查找(/etc/os-release、modprobe.d、/lib/modules、/boot/config-*、变更日志文件)。内核版本和机制探测仍通过 uname(2) 和 socket(AF_ALG, ...) 触及正在运行的内核。
按以下顺序解析(首个匹配者胜出):
PATCHED:发行版变更日志引用了该 CVE ID。NOT_VULNERABLE:运行中的内核 >= 上游修复版本。MITIGATED:algif_aead 已被列入黑名单且未加载且未编译进 vmlinux。LIKELY_NOT_EXPLOITABLE:AF_ALG 不可用且模块不在磁盘上。MECHANISM_REACHABLE:攻击面可达但未检查内核版本。VULNERABLE:内核在漏洞范围内且机制可达。INCONCLUSIVE:以上均不匹配。如果 --mechanism 与 --kernel-version 同时运行且两者均提示存在问题,则结果为 VULNERABLE 并附带修复提示。
algif_aead 列入黑名单。
echo 'blacklist algif_aead' | sudo tee /etc/modprobe.d/cve-2026-31431.conf
sudo rmmod algif_aead 2>/dev/null
CONFIG_CRYPTO_USER_API_AEAD=y 将该符号置于 vmlinux 内部。只有内核升级(或 kpatch 风格的实时补丁)才能解决暴露问题。该工具可检测到这一点。| 症状 | 原因 | 修复方法 |
|---|---|---|
changelog: error="apt: exit status 100 ... Changelog unavailable for linux-signed-amd64" | Debian/Ubuntu 签名内核;apt 镜像不提供源码包的变更日志 | 仅当磁盘上的文件缺失且镜像不可访问时才会出现该错误,请安装 apt-doc 或等待镜像更新。 |
module: ... config_src="" | 无法读取内核配置(无 /boot/config-*、无 /proc/config.gz、/boot 仅 root 可读) | 以 root 身份运行,或接受无法确定 BuiltIn 状态。判定仍可通过其他信号解析。 |
mechanism: error="EAFNOSUPPORT" | 内核未启用 CONFIG_CRYPTO_USER_API 编译,因此主机不会通过 AF_ALG 受到漏洞影响 | 判定将为 LIKELY_NOT_EXPLOITABLE。 |