WavesMan/cve-2026-31431-fleet-remediator

GitHub: WavesMan/cve-2026-31431-fleet-remediator

针对 Linux 内核高危漏洞 CVE-2026-31431 的批量跨网段审计与自动化修复编排工具。

Stars: 0 | Forks: 0

# CVE-2026-31431 集群审计与修复工具 [中文说明](./README-zh_cn.md) 本项目是一个集群规模的编排工具,用于在企业/内部网络的 Linux 主机上审计和修复 **CVE-2026-31431**。 - 批量 SSH 登录多台主机 - 风险证据收集和状态分类 - 临时缓解措施(禁用 `algif_aead`) - 感知发行版的内核补丁/升级工作流 - JSON / CSV / Markdown 报告 ## 1. 环境要求 - Python:`>=3.13` - 包管理器:`uv` - 网络:运行器必须能通过 SSH 连接到目标主机 ## 2. 快速开始 ### 2.1 安装依赖 ``` uv sync ``` `pyproject.toml` 中已配置了清华大学镜像源: ``` [tool.uv] index-url = "https://pypi.tuna.tsinghua.edu.cn/simple" ``` ### 2.2 准备资产配置 ``` cp fleet.env.example fleet.env ``` 然后在 `fleet.env` 中填入您真实的主机和凭据信息。 ### 2.3 运行 ``` uv run python main.py fleet.env ``` ## 3. 项目结构 ``` . ├── main.py ├── pyproject.toml ├── uv.lock ├── fleet.env.example ├── reports/ └── src/ ├── main.py ├── models.py ├── config.py ├── executor.py ├── collector.py ├── analyzer.py ├── adapters.py ├── remediator.py ├── orchestrator.py └── reporter.py ``` ## 4. `fleet.env` 配置参考 格式为 `KEY=VALUE`。空行和 `#` 注释将被忽略。 ### 4.1 全局键 `MODE` - 运行模式。 - 取值: - `audit`:仅检测,不进行修复。 - `fix`:检测并运行修复流程。 - 默认值:`audit` `AUTO_REBOOT` - 修复成功后是否自动重启主机。 - 取值:`0` 或 `1` - 默认值:`0` - 仅在 `MODE=fix` 时生效。 `SSH_TIMEOUT` - SSH 连接/认证超时时间(秒)。 - 类型:整数 - 默认值:`12` `MAX_WORKERS` - 集群并发大小(线程池工作线程数)。 - 类型:整数 - 默认值:`8` `REPORT_DIR` - 生成报告的输出目录。 - 类型:相对或绝对路径 - 默认值:`./reports` `PROGRESS_HEARTBEAT_SECONDS` - 实时进度日志的心跳间隔。 - 类型:整数(秒) - 默认值:`5` `DEVICE_MAX_DURATION_SECONDS` - 每台设备在发出超时/停顿警告前的最大总执行时间。 - 类型:整数(秒) - 默认值:`1800` `PROGRESS_LOG_TO_FILE` - 是否将进度日志持久化到 `REPORT_DIR` 中。 - 取值:`0` 或 `1` - 默认值:`1` `FLEET_COUNT` - 设备插槽数量。加载器将解析 `1..FLEET_COUNT`。 - 类型:整数 - 如果 `DEVICE_n_HOST` 为空,则跳过该插槽。 ### 4.2 单设备键 每台主机使用 `DEVICE_{n}_` 前缀,例如 `DEVICE_1_*`、`DEVICE_2_*`。 `DEVICE_n_NAME` - 报告中的显示名称。 - 可选。如果为空,自动回退为 `device_n`。 `DEVICE_n_HOST` - 目标主机 IP 或 DNS 名称。 - 该插槽的必填项。 `DEVICE_n_PORT` - SSH 端口。 - 默认值:`22` `DEVICE_n_USER` - SSH 用户名。 - 默认值:`root` `DEVICE_n_PASSWORD` - SSH 密码认证。 - 可与 `DEVICE_n_KEY` 结合使用,或替代 `DEVICE_n_KEY`。 - 脚本仅使用在 `fleet.env` 中明确设置的凭据。 `DEVICE_n_KEY` - SSH 私钥路径。 - 示例:`./keys/node-1_ed25519` - 如果 `DEVICE_n_PASSWORD` 和 `DEVICE_n_KEY` 都为空,连接将立即失败。 `DEVICE_n_SUDO_PASSWORD` - 非 root 用户的 sudo 密码。 - 用于执行修复命令。 ### 4.3 完整示例 ``` # ========================= # Global # ========================= MODE=audit AUTO_REBOOT=0 SSH_TIMEOUT=12 MAX_WORKERS=8 REPORT_DIR=./reports PROGRESS_HEARTBEAT_SECONDS=5 DEVICE_MAX_DURATION_SECONDS=1800 PROGRESS_LOG_TO_FILE=1 FLEET_COUNT=3 # ========================= # Device 1 # ========================= DEVICE_1_NAME=pve-node-1 DEVICE_1_HOST=192.168.1.10 DEVICE_1_PORT=22 DEVICE_1_USER=root DEVICE_1_PASSWORD= DEVICE_1_KEY=./keys/pve-node-1_ed25519 DEVICE_1_SUDO_PASSWORD= # ========================= # Device 2 # ========================= DEVICE_2_NAME=web-1 DEVICE_2_HOST=192.168.1.20 DEVICE_2_PORT=22 DEVICE_2_USER=admin DEVICE_2_PASSWORD=your_ssh_password DEVICE_2_KEY= DEVICE_2_SUDO_PASSWORD=your_sudo_password # ========================= # Device 3 # ========================= DEVICE_3_NAME= DEVICE_3_HOST=192.168.1.30 DEVICE_3_PORT=22 DEVICE_3_USER=ops DEVICE_3_PASSWORD= DEVICE_3_KEY=./keys/db-1_ed25519 DEVICE_3_SUDO_PASSWORD= ``` ## 5. 运行模式 ### 5.1 审计模式(建议首次运行使用) ``` MODE=audit uv run python main.py fleet.env ``` 行为: - 连接到主机 - 收集内核/模块/补丁提示 - 分类风险状态 - 生成报告 ### 5.2 修复模式 ``` MODE=fix AUTO_REBOOT=0 uv run python main.py fleet.env ``` 行为: - 首先应用临时缓解措施: - 写入 `/etc/modprobe.d/disable-cve-2026-31431-algif-aead.conf` - 尝试卸载 `algif_aead` - 运行特定发行版的内核更新 - 根据 `AUTO_REBOOT` 的设置选择性重启 ## 6. 状态定义 `SAFE` - 找到补丁提示且未加载 `algif_aead`。 `MITIGATED` - 找到缓解提示,但补丁提示仍不明确。 `NEEDS_PATCH` - `algif_aead` 可用/已加载且缺少补丁提示。 `UNKNOWN` - 没有足够的证据进行分类。 `FAILED` - SSH 登录/命令执行失败。 ## 7. 报告输出 每次运行会在 `REPORT_DIR` 中生成 3 个文件: - `cve_2026_31431_.json` - `cve_2026_31431_.csv` - `cve_2026_31431_.md` - `progress_.log`(实时进度和心跳日志) 核心字段: - `name`、`host` - `status` - `kernel`、`os` - `algif_loaded`、`algif_available` - `patch_hint` - `fixed`、`rebooted` - `error` ## 8. 安全提示 - 不要提交 `fleet.env` 或私钥。 - 尽可能使用最小权限的运维账户。 - 在生产环境修复前,请先进行快照/备份。 - 建议的推广步骤:`audit` -> `fix` -> 重新审计。 ## 9. 故障排除 `ModuleNotFoundError: No module named 'paramiko'` - 运行 `uv sync`。 多台主机显示为 `FAILED` - 检查网络连通性、SSH 凭据、sudo 权限以及主机密钥状态。 `BadHostKeyException` - 主机指纹与当前的 `known_hosts` 记录冲突。 - 这不是系统密钥认证的回退机制;认证仍然只使用 `fleet.env` 中的凭据。 - 通过带外方式验证主机身份,然后更新 known_hosts: - `ssh-keygen -R ` - `ssh-keyscan -H >> $env:USERPROFILE\.ssh\known_hosts` `Server ... not found in known_hosts` - 启用了严格的主机密钥模式,并且缺少主机指纹。 - 将主机密钥添加到 `known_hosts`,然后重新运行。 内核已更新但状态仍显示有风险 - 可能需要重启才能引导进入已打补丁的内核。
标签:CSV报告, CVE-2026-31431, FTP漏洞扫描, JSON报告, Markdown报告, Python, Python 3.13, 主机加固, 企业网络, 内存分配, 内核升级, 包管理工具uv, 占用监测, 多线程并发, 安全编排, 批量SSH, 数字取证, 无后门, 无线安全, 模块化设计, 漏洞修复, 漏洞审计, 端点安全, 网络安全, 网络安全培训, 自动化修复, 自动化脚本, 自动化运维, 补丁管理, 资产管理, 逆向工具, 隐私保护, 风险检测