npm 供应链安全

npm 供应链安全:您的漏洞扫描器找错地方了。

简而言之:npm 供应链安全超越了漏洞扫描器

npm 供应链安全是指确保 JavaScript 项目安装的每个包都是合法、未修改且安全的实践。 不仅仅是没有已知漏洞。

  • 差距: 传统的 npm 漏洞扫描器会将软件包与 CVE 数据库进行比对。如果恶意软件包没有对应的 CVE 编号,则会通过扫描。
  • 证据: 2026 年 3 月,一个被劫持的维护者帐户将每周下载量超过 1 亿次的 axios 变成了恶意软件传播渠道,持续了大约三个小时。
  • 切入点: 大多数 npm 攻击都是通过安装脚本进行的,这些脚本会在你输入命令的那一刻执行。 npm install.
  • 修复: 在软件包发布时(而不是在 CVE 出现之后)检测恶意行为,并加强安装运行方式。

2026年3月31日,数千名开发者运行了一条最普通的JavaScript命令: npm install他们中的一些人更新了axios版本,axios是全球绝大多数Web应用程序中使用的HTTP客户端。他们的依赖项扫描器显示一切正常,构建也顺利通过。然而,一个远程访问木马却悄无声息地潜入了他们的机器。

那件事本身并没有涉及任何漏洞。正因如此,很多 npm 安全程序才没能发现它。

axios 发生了什么事

这次袭击手法简单而耐心。据…… axios 维护者自己的事后分析攻击者通过主要维护者的被盗账户发布了两个恶意版本,分别是 1.14.1 和 0.30.4。攻击者没有修改任何一行 axios 代码,只添加了一个新的依赖项。 plain-crypto-js运行 postinstall 获取第二阶段有效载荷的脚本。

微软威胁情报部门将该基础设施归因于此。 被标记为 Sapphire Sleet,一个朝鲜国家行为体。这些被篡改的版本存在了大约三个小时,之后 npm 将其移除。对于任何 CI pipeline 或者在那个时间段内安装的笔记本电脑,三个小时就足够了。

这并非个例。2025年9月,Shai-Hulud蠕虫通过窃取维护者令牌并重新发布自身,在数百个npm软件包中传播开来。不同的技术,同样的教训:在npm中,信任是自动继承的,而攻击者深谙此道。

为什么你的 npm 漏洞扫描器没有发出任何警报

大多数团队将 npm 供应链安全视为漏洞问题。他们运行 npm 漏洞扫描器,将依赖树与已知缺陷数据库进行比对,然后修复扫描器报告的问题。这项工作固然重要,但它回答的是另一个问题。

维度易受攻击的软件包恶意包裹
它是什么合法代码存在漏洞编写用来伤害你的代码
是否有CVE编号?通常最终几乎从不
危险的时候当漏洞可被利用时安装的那一刻
它被什么吸引住了漏洞数据库查询对软件包本身的行为分析
所需典型响应时间几天到几周分钟到几小时

漏洞数据库只能描述已被他人分析和编目的漏洞。一个一小时前发布的恶意软件包在任何地方都找不到记录。因此,扫描器返回“干净”,而“干净”就被解读为“安全”。

这就是 npm 供应链安全的核心转变:问题不再是“这个包是否有已知的缺陷?”,而是“这个包是否在做它不应该做的事情?”

攻击者入侵 node_modules 目录的四种方法

  • 帐户接管。 窃取维护者的凭证或令牌,然后发布一个被篡改的、用户已经信任的软件包版本。这是 axios 的惯用伎俩,也是最难被发现的,因为软件包名称完全正确。
  • 注册近似域名. 发布 axois or reqeusts 然后等待拼写错误、从糟糕的教程中复制粘贴的内容,或者人工智能编码助手建议错误的名称。
  • 依赖混乱. 发布一个与内部软件包同名的公共软件包。如果你的注册表设置优先选择公共软件包,那么你就会安装攻击者的代码。
  • 安装脚本。 以上几乎所有内容都有一个共同点:npm 让软件包能够运行。 preinstall 和 postinstall 脚本会自动执行,因此恶意代码会在任何人导入任何内容之前执行。 CISA 对公理妥协的指导 建议设置 ignore-scripts=true 预cis正是出于这个原因。

npm 供应链安全在实践中是什么样的

你不可能仅靠一种控制手段就阻止所有攻击。但你可以通过养成一些习惯,让自己更难成为攻击目标:

  1. Commit 你的锁定文件并进行安装 npm ci. 构建版本应该安装经过审核的内容,而不是安装注册表当天早上提供的任何内容。
  2. 默认情况下禁用安装脚本。 米 ignore-scripts=true 并且只允许真正需要脚本的软件包使用脚本。
  3. 确定内部软件包的范围。 未限定作用域的内部名称很容易导致依赖关系混乱。
  4. 检查来源。 npm 支持 出处声明 这些链接将已发布的软件包与其源代码和构建版本关联起来。如果一个项目通常会提供这些链接,但突然发布一个没有链接的版本,这是一个值得警惕的信号,应该将其自动化。
  5. 将漏洞扫描与恶意软件检测相结合。 保留 npm 漏洞扫描器以检测已知漏洞,并添加检测功能来分析新软件包的实际行为。

第五个习惯是大多数球队都会忽略的,也是 axios 攻击所暴露出来的。

在恶意软件包命名之前将其捕获。

Xygeni 的 恶意软件预警 (MEW) 它会在新软件包发布后立即扫描公共注册表(包括 npm)上的软件包,并分析其代码行为,而不是等待已知的签名。当某个软件包被标记时,受影响的用户会通过电子邮件、即时通讯平台或网页收到通知。hooks包裹已被隔离。 你可以在这里阻止它 CI/CD guardrails.

周围, Xygeni 的 open source security 它还能捕获上述四种攻击路径所依赖的其他漏洞:域名抢注、依赖项混乱、可疑的安装脚本以及未限定作用域的内部 npm 组件。此外,它还涵盖了来自 NVD、OSV 和 GitHub 安全公告的已知漏洞,并按可访问性进行优先级排序,以便您修复真正可被利用的漏洞,并实现自动修复功能。 pull requests 进行修复。

MEW包含在免费的开发者计划中。 免费开始 几分钟内即可扫描您的第一个 npm 项目。

常见问题解答

npm供应链安全是什么?

npm 供应链安全涵盖了 JavaScript 项目所依赖的软件包带来的所有风险:已知漏洞、恶意软件包、维护者账户被盗用、域名抢注和依赖关系混乱。它不仅进行漏洞扫描,还能验证您安装的内容是否合法。

npm漏洞扫描器能否检测到恶意软件?

通常不会。传统的 npm 漏洞扫描器会将软件包与已知漏洞数据库进行比对。新发布的恶意软件包在数据库中没有对应的条目,因此除非该工具还分析了软件包的行为,否则它会通过扫描。

Is npm audit 足够?

npm audit 是一个有用的免费基准测试工具,用于检测已知漏洞。但它无法检测新发布的恶意软件、域名抢注或依赖关系混乱,也无法告知您代码中是否存在可访问的易受攻击函数。

如何判断一个软件包是否恶意?

警告信号包括下载或执行远程代码的安装脚本、混淆的代码、与软件包用途无关的网络调用、源存储库从未引用的新依赖项,以及没有项目通常发布的来源信息的版本。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
注册免费账号。
不需要信用卡。

确保您的软件开发和交付安全无虞

使用 Xygeni 产品套件