本文分析了Web3项目JavaScript供应链安全的五大攻击向量:恶意npm包发布(2025年9月18个包影响20亿周下载量)、维护者账户被攻破(@solana/web3.js和dYdX事件)、依赖混淆攻击、包名钓鱼(如solana-py)以及CI/CD注入(构建工具篡改最终代码)。文章强调,即使智能合约审计完美,前端构建管线被攻破也会导致资金被盗。提供了详细检查清单,包括锁定版本、使用私有注册表、实施可重复构建等防御措施。
你的 JavaScript 依赖项是直接访问用户资金的通道。你的构建流水线是铸造信任——或者摧毁信任的熔炉。
2024 年,23 起针对加密货币的供应链攻击中,有 14 起针对 npm( The Hacker News)。在 2025 年 9 月的攻击中,Wiz 报告称约 10% 的分析云环境中至少包含一个被攻陷的包( Wiz.io 分析)。
这对 Web3 来说改变了一切:
本文通过真实事件和实用检查清单,分解了五个关键攻击向量。
发生了什么:2025 年 9 月 8 日,威胁行为者通过 npmjs.help 钓鱼攻击维护者 Josh Junon,并在 2 小时内发布了 15 多个广泛使用的包的恶意版本:
debug@4.4.2, chalk@5.6.1, ansi-styles@6.2.2, strip-ansi@7.1.1, color-convert@3.1.1, wrap-ansi@9.0.1 等
这些包合计每周下载量超过 20 亿次。
运作方式:攻击者拦截了浏览器 API(fetch、XMLHttpRequest)和钱包调用(window.ethereum.request、Solana 签名)。恶意软件扫描区块链地址(ETH、BTC、SOL、LTC、BCH、TRX)并将交易接收方修改为攻击者钱包,使用相似地址以逃避检测。
影响:
成功原因:
当攻击者获得合法包的发布凭证时,他们绕过了所有的信任假设。两个主要事件展示了这种模式:
2024 年 12 月 2 日,攻击者使用被盗的维护者账号发布了 @solana/web3.js 的恶意版本(v1.95.6、v1.95.7)。这是官方的 Solana JavaScript 库,月下载量约 5000 万,依赖项目超过 3000 个。
后门函数 addToQueue 将私钥外泄到 sol-rpc[.]xyz。ReversingLabs 的分析发现 14 个修改过的文件包含 C2 网址( ReversingLabs 研究)。GitHub 安全公告:"任何安装或运行此包的计算机都应被视为完全被攻陷。"
与钓鱼攻击的关键区别:
出了什么问题:社会工程攻击攻陷了维护者的发布账号。恶意代码存活了 5.5 小时后才被检测并移除。
经验教训:
实际影响:应急响应团队报告称在巨大压力下争分夺秒地隔离受影响的机器、强制轮换密钥并从干净缓存重建。一个 DeFi 团队不得不在安全公告发布后一小时内从三台机器上转移密钥。
2026 年 1 月 27 日,攻击者使用被盗的发布凭证发布了 @dydxprotocol/v4-client-js(npm)和 dydx-v4-client(PyPI)的恶意版本。这是对官方 dYdX 开发者账号的直接账号接管。
攻击者在 npm 上发布了版本 3.4.1、1.22.1、1.15.2 和 1.0.31,在 PyPI 上发布了 1.1.5post1——所有版本看起来都像是官方维护者的合法更新。
npm 载荷:钱包窃取器嵌入在 registry.ts 中,将种子短语外泄到 dydx.priceoracle[.]site
PyPI 载荷:钱包窃取器 + 远程访问木马(RAT)用于任意代码执行
dYdX 的回应:"任何安装了这些包的计算机都应被视为被攻陷"( 来源)——详见 Socket.dev 的技术分析( Socket.dev 分析)。
关键洞察:两次攻击都展示了同样的模式——当攻击者拥有密钥时,他们不需要漏洞。dYdX 事件显示了升级:同时攻陷两个生态系统(npm + PyPI)并带有复杂的载荷。
机制
由 Alex Birsan 发现,依赖混淆利用了包管理器解析内部依赖与公共依赖的方式:
@company/auth(私有仓库)@company/auth 以更高版本号发布到公共 npm为什么 DeFi 容易受到攻击:
@yourprotocol/cli)通常在前端产物中暴露pip --extra-index-url(添加公共索引)而非 --index-url(仅替换为私有索引)根本原因:包管理器无论来源如何都选择最高版本(pip --extra-index-url 行为,某些 Artifactory 虚拟仓库配置)。
修复:
--index-url(仅指向私有索引,绝不使用 --extra-index-url)注意:虽然目前没有大型 DeFi 协议公开确认过依赖混淆入侵,但攻击面巨大且理论上可被利用。
2025 年 9 月的 npm 攻击始于 npmjs.help——一个用于钓鱼维护者的域名。这种攻击之所以成功,是因为:
@solana/web3.js、ethers-ts、viem-utilssolana(PyPI) vs solana-py(GitHub)近期 Web3 示例:
solana(PyPI) vs solana-py(GitHub)——恶意 Solana Python API 窃取加密密钥( Sonatype 报告)truffle-vscode vs truffle-for-vscode——从钱包开发人员处窃取密钥( Mend.io)bip39 变种——针对 BIP39 钱包生成器防御措施:
@solana/web3.js)——更难伪造机制
构建时依赖注入发生在构建工具链本身被攻陷时——不是包,而是产生最终 JavaScript 产物的工具。目标包括:
postinstall、prepare、prepublish Hook运作方式:
dist/bundle.js 中为什么 Web3 尤其容易受到攻击:
DeFi 前端执行关键操作:
window.ethereum.request()一个被攻陷的打包器可以:
router 改为 attackertype(uint256).max)具体示例(AST 操作):
// 源代码中的原始内容:
ethers.sendTransaction({ to: router, value: amount });
// 恶意插件将其转换为:
ethers.sendTransaction({ to: attacker, value: type(uint256).max });
你审查的代码(src/)不是用户执行的代码(dist/)。
现实中的类似案例:
为什么在 Web3 中几乎没人谈论这个:
大多数审计关注的是:
但前端构建完整性很少被验证。结果是:经过完美审计的合约被抽干,因为前端构造了恶意 calldata。
缓解措施:
git clone → npm ci → npm build 必须在不同机器上产生相同的哈希值hash(bundle) == expected_hash 时部署(在 CI 中存储哈希,发布前验证)postinstall、prepare、prepublish Hook数字不会说谎:
旧模式:"审计合约,忽略前端"——已过时
新现实:每个依赖项和每个构建工具都是潜在的交易劫持向量
即使经过完美审计的智能合约,如果前端构建流水线被攻陷,也可能被抽干。安全必须超越合约,延伸到整个软件供应链。
从这里开始:检查你的直接暴露
grep -E "debug|chalk|ansi|@solana/web3.js" package-lock.json
然后运行这份完整检查清单:
package.json 中移除浮动版本(^、~)。在锁定文件中使用确切版本。package-lock.json / yarn.lock 中是否有你不认识的包。@solana/web3.js、ethers、wagmi、viem 处于未受攻陷的版本。integrity 哈希值。npm cache clean --force。--index-url(绝不使用 --extra-index-url);npm 分离仓库;不要混合内部和外部源。@yourorg/* 命名。git clone → npm ci → npm build 在干净环境中产生相同的产物哈希值。postinstall、prepare、prepublish。如果任何一项检查失败,请停止下一次发布并立即修复。
在 Zealynx,我们审计全栈 Web3 安全——智能合约、前端和供应链。因为用户的资金依赖于每一个层面。
准备好保护你的构建流水线了吗?通过 zealynx.io/quote 联系我们进行全面的供应链审查。
欲了解更多影响 DeFi 的 Web2 基础设施风险,请查看我们关于 DNS 劫持和前端攻陷 的文章。
npm audit 能检测到这些攻击吗?
不能。供应链攻击的速度太快,漏洞数据库跟不上。你需要主动监控,而不仅仅是 CVE 扫描。
如何知道自己是否已被攻陷?
搜索受影响版本的构建日志。扫描已部署的 JavaScript 产物中已知的恶意模式。检查暴露窗口期间链上交易是否有意外的接收方变更。
我是否应该停止使用 npm?
不应该——但请使用不可变构建和带有严格白名单的私有仓库。风险在于自动更新,而非包管理器本身。
Yarn 和 pnpm 安全吗?
如果配置不当,它们仍然容易受到包混淆攻击。问题在于仓库配置,而非客户端。
GitHub Dependabot 呢?
如果维护者账号被攻陷,它可能会引入恶意代码。锁定版本,并手动审查所有生产版本的依赖更新。
锁定文件能保护我吗?
它们可以防止意外升级,但如果开发者本地缓存已被攻陷,锁定文件也无济于事。在任何安全事件后,务必从干净缓存进行全新安装。
| 术语 | 定义 |
|---|---|
| 供应链攻击 | 对受信任的软件组件(库、包、构建工具)的攻陷,该攻陷会级联影响多个组织。 |
| 钓鱼攻击 | 社会工程技术,通过相似的包名或域名欺骗用户安装恶意包或泄露凭证。 |
| 子资源完整性(SRI) | 安全特性,验证加载的 JavaScript 文件是否与加密哈希匹配,以检测篡改。 |
- 原文链接: zealynx.io/blogs/Supply-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码