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, 数字取证, 无后门, 无线安全, 模块化设计, 漏洞修复, 漏洞审计, 端点安全, 网络安全, 网络安全培训, 自动化修复, 自动化脚本, 自动化运维, 补丁管理, 资产管理, 逆向工具, 隐私保护, 风险检测