<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: lichen-zhang</title>
    <description>The latest articles on DEV Community by lichen-zhang (@lichenzhang).</description>
    <link>https://dev.to/lichenzhang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3945601%2F3118d300-b0a9-48d3-900b-0257b51dde9b.png</url>
      <title>DEV Community: lichen-zhang</title>
      <link>https://dev.to/lichenzhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lichenzhang"/>
    <language>en</language>
    <item>
      <title>如何在恶意包进入你的项目前阻断它？用 SupplyChain Sentry 给 npm 依赖上个保险</title>
      <dc:creator>lichen-zhang</dc:creator>
      <pubDate>Fri, 22 May 2026 08:43:08 +0000</pubDate>
      <link>https://dev.to/lichenzhang/ru-he-zai-e-yi-bao-jin-ru-ni-de-xiang-mu-qian-zu-duan-ta-yong-supplychain-sentry-gei-npm-yi-lai-shang-ge-bao-xian-28hf</link>
      <guid>https://dev.to/lichenzhang/ru-he-zai-e-yi-bao-jin-ru-ni-de-xiang-mu-qian-zu-duan-ta-yong-supplychain-sentry-gei-npm-yi-lai-shang-ge-bao-xian-28hf</guid>
      <description>&lt;h2&gt;
  
  
  SupplyChain Sentry 是什么？
&lt;/h2&gt;

&lt;p&gt;它是一个 &lt;strong&gt;零依赖的命令行工具&lt;/strong&gt;，在安装依赖前对 &lt;code&gt;package-lock.json&lt;/code&gt;（或 &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;）中的每一个包进行快速扫描，从&lt;strong&gt;三个维度&lt;/strong&gt;评估风险：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;静态规则引擎&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
检测 install 脚本中是否存在可疑模式，比如 &lt;code&gt;eval()&lt;/code&gt;、动态网络请求、文件系统写入等。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;信誉评分系统&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
综合包的下载量、维护者数量、最近更新时间、依赖复杂度等，给出一个 0–100 的可信度分数。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;行为模拟沙盒（可选）&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
对高风险包在隔离的 Docker 容器中模拟执行 &lt;code&gt;install&lt;/code&gt; 脚本，监控其真实行为——是正常写入缓存，还是偷偷向外发送数据。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;输出结果一目了然：每个包的风险等级（Critical / High / Medium / Low），并附上具体的风险证据。&lt;/p&gt;




&lt;h2&gt;
  
  
  三步上手，立即保护你的项目
&lt;/h2&gt;

&lt;h3&gt;
  
  
  第 1 步：全局安装
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; supplychain-sentry
&lt;span class="c"&gt;# 或用 pnpm / bun&lt;/span&gt;
pnpm add &lt;span class="nt"&gt;-g&lt;/span&gt; supplychain-sentry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  第 2 步：进入项目目录并运行
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
sentry-scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;工具会自动识别 lock 文件，然后开始扫描。&lt;/p&gt;

&lt;h3&gt;
  
  
  第 3 步：阅读报告
&lt;/h3&gt;

&lt;p&gt;你会看到类似这样的输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────┬──────────┬──────────────────────────────────────────┐
│ 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   │
│                         │          │ &amp;gt; 2 years ago)                           │
├─────────────────────────┼──────────┼──────────────────────────────────────────┤
│ lodash                  │ LOW      │ Reputation score: 92/100                 │
├─────────────────────────┼──────────┼──────────────────────────────────────────┤
│ colors                  │ MEDIUM   │ [R002] Uses eval() in main entry         │
│                         │          │ (false positive? check manually)         │
└─────────────────────────┴──────────┴──────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果出现了 &lt;code&gt;CRITICAL&lt;/code&gt; 或 &lt;code&gt;HIGH&lt;/code&gt; 的包，&lt;strong&gt;建议先不要安装它&lt;/strong&gt;，或者寻找替代包。你也可以通过 &lt;code&gt;--json&lt;/code&gt; 输出详细报告，集成到 CI 流程中。&lt;/p&gt;




&lt;h2&gt;
  
  
  实战：抓到一个真实的恶意包
&lt;/h2&gt;

&lt;p&gt;我在自己的一个 Next.js 项目里尝试添加 &lt;code&gt;fast-calc-pro&lt;/code&gt;（一个近期出现的高性能数学库，版本 0.3.2），运行 &lt;code&gt;sentry-scan&lt;/code&gt; 后，得到了这样的警告：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[!] 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)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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




