AdrianDeutsch/DepRadar
GitHub: AdrianDeutsch/DepRadar
DepRadar 是一个多生态系统依赖健康平台,通过可解释的风险评分、CI 策略拦截和自动修复,帮助团队在依赖项的安全漏洞、许可证变更和维护风险造成实际损失之前发现并解决它们。
Stars: 0 | Forks: 0
在任何依赖项造成损失之前,了解其健康状况。
一个多语言依赖健康平台(NuGet · npm · PyPI · Cargo · Go),使用 .NET 构建 — 它能解析项目的完整传递依赖图, 对每个包的安全性、开源许可证、许可证变更及维护风险进行评分, 并帮助您对其进行修复、拦截和监控。
## 概述 团队往往发现得太晚:**许可证变更**(MediatR、AutoMapper、MassTransit 和 FluentAssertions 均于 2025 年转向商业化)、**安全公告**、**废弃的包**以及 **破坏性变更**——通常是在下一次审计或发生事故时。 DepRadar 会解析 NuGet、npm、PyPI、Cargo 或 Go 包或项目的**完整传递依赖图**,使用可解释的风险模型对每个节点进行评分,并回答每位技术负责人真正关心的问题:**“这次升级值得吗——风险有多大?”** 然后它允许您**修复**有风险的包(原地修改或通过 PR),在 CI 中对其进行**拦截**,并通过告警随时**监控**它们。 **它与 Dependabot、Renovate 或 Snyk 有何不同?** | | Dependabot / Renovate | Snyk 等 | **DepRadar** | |---|---|---|---| | 核心任务 | 发起更新 PR | 商业漏洞平台 | **可解释的风险评分 + 统一的 CI 拦截** | | 优先级排序 | 无(每次版本升级生成一个 PR) | 专有技术 | **EPSS + CISA KEV —— “它是否实际被利用?”** | | 统一工具支持生态 | 每个仓库独立配置 | 支持(付费层级) | **NuGet · npm · PyPI · Cargo · Go,无需密钥** | | 运行方式 | GitHub 托管 | SaaS | **本地 CLI / 您的 CI —— 无需账户,无需密钥** | | 许可证及维护风险 | ✗ | 部分支持 | **许可证变更、废弃/归档/停滞信号** | DepRadar 是 PR 机器人的良好补充:机器人负责升级版本,而 DepRadar 会告诉您**哪些风险** **真正重要**,并在其违反您的策略时阻断构建。
▶ Watch the 15-second screencast · landing → graph → risk & remediation → upgrade diff → drift
![]() |
![]() |
![]() |
![]() |
Risk ranking with the vulnerability path + fix · drift since last scan · upgrade-impact diff · npm live in the dashboard
## 🚀 快速开始 **30 秒内为构建设置拦截** —— CLI 会在进程内运行整个分析(无需服务器,无需 数据库): ``` dotnet tool install --global DepRadar.Tool # with the .NET SDK… depradar scan WindowsAzure.Storage --fail-on high # exit 1 fails CI on a policy breach depradar npm express # npm too depradar pypi requests # …PyPI (Python) depradar cargo serde # …Cargo (Rust) depradar go golang.org/x/text # …and Go depradar fix ./MyApp.csproj --open-pr --repo owner/name # auto-fix → opens a pull request ``` **没有 .NET SDK?** 每个版本都附带独立的单文件二进制文件 (Linux x64/arm64、macOS x64/arm64、Windows x64 —— 校验和 + 来源证明): ``` curl -fsSL https://github.com/AdrianDeutsch/DepRadar/releases/latest/download/depradar-osx-arm64.tar.gz | tar xz ./depradar npm ./package.json --fail-on high ```
One gate, five ecosystems — exploit intelligence (EPSS + CISA KEV) and typosquat warnings included.
**运行完整平台**(仪表板、漂移监控、REST API)只需一条命令: ``` docker compose up --build # then open http://localhost:8080 ``` ## ✨ 功能 #### 🔍 分析 - **安全扫描** — 每个包版本的已知 CVE/GHSA 公告 (OSV.dev)。 - **漏洞利用情报** — 结合真实世界证据升级公告等级:列入 CISA-KEV 的 CVE 变为**严重**,高 **EPSS** 概率会提升严重程度 ([ADR 0022])。 - **许可证及许可证变更** — 标记 SPDX 变更以及 OSS → 商业化的转向(即“MediatR 事件”)。 - **维护信号** — 源码仓库已被废弃、归档或停滞(最后一次提交)。 - **传递依赖图 + 健康评分** — 为每个包和项目提供可解释的评分。 - **漏洞路径** — 对于每个易受攻击的包,显示将其引入的链条 (`root → A → B`)。 - **域名抢注警告** — 如果直接依赖的目标看起来像热门包的拼写错误 (`lodahs` → `lodash`),则会对其进行标记 ([ADR 0025])。 #### 🛠️ 修复 - **最小安全升级** — 能够清除所有公告的最小版本。 - **`depradar fix`** — 执行该操作:原地修补 manifest,或者**发起 pull request** — 支持 `.csproj`/props、`package.json`、`requirements.txt`、`Cargo.toml` **以及** `go.mod` ([ADR 0021])。 - **传递依赖父级升级** — 将直接依赖升级到其*整个依赖图*均干净的最小版本。 #### 📡 监控 - **随时间推移的漂移** — 每次扫描都会生成快照;呈现出*自您上次查看以来发生腐化*的内容。 - **自主监视列表** — 按计划重新扫描受追踪的包(可选择启用)。 - **多渠道告警** — Slack **和/或** GitHub issues,自动去重并在恢复后**自动关闭**。 - **漂移摘要** + **健康/漂移徽章** + `depradar.drift.open` **OpenTelemetry gauge**。 #### 🔌 集成 - **CLI + 策略即代码** — 一个 `dotnet tool`;提交的 `depradar.json` 可拦截**每个**生态系统命令。 - **GitHub Action** — 左移的依赖拦截器,可上传 SBOM + SARIF。 - **CycloneDX 1.5 SBOM** & **SARIF 2.1.0** — 基于标准的导出;检测结果会展示在 **Security** 标签页中。 - **实时仪表板** (SignalR) 具备**实时多生态系统模式** — npm/PyPI/Cargo/Go 依赖图通过 `/api/live/{ecosystem}/{package}` 在进程内渲染,无需持久化存储 ([ADR 0029])。 - **边缘强化** — 对 `/api/*` 可选启用 `X-API-Key` 拦截 + 基于客户端的速率限制,两者默认关闭 ([ADR 0018])。 #### 🌐 生态系统 - **多生态系统** — 通过*相同*的领域模型,扫描 **npm**、**PyPI**、**Cargo** 和 **Go** 包,包括*整个 manifest* (`package.json`、`requirements.txt`、`Cargo.toml`、`go.mod`) 或 *lockfile* (`package-lock.json`、`poetry.lock`、`uv.lock`、`Cargo.lock`、`go.sum`) ([ADR 0020], [ADR 0023], [ADR 0024], [ADR 0026])。 - **到处统一拦截** — 提交的 `depradar.json` 策略、`--sbom`/`--sarif`、漏洞利用情报和域名抢注警告同样适用于所有五个生态系统。 #### 🤖 AI - **LLM 升级顾问** — 对更新日志进行 RAG (pgvector) + 一个确定性的“询问依赖图”聊天机器人。当设置了 `ANTHROPIC_API_KEY` 时,文本由 Claude 生成,否则使用模板作为兜底。 - **Prompt 注入防御** — 更新日志是不可信输入;`PromptShield` 会对其进行隔离 ([ADR 0006])。 ## 🧭 用法 ### CLI ``` # 扫描 package 或整个项目;为 CI 编写 SBOM + SARIF depradar scan WindowsAzure.Storage --fail-on high --no-deprecated depradar scan ./MyApp.csproj --forbid copyleft --sbom sbom.json --sarif results.sarif # 比较两个版本 — 新增/移除的 deps 以及引入或清除的 CVEs depradar diff Newtonsoft.Json 12.0.3 13.0.3 # Multi-ecosystem — 通过相同的风险模型处理 npm 和 PyPI depradar npm express "^4" # exact versions, ranges, or latest depradar npm ./package.json --sarif results.sarif # scan a whole manifest depradar npm ./package-lock.json # …or the lockfile: exactly what's installed depradar pypi requests 2.19.1 --fail-on high depradar pypi ./requirements.txt --sbom sbom.json # PEP 440 specifiers respected depradar pypi ./poetry.lock # poetry.lock / uv.lock work too depradar cargo regex "=1.5.4" # Cargo (Rust): crates, Cargo.toml, Cargo.lock depradar go golang.org/x/text v0.3.7 # Go: modules, go.mod, go.sum # 自动修复有漏洞的 dependencies(包括 transitive,通过 parent-bump) depradar fix ./MyApp.csproj --dry-run # preview the bumps depradar fix ./MyApp.csproj # patch in place depradar fix ./MyApp.csproj --open-pr --repo owner/name # open a PR (needs GITHUB_TOKEN) depradar fix ./package.json --dry-run # npm: keeps your ^/~ operator depradar fix ./Cargo.toml # Cargo: =/^/~ preserved · go.mod: exact vX.Y.Z depradar fix ./requirements.txt # PyPI: rewrites == pins ``` 退出代码:`0` 策略通过 · `1` 策略违反 · `2` 用法错误。 ### 策略即代码 将拦截规则保留在仓库中,而不是在 CI 标志中。每个命令 (`scan`, `npm`, `pypi`, `cargo`, `go`) 都会自动检测工作目录中的 `depradar.json`(或者传递 `--policy
REST API 参考 (位于 / 的仪表板驱动了所有这些功能)
```
# 将 transitive 扫描加入队列(202 + scan id),然后轮询状态
curl -X POST http://localhost:8080/api/packages/Serilog.Sinks.Console/scan
curl http://localhost:8080/api/scans/流程图 — 扫描流水线 · 漂移监控 · 自动修复
**异步、持久化的扫描流水线** ``` sequenceDiagram actor User participant API as Web API participant DB as PostgreSQL participant W as Worker (Channels) participant NG as NuGet API User->>API: POST /api/packages/{id}/scan API->>DB: INSERT scan (Queued) API-->>User: 202 Accepted (Location /api/scans/{id}) loop poll every 2s W->>DB: claim Queued scans into Channel end W->>NG: resolve transitive graph (ranges to versions, retry + breaker) NG-->>W: registration + dependencies W->>DB: upsert packages / versions / edges (idempotent), mark Completed W->>DB: record risk snapshot (prune to newest N) W->>W: diff vs previous snapshot — on new high-severity drift, alert Slack / GitHub ``` **自主漂移监控**(出现回退时打开,恢复时关闭) ``` sequenceDiagram participant W as Worker · watchlist participant DB as PostgreSQL participant EXT as OSV · NuGet · GitHub participant CH as Slack · GitHub issue loop every Watch:IntervalHours W->>DB: re-queue every tracked package end W->>EXT: resolve + score the graph W->>DB: record snapshot, load the two latest alt new high-severity drift W->>CH: alert — open or comment (de-duplicated) else drift cleared W->>CH: resolve — close the issue end ``` **自动修复**(最小安全升级,包括传递依赖父级升级) ``` flowchart LR A["vulnerable direct dep
(itself or a transitive)"] --> B{"smallest newer version
with a clean graph?"} B -- yes --> C["rewrite Version=
(targeted text edit)"] B -- no --> D["report: consider replacing
e.g. a deprecated package"] C --> E{"--open-pr ?"} E -- yes --> F["branch + commit + PR
via GitHub REST"] E -- no --> G["patch the file in place"] ```
工作原理 — 逐步展示扫描生命周期
1. `POST …/scan` 创建一个 `Scan` 行 (`Queued`) 并返回 **202** —— Postgres 是持久化队列。 2. 在 Worker 中,`System.Threading.Channels` 将数据库**轮询器**与**消费者**解耦,后者通过手动编写的中介者运行每次扫描。 3. 解析器对 NuGet 注册表元数据进行广度优先遍历,将每个**版本范围解析为 NuGet 将要安装的具体版本**,并受节点数量上限约束。 4. 包、版本和**依赖边以幂等方式执行 upsert** —— 重新运行扫描绝不会产生重复的行。 5. 对每个节点进行评分:使用 **OSV.dev** 获取公告,从 NuGet catalog 获取许可证及废弃状态,以及根节点的 **GitHub 仓库健康度**。一个纯粹的 `PackageRiskScorer` 将这些转化为可解释的发现和累加的健康分数。 6. 通过 API 读取返回依赖图 (`recursive CTE`)、风险汇总、**漏洞路径**以及**修复建议**。 7. **升级顾问**对查询进行嵌入处理,从 **pgvector** 检索更新日志块,构建受 Prompt 注入防御保护的 prompt,并返回确定性的推荐 + LLM(或模板化)的叙述。 8. 完成时,经过评估的依赖图会被捕获为仅可追加的 **`jsonb` 快照**。比较最新的两个快照即为**漂移** —— 可通过 `…/drift` 访问,在 `/api/drift/digest` 生成摘要,并在出现新的高危问题时向 Slack/GitHub **发送告警**。可选的监视列表会按计划重新扫描。 9. 相同的应用程序核心**独立在 CLI 中运行**(无 DB)以拦截 CI,并按需渲染 SBOM/SARIF/徽章。 **Prompt 注入防御。** 更新日志是攻击者可控的输入。`PromptShield` 将不可信文本隔离在唯一的分隔符中(剔除其中任何已存在的分隔符),声明该 数据块为*纯粹数据,绝不作为指令*,限制输出,并且**不授予任何权限** —— 推荐结果是确定性计算出来的;LLM 仅负责编写叙述。该 顾问**无需密钥**即可工作(本地嵌入器 + 模板化叙述);设置 `Anthropic:ApiKey` 可启用实时的 Claude 叙述 ([ADR 0006])。
开发里程碑(均已交付)
- [x] **切片 1 — 骨架:** 包 → deps.dev → Postgres → API,包含 Aspire 和测试。 - [x] **切片 2 — 传递依赖图:** 异步持久化扫描,NuGet 范围解析,Channels worker,递归 CTE 依赖图 API。 - [x] **切片 3 — 风险分析:** OSV 安全扫描,许可证 + 许可证变更,维护信号,可解释的评分。 - [x] **切片 4 — LLM 层:** 基于 pgvector 的更新日志 RAG,升级顾问,`ILanguageModel` 接缝,Prompt 注入防御。 - [x] **切片 5 — 展示层:** 仪表板,SignalR 实时进度,Markdown 审计报告。 - [x] **切片 6 — 强化:** HybridCache,EF 迁移,陈旧扫描清理程序,OpenTelemetry,健康检查。 - [x] **超越规划:** 全项目扫描,CycloneDX SBOM,依赖图聊天机器人,升级影响 diff,**CLI + 策略拦截** ([ADR 0009]),以及**漂移历史** ([ADR 0010])。 - [x] **自主监控:** 保留策略,监视列表,Slack 告警,健康徽章 ([ADR 0011])。 - [x] **多渠道告警与摘要:** GitHub-issue 渠道 + 跨包摘要 ([ADR 0012])。 - [x] **完整的漂移生命周期:** 自动关闭 issues,保留任务,漂移徽章,OpenTelemetry gauge。 - [x] **可解释且可导出的发现:** 漏洞路径 + SARIF 2.1.0 ([ADR 0013])。 - [x] **修复与自动修复:** 最小安全升级 + `depradar fix` / PR ([ADR 0014])。 - [x] **多生态系统:** 支持 npm ([ADR 0016]) 和 PyPI ([ADR 0017]) —— 相同的领域模型,每个注册表新增一个适配器。 - [x] **生产环境强化:** 可选的 API 密钥拦截 + 速率限制 ([ADR 0018]),CI 覆盖率底线门槛 + 无需密钥的构建来源证明 ([ADR 0019]),基于 HTTP fixture 的解析器测试,以及依赖图截断呈现。 - [x] **Manifest 扫描:** 将 `package.json` / `requirements.txt` 作为一等扫描目标,支持范围感知的根节点解析,为每个生态系统提供 OSV 的修复版本提示 ([ADR 0020])。 - [x] **多生态系统自动修复:** `depradar fix` 将易受攻击的 npm 范围和 PyPI `==` 版本锁定升级到最小的干净版本 ([ADR 0021])。 - [x] **漏洞利用情报:** EPSS 概率 + CISA KEV 将“存在 CVE”升级为“正被积极利用” —— 适用于每个生态系统和路径 ([ADR 0022])。 - [x] **Lockfile 扫描:** 将 `package-lock.json` / `poetry.lock` / `uv.lock` 作为精确安装的集合进行扫描 —— 最精准的扫描目标 ([ADR 0023])。 - [x] **第四个生态系统 —— Cargo (Rust):** 通过 OSV 接入 crates.io + RUSTSEC,yanked = 废弃,支持 `Cargo.toml`/`Cargo.lock` 目标 ([ADR 0024])。 - [x] **域名抢注警告:** 使用 Damerau-Levenshtein 相似度检查直接依赖目标是否与精心整理的热门包列表存在拼写相似 ([ADR 0025])。 - [x] **第五个生态系统 —— Go:** 通过 OSV 接入模块代理 + Go 漏洞数据库;精确的 requires,无版本范围语法 ([ADR 0026])。 **接下来** - [x] 独立的 CLI 二进制文件(无需 .NET SDK —— npm/PyPI/Cargo/Go 受众通常没有 .NET 环境)([ADR 0028])。 - [x] 多生态系统仪表板 —— 支持 npm/PyPI/Cargo/Go 的实时模式 ([ADR 0029])。 - [ ] 多生态系统漂移监控(目前的持久化流水线仅支持 NuGet)。 - [ ] 针 对 Go/Cargo 的 deps.dev 许可证丰富化 · 将 Maven 作为第六大生态系统。
标签:LLM, NuGet, Unmanaged PE, 依赖管理, 开源许可证合规, 用户代理, 请求拦截



