SupplyChain Sentry 是什么?
它是一个 零依赖的命令行工具,在安装依赖前对 package-lock.json(或 pnpm-lock.yaml)中的每一个包进行快速扫描,从三个维度评估风险:
静态规则引擎
检测 install 脚本中是否存在可疑模式,比如eval()、动态网络请求、文件系统写入等。信誉评分系统
综合包的下载量、维护者数量、最近更新时间、依赖复杂度等,给出一个 0–100 的可信度分数。行为模拟沙盒(可选)
对高风险包在隔离的 Docker 容器中模拟执行install脚本,监控其真实行为——是正常写入缓存,还是偷偷向外发送数据。
输出结果一目了然:每个包的风险等级(Critical / High / Medium / Low),并附上具体的风险证据。
三步上手,立即保护你的项目
第 1 步:全局安装
npm install -g supplychain-sentry
# 或用 pnpm / bun
pnpm add -g supplychain-sentry
第 2 步:进入项目目录并运行
cd your-project
sentry-scan
工具会自动识别 lock 文件,然后开始扫描。
第 3 步:阅读报告
你会看到类似这样的输出:
┌─────────────────────────┬──────────┬──────────────────────────────────────────┐
│ Package │ Severity │ Details │
├─────────────────────────┼──────────┼──────────────────────────────────────────┤
│ quick-string-encoder │ CRITICAL │ [R001] postinstall script uses eval() │
│ │ │ [R004] Suspicious network request to │
│ │ │ api.ipify.org │
│ │ │ Reputation score: 12/100 (last publish │
│ │ │ > 2 years ago) │
├─────────────────────────┼──────────┼──────────────────────────────────────────┤
│ lodash │ LOW │ Reputation score: 92/100 │
├─────────────────────────┼──────────┼──────────────────────────────────────────┤
│ colors │ MEDIUM │ [R002] Uses eval() in main entry │
│ │ │ (false positive? check manually) │
└─────────────────────────┴──────────┴──────────────────────────────────────────┘
如果出现了 CRITICAL 或 HIGH 的包,建议先不要安装它,或者寻找替代包。你也可以通过 --json 输出详细报告,集成到 CI 流程中。
实战:抓到一个真实的恶意包
我在自己的一个 Next.js 项目里尝试添加 fast-calc-pro(一个近期出现的高性能数学库,版本 0.3.2),运行 sentry-scan 后,得到了这样的警告:
[!] CRITICAL: fast-calc-pro@0.3.2
- Rule R003: install script attempts to read /etc/passwd
- Rule R007: outgoing POST request to https://log.collector.io/collect
- Reputation score: 8/100 (downloaded only 342 times in last week)
这明显是一个收集系统信息的恶意包。我立即在团队内部通报,并转而使用另一个经过审计的数学库。整个过程不到 30 秒。
想象一下,如果我把这个包安装到了生产环境——恶意脚本可能会在构建阶段就将环境变量、源码信息全部泄露出去。
它为什么能提前阻断?
SupplyChain Sentry 的核心思路是 “信任但不能不验证”。
传统的 npm audit 依赖已知漏洞数据库(CVE),只能发现已被公开的漏洞,对零日供应链攻击无能为力。而 SupplyChain Sentry 采取 启发式检测:
- 很多恶意包为了维持持久化或盗取信息,会在 install 脚本中使用 动态代码执行(
eval、new Function)、网络请求 或 写文件到敏感目录。这些行为在正常的 npm 包中非常罕见。 - 信誉评分则利用了一个事实:绝大多数流行的、健康的包都有多个维护者、每周数十万以上的下载量、最近半年内有更新。一个新发布的、只有一个维护者的包,如果突然要求极高权限,就值得怀疑。
行为沙盒则是最后一道防线:在完全隔离的环境里执行安装脚本,看它到底干了什么。如果它在沙盒里试图访问 ~/.aws/credentials,那就直接拉红。
这三种机制叠加,可以在恶意代码真正接触到你的机器之前,就把它拦下来。
集成到 CI,形成自动化防线
你可以在 GitHub Actions 中加入这样一步:
- name: Scan dependencies for supply chain risks
run: npx supplychain-sentry --json > sentry-report.json
continue-on-error: false # 发现高危包时中断构建
然后在 PR 中自动评论报告。团队里的每个人都无法合入包含危险依赖的代码。
未来路线图
SupplyChain Sentry 还处于早期阶段(v0.3),但已经有了扎实的基础。接下来计划增加:
-
VS Code 扩展:在你输入
npm install some-package时,实时显示风险评级。 - 恶意包蜜罐网络:主动上传一些虚假的 npm token,检测有哪些 IP 在尝试窃取。
- 替代包智能推荐:当发现一个高风险包时,自动搜索功能相似、信誉良好的替代包。
现在就试试吧
你的项目每天可能引入几十个新依赖,而你的 npm token 就是攻击者的目标。与其事后补救,不如把防线前置。
安装 SupplyChain Sentry,给你的依赖树做一次 CT 扫描:
npm install -g supplychain-sentry
cd your-project
sentry-scan
如果你喜欢它,欢迎在 GitHub 上点个 Star,或者贡献一条新的检测规则。一起让 npm 生态更安全。
本文作者:[lichen-zhang]
首发于:[Dev.to]
项目开源地址:https://github.com/lichen-zhang/supplychain-sentry
npm 地址:https://www.npmjs.com/package/supplychain-sentry
安全不是一次性的配置,而是每个
npm install前的习惯。
Top comments (0)