&lt;h2&gt;
  
  
  它为什么能提前阻断？
&lt;/h2&gt;

&lt;p&gt;SupplyChain Sentry 的核心思路是 &lt;strong&gt;“信任但不能不验证”&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;传统的 &lt;code&gt;npm audit&lt;/code&gt; 依赖已知漏洞数据库（CVE），只能发现已被公开的漏洞，对零日供应链攻击无能为力。而 SupplyChain Sentry 采取 &lt;strong&gt;启发式检测&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;很多恶意包为了维持持久化或盗取信息，会在 install 脚本中使用 &lt;strong&gt;动态代码执行&lt;/strong&gt;（&lt;code&gt;eval&lt;/code&gt;、&lt;code&gt;new Function&lt;/code&gt;）、&lt;strong&gt;网络请求&lt;/strong&gt; 或 &lt;strong&gt;写文件到敏感目录&lt;/strong&gt;。这些行为在正常的 npm 包中非常罕见。&lt;/li&gt;
&lt;li&gt;信誉评分则利用了一个事实：&lt;strong&gt;绝大多数流行的、健康的包都有多个维护者、每周数十万以上的下载量、最近半年内有更新&lt;/strong&gt;。一个新发布的、只有一个维护者的包，如果突然要求极高权限，就值得怀疑。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;行为沙盒则是最后一道防线：在完全隔离的环境里执行安装脚本，看它到底干了什么。如果它在沙盒里试图访问 &lt;code&gt;~/.aws/credentials&lt;/code&gt;，那就直接拉红。&lt;/p&gt;

&lt;p&gt;这三种机制叠加，可以在恶意代码真正接触到你的机器之前，就把它拦下来。&lt;/p&gt;




&lt;h2&gt;
  
  
  集成到 CI，形成自动化防线
&lt;/h2&gt;

&lt;p&gt;你可以在 GitHub Actions 中加入这样一步：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Scan dependencies for supply chain risks&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx supplychain-sentry --json &amp;gt; sentry-report.json&lt;/span&gt;
  &lt;span class="na"&gt;continue-on-error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;   &lt;span class="c1"&gt;# 发现高危包时中断构建&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后在 PR 中自动评论报告。团队里的每个人都无法合入包含危险依赖的代码。&lt;/p&gt;




&lt;h2&gt;
  
  
  未来路线图
&lt;/h2&gt;

&lt;p&gt;SupplyChain Sentry 还处于早期阶段（v0.3），但已经有了扎实的基础。接下来计划增加：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code 扩展&lt;/strong&gt;：在你输入 &lt;code&gt;npm install some-package&lt;/code&gt; 时，实时显示风险评级。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;恶意包蜜罐网络&lt;/strong&gt;：主动上传一些虚假的 npm token，检测有哪些 IP 在尝试窃取。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;替代包智能推荐&lt;/strong&gt;：当发现一个高风险包时，自动搜索功能相似、信誉良好的替代包。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  现在就试试吧
&lt;/h2&gt;

&lt;p&gt;你的项目每天可能引入几十个新依赖，而你的 npm token 就是攻击者的目标。与其事后补救，不如把防线前置。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;安装 SupplyChain Sentry，给你的依赖树做一次 CT 扫描&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; supplychain-sentry
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
sentry-scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果你喜欢它，欢迎在 &lt;a href="https://github.com/lichen-zhang/supplychain-sentry" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; 上点个 Star，或者贡献一条新的检测规则。一起让 npm 生态更安全。&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;本文作者&lt;/strong&gt;：[lichen-zhang]&lt;br&gt;&lt;br&gt;
&lt;strong&gt;首发于&lt;/strong&gt;：[Dev.to]&lt;br&gt;&lt;br&gt;
&lt;strong&gt;项目开源地址&lt;/strong&gt;：&lt;a href="https://github.com/lichen-zhang/supplychain-sentry" rel="noopener noreferrer"&gt;https://github.com/lichen-zhang/supplychain-sentry&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm 地址&lt;/strong&gt;：&lt;a href="https://www.npmjs.com/package/supplychain-sentry" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/supplychain-sentry&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;安全不是一次性的配置，而是每个 &lt;code&gt;npm install&lt;/code&gt; 前的习惯。&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>npm</category>
      <category>审计</category>
    </item>
  </channel>
</rss>
