文章分析了 npm 依赖供应链攻击的风险,指出攻击者可以通过篡改深层依赖项来影响用户,尤其是在 Web3 领域,前端直接处理交易签名,风险更高。文章建议通过减少依赖、自建核心模块、使用 IPFS CID 验证构建产物等方法来降低风险。
最新的 npm 泄露事件表明,依赖供应链深处的一个微小变化如何重写用户所见、签名和发送的内容。
在 2025 年 9 月 8 日,攻击者通过网络钓鱼攻击了一位知名的 npm 维护者,并推送了 18 个软件包的恶意版本,包括 chalk
和 debug
——总共代表了每周 数十亿次 的下载量。该有效载荷Hook了浏览器 API ( fetch
、XMLHttpRequest
、window.ethereum
等) 以 拦截钱包交互并重写支付目的地,在此过程中劫持资金。安全公司 和 媒体 将入侵追溯到一个极具说服力的“npm support”仿冒域名,并 记录 了 drainer 的行为。
对于防御者来说,有两点很重要:
在 Node/JS 中,大多数风险是 间接 隐藏的。Snyk 报告称, 大约 86% 的 Node.js 漏洞出现在传递依赖中,而不是你自己选择的依赖项。这是你在代码审查中看不到的部分。
Node 的解析器很乐意安装同一库的 多个 版本,以满足冲突的范围。npm 有一个 dedupe
命令和一个 --prefer-dedupe
开关,但默认设置通常 favore 更的版本——即使这增加了重复。在实践中,你会发布一个包含多个 ansi-*
变体的捆绑包,每个变体都有自己的更新和风险状况。
现代 npm 支持 "overrides"
,以强制在整个图中使用嵌套的 依赖项 的单个版本,但团队仍然报告了尖锐的边缘。你 可以 在任何地方固定 ansi-regex
,但你现在正在自己维护树的一部分。
你从 registry 安装的 package 不需要与你略读的 GitHub repo 匹配。攻击者利用了这个差距。
所有这些使得“验证每个依赖项”更接近于一个研究项目,而不是一个构建步骤。
将 devDependencies
视为生产级别的风险。攻击者喜欢它们,因为它们会进入你的笔记本电脑、你的 CI 和你的Token。
恶意的 @nx/*
版本在 macOS/Linux 上运行了一个 post-install 脚本,该脚本收集了 SSH 密钥、npm/GitHub Token、.env 文件和钱包,然后使用 AI CLI 工具 (Claude, Gemini) 进行侦察和数据泄露——在受害者的 GitHub 帐户中创建一个“s1ngularity-repository”。这是开发工具作为 一切 的入口点。
网络钓鱼导致了流行的 lint/format 软件包的 恶意版本——再次,是面向开发人员的组件。
当开发工具变坏时,会发生两件事:你会丢失密钥,并且你的 前端构建 可能会被污染——导致面向用户的泄露。
加密货币用户不仅仅是阅读你的网站;他们还会 从你的网站签署交易。这就是为什么攻击不断围绕钱包展开的原因:
NPM_CONFIG_IGNORE_SCRIPTS=true
并运行 npm ci
。这 阻止 preinstall/postinstall
Hook——这是在几个开发工具泄露中使用的向量。(如果你确实需要脚本,则按软件包选择加入。)嘲笑重建小型实用程序的文化将我们推向了庞大的图中,在这些图中,维护人员糟糕的一天——或者一次网络钓鱼——可能会变成你用户的钱包被掏空。9 月 8 日对 chalk
/ debug
的攻击表明,对手需要破坏 DApp 的 前端 和 钱包流程 的代码是多么的少。退回到更少的依赖项,自己编写核心构建块(如 cells),以及用 可验证的 artifacts(IPFS CIDs,provenance)标记 releases 不是纯粹主义;而是风险管理。
- 原文链接: blog.blockmagnates.com/n...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!