内容
# remedify
[](https://github.com/higakikeita/remedify/actions/workflows/ci.yml)
[](LICENSE)
[](pyproject.toml)
[](remedify.py)
[](https://pypi.org/project/remedify/)
> **copa补丁容器镜像。remedify告诉你如何修复其他问题。**

_90秒快速演示:Trivy/Sysdig 发现 → remedify → 精确的 `apt`/`dnf`/`apk` 命令 → 重新扫描和验证。 使用 [`demo/demo.sh`](demo/demo.sh) 重新录制。_
漏洞扫描器擅长告诉你 **什么** 是漏洞以及 **哪个版本** 修复了它。它们不擅长告诉你 **应该运行什么命令**。在初步评估后,每个团队都会问同一个问题:“那么,我如何在我的操作系统上修复这个问题?”——而今天的答案是“去阅读Ubuntu/RHEL/Amazon Linux文档。”
**remedify** 弥补了这最后一英里的差距。它接受漏洞扫描结果(Trivy、Grype、OSV-Scanner 或 Sysdig — API、JSON 和 CSV)并生成具体的、针对发行版的修复方案:
```
$ trivy rootfs --format json -o scan.json /
$ remedify scan.json
```
```markdown
## libssl3 `HIGH`
- 已安装:`3.0.2-0ubuntu1.15` -> 修复:`3.0.2-0ubuntu1.18`
- CVEs:CVE-2024-5535,CVE-2024-6119
- **供应商反移植(Ubuntu)**:修复版本是发行版反移植 — 它不会与上游版本号码匹配。请信任下面的供应商咨询。
apt-get install --only-upgrade libssl3=3.0.2-0ubuntu1.18
- ⚠️ 重启链接到OpenSSL的服务(nginx,sshd等)。
- 咨询: [Ubuntu USN](https://ubuntu.com/security/notices/USN-6986-1)
```
## 快速开始
```bash
pip install remedify # 从PyPI
# 或零安装:git clone https://github.com/higakikeita/remedify && cd remedify
# 1. 从Trivy
trivy image --format json -o scan.json nginx:latest
python3 remedify.py scan.json # Markdown报告
python3 remedify.py scan.json --format shell > fix.sh # 可审查的修复脚本
python3 remedify.py scan.json --min-severity HIGH --format json # 用于CI/自动化
# 2. 直接从Sysdig VM API(需要安全API令牌)
export SYSDIG_API_TOKEN=<token>
python3 remedify.py --from-sysdig --api-url https://us2.app.sysdig.com
python3 remedify.py --from-sysdig --api-url ... --limit 20 # 20个工作负载,一个报告
# 2b. 从Grype或OSV-Scanner
grype myapp:1.0 -o json | python3 remedify.py -
osv-scanner --format json -r . | python3 remedify.py -
# 3. 从Sysdig漏洞报告CSV导出
python3 remedify.py report.csv --os ubuntu:22.04
```
## 作为Trivy插件
直接从Trivy运行remedify — 发现结果直接流入修复计划:
```bash
trivy plugin install github.com/higakikeita/remedify
# Trivy扫描,然后将报告输送到remedify(输出插件模式):
trivy image --format json --output plugin=remedify nginx:latest
# 通过 `--output-plugin-arg` 传递remedify标志:
trivy image --format json --output plugin=remedify \
--output-plugin-arg "--format=shell" nginx:latest > fix.sh
# 或直接处理保存的扫描:
trivy remedify scan.json
```
零依赖:插件是同一个Python文件,因此它在任何平台上安装时都不需要构建步骤。
无需依赖 — 任何Python 3.9+ 都可以直接运行它。
## 为什么不直接使用copa?
[Copacetic](https://project-copacetic.github.io/copacetic/website/) 非常优秀 — **容器镜像**。它直接通过添加补丁层来修复镜像,无需重建。remedify涵盖了copa无法做到的部分:
| | copa | remedify |
|---|---|---|
| 容器镜像 | ✅ 直接修复 | ✅ 确定性计划 |
| **主机 / 虚拟机 / 裸金属** | ❌ | ✅ 每个发行版的命令 |
| 反移植说明(修复版本 ≠ 上游版本) | ❌ | ✅ |
| 重启 / 服务重启指导 | ❌ | ✅ |
| 语言包(Java/npm/Go…) | ❌ | ✅ 更新 + 重建步骤 |
| Ansible剧本 / CI门控输出 | ❌ | ✅ |
它们是互补的:容器带有注册工作流 → copa;**主机、语言包和自动化管道 → remedify**。
## 功能
- **输入**(自动检测):Trivy JSON(`trivy image|fs|rootfs --format json`),**Sysdig扫描结果JSON**(sysdig-cli-scanner / VM API),**Grype JSON**,**OSV-Scanner JSON**,**Sysdig漏洞报告CSV导出**(灵活匹配头部名称 — 如果导出缺少OS列,请传递 `--os ubuntu:22.04`),或 **直接从Sysdig VM API**(`--from-sysdig --api-url https://us2.app.sysdig.com` 带有 `SYSDIG_API_TOKEN`;针对实时租户验证)
- **优先级信号**:发现结果带有Sysdig运行时上下文 — 🚨 CISA KEV(已知漏洞利用),公开利用可用,以及 **运行时正在使用的包** — 步骤按严重性和这些信号排序,因此您首先修复攻击者可以实际访问的内容
- **应用程序依赖项(语言包)**:Java/npm/pip/Go/Ruby/PHP/Rust/.NET发现结果获取生态系统特定的修复说明(更新pom.xml/`npm install pkg@ver`/等 + 重建)— 这种类型的发现结果既不是OS包管理器也不能被copa修复
- **发行版感知命令**:apt(Ubuntu/Debian),dnf/yum(RHEL/Rocky/Alma/Amazon/Fedora),apk(Alpine),zypper(SUSE)
- **合并步骤**:来自一个源包的二进制包(例如e2fsprogs + libcom-err2 + libext2fs2 + libss2)成为 **一个** 命令,而不是四个
- **“无修复可用”部分**:没有修复版本的发现结果会报告其供应商状态(`affected`,`will_not_fix`,`end_of_life`)— 永远不会被静默丢弃
- **EOL感知**:检测到发行版生命周期结束并警告,当修复需要ESM注册或操作系统迁移时
- **反移植检测**:标记供应商反移植(`~ubuntu`,`.el9`,`.amzn2`,`+esm`,`+deb`)并解释为什么版本与上游不匹配
- **操作提示**:内核 → 需要重启;glibc → 建议重启;OpenSSL → 重启链接服务
- **咨询呈现**:供应商来源优先(USN,RHSA,ALAS,DSA),NVD作为备用,近似重复项折叠
- **三种输出格式**:Markdown报告,可执行的shell脚本,JSON
- **零依赖**:单个Python文件,仅限标准库
## 您获得的内容
**1. 优先的Markdown报告** — 合并步骤而不是每包噪音:
```markdown
# 修复计划:`prod-web-host (ubuntu 18.04)`
- **修复步骤**:1(涵盖4个包)
- **无修复可用**:1个包
> ⚠️ **EOL**:Ubuntu 18.04标准仓库不再接收安全更新。许多CVE的修复程序需要Ubuntu Pro(ESM)。
## e2fsprogs (+3相关包) `MEDIUM`
- 包:`e2fsprogs`,`libcom-err2`,`libext2fs2`,`libss2`(同一个源,一个更新)
- 已安装:`1.44.1-1ubuntu1.1` -> 修复:`1.44.1-1ubuntu1.2`
- **供应商反移植(Ubuntu)**:修复版本不会与上游版本匹配 — 请信任咨询。
apt-get install --only-upgrade e2fsprogs=1.44.1-1ubuntu1.2 libcom-err2=1.44.1-1ubuntu1.2 ...
- 咨询: [Ubuntu USN](https://ubuntu.com/security/notices/USN-4142-1)
## 无修复可用
- **bash** `LOW` (CVE-2019-18276)— 供应商尚未发布修复程序
```
**2. 可审查的shell脚本**(`--format shell`)— 注释,`set -euo pipefail`,重启提醒在最后:
```bash
#!/usr/bin/env bash
# 审查后运行。 以root或sudo运行。
apt-get update
# e2fsprogs, libcom-err2, ... 1.44.1-1ubuntu1.1 -> 1.44.1-1ubuntu1.2 [MEDIUM] CVE-2019-5094
# 注意:Ubuntu供应商反移植 — 版本与上游不同
apt-get install --only-upgrade e2fsprogs=1.44.1-1ubuntu1.2 ...
```
**3. 机器可读JSON**(`--format json`)— 将其输入您的票务系统,聊天机器人或AI代理。
## 从AI代理(MCP)使用
remedify附带一个MCP服务器(`remedify_mcp.py`,零依赖),因此AI
代理获得 **确定性** 修复计划而不是生成自己的命令。Claude Desktop配置:
```json
"mcpServers": {
"remedify": {
"command": "python3",
"args": ["/path/to/remedify/remedify_mcp.py"],
"env": { "SYSDIG_API_TOKEN": "..." }
}
}
```
工具:`generate_remediation_plan`(传递扫描内容)和
`fetch_sysdig_plan`(实时来自Sysdig VM API,带有fleet摘要)。代理推理和对话;remedify计算计划 — 相同的输入,相同的输出,每次。
> 安全注意:MCP工具参数由代理程序组装,因此服务器
> 从不读取任意本地路径。`scan_content` 是推荐的输入。
> `scan_path` 除非您设置 `REMEDIFY_MCP_ALLOWED_DIR`,否则禁用,并且即使
> 然后也只读取在该目录内解析的文件。
## CLI参考
| 选项 | 值 | 默认值 | 目的 |
|---|---|---|---|
| `--format` | `markdown` `shell` `json` | `markdown` | 输出格式 |
| `--min-severity` | `LOW` `MEDIUM` `HIGH` `CRITICAL` | 显示所有 | 过滤修复步骤(未修复的发现结果 **永远不会** 隐藏) |
| `--input` | `auto` `trivy` `grype` `osv` `sysdig-csv` `sysdig-json` | `auto` | 输入格式 |
| `--context` | `auto` `host` `image` | `auto` | 修补到位(主机)vs. 重建建议(镜像) |
| `--baseline BEFORE` | 文件 | | 验证模式:差异BEFORE与扫描后并证明修复已落地 |
| `--check-eol` | | 关闭 | 使用实时endoflife.date数据(网络,缓存〜24小时)而不是内置表 |
| `--os` | 例如 `ubuntu:22.04` | 来自输入 | 操作系统覆盖,用于缺乏OS元数据的输入 |
| `--from-sysdig` | | | 从Sysdig VM API获取运行时结果 |
| `--limit` | N | 1 | 带有 `--from-sysdig`:一个报告中的N个最新工作负载 |
| `--api-url` / `--result-id` / `--filter` | | | Sysdig API端点 / 特定结果 / 过滤器 |
| `--version` | | | 打印版本 |
输入通过文件路径或stdin(`-`)。
## 支持的发行版
| 家族 | 包管理器 | 反移植检测 | EOL检测 |
|---|---|---|---|
| Ubuntu / Debian | `apt` | ✅ (`~ubuntu`, `+deb`, `+esm`) | ✅ (ESM指导) |
| RHEL / Rocky / Alma / Oracle / Fedora | `dnf` | ✅ (`.el9`) | — |
| CentOS | `dnf` | ✅ | ✅ (迁移指导) |
| Amazon Linux | `yum` (AL2) / `dnf` | ✅ (`.amzn2`) | ✅ (AL1) |
| Alpine | `apk` | — | — |
| SUSE / openSUSE | `zypper` | — | — |
| 其他 | — | 降级处理:发现结果列出但无命令 | |
使用捆绑的示例进行尝试:
```
python3 remedify.py examples/trivy-real-ubuntu1804.json # 真实的Trivy输出:分组 + EOL + 无修复
python3 remedify.py examples/trivy-rhel.json --min-severity HIGH
python3 remedify.py examples/trivy-amazon2.json # yum + ALAS咨询
python3 remedify.py examples/trivy-alpine.json # apk
python3 remedify.py examples/trivy-centos7-eol.json # EOL + will_not_fix / end_of_life
python3 remedify.py examples/sysdig-report.csv # Sysdig CSV导出
python3 remedify.py examples/sysdig-scan-result.json # Sysdig扫描JSON:OS + Java/npm (Spring4Shell)
python3 remedify.py examples/trivy-ubuntu.json --format shell > fix.sh
```
## 架构
```
扫描结果 解析器 标准化 生成器 渲染器
┌────────────┐ ┌───────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐
│ Trivy JSON │──▶│ 每种扫描器 │──▶│ 查找 │──▶│ apt / dnf / │──▶│ markdown │
│ Grype JSON │ │ │ │ 包, │ │ apk / zypper │ │ shell │
│ OSV/Sysdig │ │ │ │ 修复版本, │ │ + 反移植 │ │ json │
└────────────┘ └───────────┘ │ CVEs, 引用 │ │ + 提示 │ │ sarif 🔜 │
└──────────────┘ └──────────────┘ └────────────┘
```
每个阶段都是可插拔的:新的扫描器是解析器,新的发行版是生成器,新的输出是渲染器。
## 路线图
**已发布**
- **输入**:Trivy, Grype, OSV-Scanner, 以及Sysdig(扫描JSON,报告CSV,以及漏洞管理API)
- **语言包**:pip/npm/Maven/Go/等发现结果显示为升级和重建步骤(OS包管理器无法修复它们)
- **输出**:markdown, shell脚本,JSON,Ansible playbook
- **验证**:闭环前后差异 — 修复实际落地证明,带有CI门控 (`--fail-on`)
- **EOL检测** 和 **优先级** (使用中/可利用/KEV)
- **MCP服务器** (`remedify_mcp.py`) 以便AI代理调用
- **Trivy插件**:`trivy remedify` / `--output plugin=remedify`
**下一个**
- **增强**: 查询供应商安全数据(Ubuntu OVAL/USN,Red Hat CSAF/errata,ALAS)以获得“不受影响 / 需要重启”的精度
- **集成**:GitHub Action, `--format sarif`
- **Windows**:KB文章 / `winget`
- **用Go重写** 一旦接口稳定(单个静态二进制文件,与copa/trivy相同的生态系统)
## 非目标
- remedify **不**应用补丁。它生成计划;人类(或您的自动化)执行它。自动应用在v0.x中故意不在范围之内。
- 不是扫描器。带来您自己的(Trivy/Grype/Sysdig)。
## 状态
Alpha — 今天可用,接口在v1.0之前可能会更改。已发布在PyPI
(`pip install remedify`) 带有综合测试套件(190+测试,属性
测试对抗真实的 `dpkg`,模糊测试和模式金丝雀)。欢迎反馈和
贡献 — 见 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 许可证
Apache-2.0.