DEV Community

lichen-zhang
lichen-zhang

Posted on

如何在恶意包进入你的项目前阻断它?用 SupplyChain Sentry 给 npm 依赖上个保险

SupplyChain Sentry 是什么?

它是一个 零依赖的命令行工具,在安装依赖前对 package-lock.json(或 pnpm-lock.yaml)中的每一个包进行快速扫描,从三个维度评估风险:

  1. 静态规则引擎

    检测 install 脚本中是否存在可疑模式,比如 eval()、动态网络请求、文件系统写入等。

  2. 信誉评分系统

    综合包的下载量、维护者数量、最近更新时间、依赖复杂度等,给出一个 0–100 的可信度分数。

  3. 行为模拟沙盒(可选)

    对高风险包在隔离的 Docker 容器中模拟执行 install 脚本,监控其真实行为——是正常写入缓存,还是偷偷向外发送数据。

输出结果一目了然:每个包的风险等级(Critical / High / Medium / Low),并附上具体的风险证据。


三步上手,立即保护你的项目

第 1 步:全局安装

npm install -g supplychain-sentry
# 或用 pnpm / bun
pnpm add -g supplychain-sentry
Enter fullscreen mode Exit fullscreen mode

第 2 步:进入项目目录并运行

cd your-project
sentry-scan
Enter fullscreen mode Exit fullscreen mode

工具会自动识别 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)         │
└─────────────────────────┴──────────┴──────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

如果出现了 CRITICALHIGH 的包,建议先不要安装它,或者寻找替代包。你也可以通过 --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)
Enter fullscreen mode Exit fullscreen mode

这明显是一个收集系统信息的恶意包。我立即在团队内部通报,并转而使用另一个经过审计的数学库。整个过程不到 30 秒

想象一下,如果我把这个包安装到了生产环境——恶意脚本可能会在构建阶段就将环境变量、源码信息全部泄露出去。


它为什么能提前阻断?

SupplyChain Sentry 的核心思路是 “信任但不能不验证”

传统的 npm audit 依赖已知漏洞数据库(CVE),只能发现已被公开的漏洞,对零日供应链攻击无能为力。而 SupplyChain Sentry 采取 启发式检测

  • 很多恶意包为了维持持久化或盗取信息,会在 install 脚本中使用 动态代码执行evalnew 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   # 发现高危包时中断构建
Enter fullscreen mode Exit fullscreen mode

然后在 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
Enter fullscreen mode Exit fullscreen mode

如果你喜欢它,欢迎在 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)