一场波及 18 个流行 JavaScript 软件包的供应链攻击正在引发全球开发者社区的震动。这些包通过 npm(Node.js 的包管理平台)分发,每周下载量合计超过 20 亿次。攻击者利用钓鱼邮件攻破维护者账户,在代码中植入恶意脚本,目标直指用户加密货币钱包。

尽管攻击范围空前,但其手法却异常简单:一封伪造的“双因素认证重置”邮件,一个伪造域名,一次点击。
攻击方式:伪装成官方邮件,窃取账户控制权
根据安全公司 Aikido 的披露,攻击者并未采用复杂的漏洞利用或零日攻击,而是通过经典的社会工程手段得手。
受害者是多个高下载量 npm 包的维护者,其在 Bluesky 上的用户名为 “bad-at-computer”。他收到一封来自 [email protected] 的邮件,声称需要重置双因素认证(2FA)。邮件设计逼真,看似来自 npm 官方,导致维护者误以为是正常流程,进而泄露了账户权限。
随后,攻击者登录其 npm 账户,发布包含恶意代码的新版本软件包。
⚠️ 关键细节:npm 官方域名是
npmjs.com
,而攻击者使用了npmjs.help
——一个极易被忽略的细微差别。
恶意行为:静默劫持 Web3 钱包
被篡改的代码会在用户浏览器中静默执行,主要功能包括:
- 拦截加密货币交易请求
- 篡改钱包签名授权
- 将支付目标地址替换为攻击者控制的钱包
这意味着,当用户在支持 Web3 的网站上进行转账或授权操作时,原本发往目标地址的资金,可能被悄悄重定向至攻击者账户,而用户界面无明显异常。
受影响的区块链包括:以太坊、比特币、Solana、Tron、莱特币和比特币现金。
受影响范围有多大?
虽然这 18 个包每周下载量高达 20 亿次,但实际风险需理性评估:
- 大量下载来自自动化构建系统(CI/CD)的依赖拉取,并非全部代表活跃终端应用;
- 恶意代码主要在浏览器端执行,因此仅影响将这些包用于前端项目的应用;
- 攻击者选择的是“静默窃取”而非“大规模破坏”,未触发系统崩溃或数据删除。
但这绝不意味着可以掉以轻心。一个被广泛依赖的开源包一旦被攻破,其影响链条可能延伸至金融、电商、社交等多个关键领域。
为什么这类攻击屡禁不止?
此次事件再次暴露了开源生态的核心脆弱性:
- 维护者安全意识不足
即使是管理关键基础设施的开发者,也可能因一封钓鱼邮件失守。 - 身份验证机制薄弱
npm 账户虽支持 2FA,但缺乏对登录来源的严格验证,且第三方仿冒域名难以防范。 - 生态高度依赖“信任”
开发者普遍默认“npm 上的包是可信的”,缺乏对依赖项的持续监控。 - SBOM 与自动化检测仍未普及
软件物料清单(SBOM)和依赖扫描工具尚未成为标准开发流程。
行业在做什么?
近年来,业界已尝试多种缓解措施:
- 鼓励高影响力包维护者启用 2FA
- 推动自动化漏洞扫描与签名验证
- 建立开源安全基金会(OpenSSF)提供资助与工具
但正如本次事件所示,技术手段无法完全弥补人为漏洞。一个维护者的失误,足以让整个生态系统陷入风险。
我们能做什么?
角色 | 建议措施 |
---|---|
开发者 | 审查项目依赖,使用 npm audit 或 Snyk 等工具扫描恶意包;避免盲目更新 |
维护者 | 启用 2FA,警惕非常规邮件;考虑使用硬件密钥(如 YubiKey)增强账户安全 |
企业 | 建立私有包仓库,对第三方依赖进行隔离与审计 |
所有用户 | 不在不可信网站连接 Web3 钱包,定期检查钱包授权记录 |
这次只为了钱,下次呢?
幸运的是,攻击者的目标是获利而非破坏。他们没有删除代码、瘫痪服务或植入勒索软件。否则,后果可能远超一次加密货币盗窃。
这像极了文章开头的比喻:灭霸集齐无限手套,却没有消灭一半生命,而是去偷钱包。我们松了一口气,但手套仍在他人手中。
开源是现代软件的基石,但它建立在脆弱的信任链之上。在开发流程未从根本上改变之前,下一次“响指”随时可能发生。
评论