monobrau/copyfailscan

GitHub: monobrau/copyfailscan

通过 SSH 批量盘点 Linux 主机内核版本与 algif_aead 模块状态,评估 CVE-2026-31431 本地提权漏洞的暴露风险并给出缓解建议。

Stars: 0 | Forks: 0

# CVE-2026-31431 (“Copy Fail”) LAN 姿态扫描器 `copyfail_scan.sh` 用于盘点你能够通过 **SSH** 访问的主机上的 **Linux 内核版本**、**`algif_aead` 存在情况**(根据探测结果分为已加载/可加载/内置),以及**简单的缓解措施**。它**不会**运行漏洞利用或概念验证代码。 **CVE 范围:** CVE-2026-31431 是内核加密用户空间 API (`algif_aead`) 中的一个**本地**提权漏洞。它本身并不是远程代码执行。请将凭据、凭据文件和扫描输出视为敏感信息。 **版本:** 当前版本 **[v1.1.0](https://github.com/monobrau/copyfailscan/releases/tag/v1.1.0)** (GitHub Releases)。请参阅下面的 **v1.1.0 版本改动**。 ### v1.1.0 版本改动 - **预认证:** 在运行 `sshpass` 之前,可选择通过 SSH **横幅**(以及可选的 **`nmap -sV -p22`**,需配合 `COPYFAIL_PREAUTH_NMAP=1`)跳过明显的非 Linux 目标。 - **更清晰的失败提示:** 区分**凭据错误**与**网络/DNS/TCP 错误**与**CREDS 文件不可读**;如果 `/etc/copyfail-creds` 仅限 root 访问,而你在没有 `sudo` 的情况下运行,将**不会静默退出**(脚本会在启动前检查**读取**权限;在 `ssh_try_host` 中**安全**地打开凭据文件)。 - **登录后:** 即使 SSH 连接成功,只要 `uname -s` ≠ `Linux`(例如 macOS/Windows Git Bash),就会提示 **`[SKIP - NOT LINUX]`**。 - **健壮性:** 移除了 SSH 循环内部泄漏的 **`set -e`**,该参数曾可能导致扫描在运行中途中止且无任何输出。 较早版本:[v1.0.0](https://github.com/monobrau/copyfailscan/releases/tag/v1.0.0)。 ## 依赖要求 | 组件 | 适用时机 | |-----------|------| | `bash` (4+), `ssh`, `sshpass` | 始终需要 | | `nmap` | 仅当 **TARGET** 为 **CIDR**(例如 `192.168.54.0/23`)**或**启用 **`COPYFAIL_PREAUTH_NMAP=1`**(可选的逐主机服务探测)时。如果你传递了 CIDR 但缺少 `nmap`,脚本将报错并退出。 | | 目标上可访问的 SSH | 始终需要(TCP 发现对 CIDR 扫描使用端口 **22**:`nmap -sn -PS22`) | 扫描**单个 IP 或主机名**不需要 `nmap`,**除非**你启用了 **`COPYFAIL_PREAUTH_NMAP=1`**。扫描**主机列表文件**不需要 `nmap` 进行发现(如果 `COPYFAIL_PREAUTH_NMAP=1`,则适用相同的例外情况)。 ## 预认证过滤(SSH 之前) 此 CVE 仅适用于 **Linux 内核**,因此脚本会尽量避免将凭据尝试浪费在明显的非 Linux SSH 服务器上。 1. **SSH 横幅(默认,快速)** — 打开 **TCP/22** 并读取 SSH 标识字符串(RFC 4253 第一行,无加密握手)。如果它匹配常见模式(**Windows** / Microsoft OpenSSH、**Cygwin**、许多**网络设备**),该主机将被报告为 **`[SKIP - PRE-AUTH]`**,并且**永远不会**运行 `sshpass`。 2. **可选的 `nmap` 服务探测** — **macOS** 和其他一些系统通常显示与 Linux 相同的通用 `SSH-2.0-OpenSSH_…` 横幅,因此无法仅通过横幅将它们区分开来。设置 **`COPYFAIL_PREAUTH_NMAP=1`** 可对每台主机运行 **`nmap -p22 -sV`**(较慢,需要 `nmap`),并跳过指纹文本表明为 **Windows** 或 **macOS/Apple** 的目标。 如果没有规则匹配,脚本将继续像以前一样执行正常的 SSH 流程。 ## 凭据文件 1. 复制示例文件,并**仅在运行扫描的机器上**编辑密钥: sudo cp copyfail-creds.example /etc/copyfail-creds sudo nano /etc/copyfail-creds 2. **格式:** 每行一个 `user:password`。只有**第一个** `:` 用于分隔用户名和密码(密码可以包含额外的 `:` 字符)。 3. **权限:** 除非文件模式为 **`600`**,否则脚本将拒绝运行: sudo chmod 600 /etc/copyfail-creds sudo chown root:root /etc/copyfail-creds # 可选 4. **谁可以读取它:** 如果文件属于 **root** 且模式为 `600`,则**只有 root 可以读取**它。请运行 **`sudo ./copyfail_scan.sh`**(如有需要,请设置 `CREDS_FILE`),**或者**执行 `sudo chown youruser:yourgroup /etc/copyfail-creds`,同时保持 **`chmod 600`**。 5. **清理:** 当你不再需要批量密码认证时,请移除 `/etc/copyfail-creds`。 ## 用法 ``` CREDS_FILE=/path/to/creds ./copyfail_scan.sh [TARGET] ``` **TARGET** (可选;默认为 **`192.168.54.0/23`**): - **CIDR** — 需要 `nmap`;使用 `nmap -sn -PS22` 发现活跃主机,然后逐一进行 SSH 连接。 - **单个 IP 或主机名** — 仅探测该主机。 - **主机列表文件路径** — 每行一个主机/IP;以 `#` 开头的行和空白行将被忽略;允许使用 UTF-8/Windows CRLF 换行符(`\r` 将被去除)。 ``` chmod +x copyfail_scan.sh # 默认 subnet(参见脚本默认值) CREDS_FILE=/etc/copyfail-creds sudo ./copyfail_scan.sh # 另一个 network CREDS_FILE=/etc/copyfail-creds sudo ./copyfail_scan.sh 192.168.1.0/24 # 主机列表(不需要 nmap) CREDS_FILE=/etc/copyfail-creds ./copyfail_scan.sh ./hosts.txt # 单个主机 CREDS_FILE=/etc/copyfail-creds ./copyfail_scan.sh 192.168.54.93 ``` **环境变量:** | 变量 | 默认值 | 含义 | |----------|---------|---------| | `CREDS_FILE` | `/etc/copyfail-creds` | `user:password` 文件的路径 | | `COPYFAIL_PREAUTH` | `1` | 如果为 `1`,则读取 22 端口上的 SSH 横幅,并在运行 `sshpass` 之前跳过明显的非 Linux 目标。设置为 `0` 以禁用。 | | `COPYFAIL_PREAUTH_NMAP` | `0` | 如果为 `1` 且安装了 `nmap`,则当横幅不足以判断需要跳过时,运行 `nmap -p22 -sV`(有助于检测 **macOS** 和某些 Windows 安装)。在大型子网上运行**较慢**。 | | `COPYFAIL_PREAUTH_VERBOSE` | `0` | 如果为 `1`,则将截断后的 SSH 横幅副本附加到 `[SKIP - PRE-AUTH]` 行(用于调试)。 | ``` # 示例:同时使用 nmap 跳过 macOS / 模棱两可的 OpenSSH banners(需要安装 nmap) COPYFAIL_PREAUTH_NMAP=1 CREDS_FILE=/etc/copyfail-creds sudo ./copyfail_scan.sh 192.168.54.0/23 ``` ## 输出说明 以下字符串与当前脚本打印的内容匹配(终端中带有 ANSI 颜色)。 | 标签 | 含义 | |-----|--------| | **SKIP - PRE-AUTH** | 主机在 SSH 连接**之前**被跳过:SSH 横幅(以及可选的 `nmap -sV`)匹配到了**非 Linux** / **非目标**模式(Windows、Cygwin、常见设备,或在启用 `nmap` 时检测到的 macOS)。 | | **LIKELY VULNERABLE** | 内核符合脚本**启发式规则**中的“受影响”分支,**并且** `algif_aead` 似乎存在(`loaded`、`loadable` 或 `builtin`)。请使用发行版的安全公告进行**确认**。 | | **VULN - MITIGATED** | 与易受攻击的内核范围相同,但检测到 `/etc/modprobe.d` 或内核 cmdline 中包含 `initcall_blacklist=algif_aead_init`。 | | **PATCHED / LIKELY OK** | 启发式规则认为已修复(例如 6.x 系列内的 **6.18.22+**、**6.19.12+**、**6.20+**,或 **7.x**)。发行版向后移植可能仍使用非标准的 `uname -r` 字符串——请向你的供应商核实。 | | **PRE-FIX KERNEL RANGE** | 启发式规则将内核视为早于此脚本使用的影响下限(在脚本的 `classify_kernel` 逻辑中下限约为 **4.14**)。 | | **NO algif_aead - VERIFY** | 探测未通过 `lsmod`、`modinfo` 或 `/boot/config-$(uname -r)` 发现 `algif_aead`。可能是最小化镜像或特殊配置——在未查阅安全公告和内核包的情况下,**切勿**假定“安全”。 | | **UNKNOWN** | 启发式算法无法对该内核三元组进行分类。 | | **SKIP - NOT LINUX** | **SSH 登录成功**(凭据有效),但 `uname -s` 不是 `Linux`(例如 **macOS**、**Windows** Git Bash/MSYS 或 **BSD**)。此 CVE 仅针对 **Linux** 内核。 | | **SKIP** | **没有**凭据成功。该行会尽可能解释**原因**:例如 `CREDS_FILE` 中的每个条目都**SSH 认证失败**(密码错误、未知用户、仅限密钥登录的账户)、**TCP 拒绝/超时**、**DNS 失败**、远程主机缺少 **bash**,或其他 SSH 错误。 | 每台主机收集的远程信息(当为 Linux 时):`uname -r`、来自 `/etc/os-release` 的 `PRETTY_NAME`、`hostname`、`algif_aead` 信号以及缓解提示。 ## 内核启发式算法 脚本会解析 **`uname -r`**(例如 `6.17.13-1-pve`、`7.0.0-14-generic`)并应用一个**尽力而为**的映射: - 将 **4.14 之前**的内核(脚本使用的主版本/次版本模型)视为**修复前范围**。 - 将补丁号 **≥ 22** 的 **6.18.x** 和补丁号 **≥ 12** 的 **6.19.x** 视为**已修复**;将 6.x 系列中的 **6.20+** 视为**已修复**;出于实际扫描目的,将 **7.x** 视为**已修复**。 - 如果探测未检测到 **`algif_aead`**,无论内核分支如何,状态都会变为 **NO algif_aead - VERIFY**。 供应商内核通常会将修复**向后移植**到与上游编号不匹配的构建字符串中——**请优先参考你的操作系统供应商的 CVE 矩阵**,而不是仅依赖此脚本。 **Proxmox VE(`*-pve` 内核):** 当 Debian/Proxmox 安全更新在 **`pve-kernel-*`** 包中修复 CVE-2026-31431 时,`uname -r` 可能仍停留在 **6.8.x** 或 **6.17.x**。请将 `*-pve` 上的 **`[LIKELY VULNERABLE]`** 视为“**需对照 Proxmox/Debian 公告和 `dpkg -l pve-kernel-*` 进行确认**”,而不是存在可利用内核的证据。 ## 缓解提示(高级别) **模块可加载(许多 Debian/Ubuntu 风格的系统):** ``` echo 'install algif_aead /bin/false' | sudo tee /etc/modprobe.d/disable-algif.conf sudo rmmod algif_aead 2>/dev/null ``` **内置加密用户空间 API(常见于某些 Enterprise Linux 版本):** 模块黑名单可能无效;请遵循你的供应商提供的**内核命令行**缓解措施(例如 `initcall_blacklist=algif_aead_init`)。 ## 操作说明 - **LXC/LXD/Kubernetes 节点:** 容器通常共享**宿主机**内核——请优先在**节点**上进行补丁修复和评估。 - **防火墙:** CIDR 发现针对在 **TCP 22** 上响应的主机;如果不同子网的策略不同,SSH 可能仍会失败。 ## 参考资料 - 咨询站点:[copy.fail](https://copy.fail)(请务必与你的发行版进行交叉核对) ## 许可证 MIT — 详见 [`LICENSE`](LICENSE)。
标签:0day挖掘, algif_aead, Bash, CVE-2026-31431, Nmap, Shell脚本, SSH, 企业安全, 关系图谱, 内存分配, 内核安全, 基线检查, 安全基线, 安全扫描, 密码学API, 应用安全, 开源安全工具, 插件系统, 教学环境, 无线安全, 时序注入, 本地提权, 网络安全, 网络资产管理, 自动化运维, 虚拟驱动器, 资产盘点, 逆向工程平台, 隐私保护