我在同一个项目上运行了 npm audit 和 DepGra —— 这两者各自发现了什么
Source: Dev.to
npm audit
npm audit 报告了 10 个漏洞(3 个中等,7 个高危),涉及 8 个包:
| Package | Version | Advisory | Severity |
|---|---|---|---|
| serialize‑javascript | 6.0.2 | RCE via RegExp.flags | high |
| next | 15.5.9 | 2 advisories | high |
| minimatch | 3.1.2, 9.0.5 | 3 ReDoS advisories each | high |
| flatted | 3.3.3 | Unbounded recursion DoS | high |
| rollup | 4.54.0 | Arbitrary file write via path traversal | high |
| ai | 4.3.19 | Filetype whitelist bypass | moderate |
| jsondiffpatch | 0.6.0 | XSS via HtmlFormatter | moderate |
| ajv | 6.12.6, 8.17.1 | ReDoS with $data option | moderate |
npm audit 还会指示是否有可用的修复以及是否需要破坏性更改——这些信息是 DepGra 所不提供的。
DepGra 扫描
DepGra 在 6.5 秒 内扫描了相同的 package-lock.json,发现 10 个包中共 12 条唯一 advisory:
| 严重性 | GHSA ID | 受影响的包 |
|---|---|---|
| CRITICAL | GHSA-5c6j-r48x-rmvq | serialize-javascript@6.0.2 |
| HIGH | GHSA-23c5-xmqv-rm74 | minimatch@3.1.2, minimatch@9.0.5 |
| HIGH | GHSA-25h7-pfq9-p65f | flatted@3.3.3 |
| HIGH | GHSA-3ppc-4f35-3m26 | minimatch@3.1.2, minimatch@9.0.5 |
| HIGH | GHSA-7r86-cg39-jmmj | minimatch@3.1.2, minimatch@9.0.5 |
| HIGH | GHSA-h25m-26qc-wcjf | next@15.5.9 |
| HIGH | GHSA-mw96-cpmx-2vgc | rollup@4.54.0 |
| MEDIUM | GHSA-33vc-wfww-vjfv | jsondiffpatch@0.6.0 |
| MEDIUM | GHSA-5f7q-jpqc-wp7h | next@15.5.9 |
| MEDIUM | GHSA-9g9p-9gw9-jx7f | next@15.5.9 |
| MEDIUM | GHSA-rwvc-j5jr-mgvh | ai@4.3.19 |
| UNKNOWN | GHSA-2g4f-4pwh-qvx6 | ajv@6.12.6, ajv@8.17.1 |
npm audit 报告的 11 条 advisory 全部出现在 DepGra 的结果中,另有一条额外的 advisory:
- GHSA-5f7q-jpqc-wp7h (CVE‑2025‑59472) – Next.js 通过 PPR 恢复端点导致的无限内存消耗(发布于 2026‑01‑28)。此 advisory 已在 OSV.dev(DepGra 的数据来源)中出现,但尚未进入
npm audit使用的 GitHub Advisory Database。
差异原因
- 数据来源:DepGra 查询 OSV.dev,该平台聚合了多个漏洞信息源。
npm audit查询 GitHub Advisory Database。两者的更新时间不同会导致结果不一致。 - 严重性评分:
npm audit将serialize-javascript归类为 high,而 DepGra 读取完整的 CVSS 向量后评为 critical。 - 计数方法:
npm audit按每个受影响的包实例计数;DepGra 按唯一 CVE ID 计数。
Source: …
图形洞察
在将 DepGra 扫描加载到其图形视图时,会显现出两个模式:
Minimatch 作为瓶颈
扁平列表显示minimatch有三个高危建议。图形揭示minimatch@3.1.2是多个广泛使用的包(@sentry/node、@typescript-eslint/typescript-estree、glob)的传递依赖。其 影响范围 因此比单纯的严重性提示更大。通向
serialize-javascript的多条风险路径
扁平列表只列出一项,但图形显示了两条不同的依赖链:copy-webpack-plugin → serialize-javascript@6.0.2terser-webpack-plugin → serialize-javascript@6.0.2
两条路径都指向 关键的 RCE 漏洞,凸显了可视化拓扑结构而非仅依赖手动
npm ls分析的优势。
技术栈
- 解析器:
package-lock.json,Cargo.lock,poetry.lock,requirements.txt,go.mod - 漏洞来源: OSV.dev 批量 API(一次请求获取所有包,随后进行详细抓取)
- 存储与分析: SQLite + NetworkX(中心性评分,路径查找)
- API: Flask(REST)
- 前端: Svelte + Cytoscape.js(图形渲染)
- 布局算法: 有向无环图(DAG)布局的拓扑排序 – O(V + E),高效处理 > 1,300 个节点
- Python
requirements.txt处理: 通过 PyPI API 解析传递依赖(因为锁文件不可用)
安装与使用
# Clone the repository
git clone https://github.com/KPCOFGS/depgra
cd depgra
# Backend setup
cd backend
uv venv .venv
source .venv/bin/activate
uv pip install -r requirements.txt
cd ..
# Frontend setup
cd frontend
npm install
npm run build
cd ..
# Run the server
python run.py
# Open http://127.0.0.1:5000CLI 替代方案
# Scan a lockfile
python run.py scan path/to/package-lock.json
# Scan a requirements file and fail on HIGH severity or above
python run.py scan requirements.txt --fail-on HIGHLimitations
- No auto‑remediation: DepGra 不会建议升级版本或创建修复的 pull request(不同于
npm audit fix)。 - Scope: 仅专注于依赖漏洞可视化——不进行容器扫描、许可证合规或机密信息检测。
- Severity variance: 分类来源于 OSV.dev,可能与其他工具(例如 Snyk、npm audit)报告的结果不同。
- Large graphs: 当可视化的包超过 1,000 个时,图形会变得密集;仍然可用,但不如小图整洁。
未来方向
- SBOM 导出(CycloneDX / SPDX)
- 自动化修复建议(解决 CVE 的最低版本升级)
- GitHub Action 用于 CI/CD 集成
该项目采用 MIT 许可证,欢迎反馈。