npm 上的 `debug` 和 `chalk` 等软件包被黑客入侵了


从北京时间(UTC+8)9月8日晚上9点16分开始,我们的安全系统(Aikido intel feed)发出警报,发现一系列被上传到 npm(一个非常流行的 JavaScript 代码包仓库)的软件包包含了恶意代码。这些可不是什么冷门包,而是 18 个极其流行、每周下载量巨大的包,其中包括大家非常熟悉的 chalk(用于终端输出颜色)和 debug(用于调试)。

这些被黑的包包括:
*   ansi-styles (每周下载 3.7 亿次)
*   debug (每周下载 3.5 亿次)
*   chalk (每周下载 3 亿次)
*   ... (以及其他15个相关包,列表很长)

所有这些包加在一起,每周总下载量超过 20 亿次! 影响范围非常广。

恶意代码做了什么?

这些包的新版本被偷偷加入了一段恶意代码。当你的网站或应用使用了这些被入侵的包,并且用户在浏览器中访问时,这段代码就会悄悄执行。

它的目的是窃取加密货币。它会:
1.  静默监控 浏览器里任何与加密货币(Crypto)和 Web3(比如连接钱包、交易)相关的活动。
2.  操纵钱包交互:当用户发起转账或交易授权时,代码会在背后偷偷把收款地址换成黑客控制的地址
3.  毫无痕迹:用户看到的一切可能都是正常的,但在点击确认后,资金就会被转到黑客的钱包里,用户却完全察觉不到。

(作者在这里插入了广告:为了避免被这种包侵害,可以看看我们的 Aikido safe-chain 产品!)

技术细节(简单版)

黑客发布的包看起来像是正常的版本更新。但里面的代码经过了“混淆”(就像把代码加密弄乱,让人一眼看不明白)。

把这些乱码解密后,我们发现这是一段非常复杂的代码。它的核心工作是:

1.  注入浏览器:代码会“钩住”(Hook)浏览器的核心功能,比如网络请求 (fetch, XMLHttpRequest) 和钱包的 API(如 window.ethereum)。
2.  监控流量:它会检查所有网页加载的内容和网络请求返回的数据。
3.  寻找地址:它在文本里疯狂搜索看起来像加密货币钱包地址的字符串(支持比特币、以太坊、Solana、Tron 等多种币种)。
4.  偷梁换柱:一旦找到合法的地址,就把它替换成一个预先准备好的、黑客的地址。为了不那么明显,它还会用一些算法找一个和原地址看起来最像的黑客地址来替换。
5.  直接篡改交易:对于即将要签名的交易数据,它更是直接修改里面的“收款人”和“授权对象”字段,换成黑客的地址。即使用户界面显示正确,实际签名的交易也是指向黑客的。

总之,这个恶意软件在多个层面作恶:修改网页显示的内容、篡改API调用、操纵交易数据,而且非常隐蔽。

黑客是怎么得手的?——钓鱼邮件

这些流行包的维护者(作者)是怎么被黑的呢?是通过钓鱼邮件

黑客冒充 npm 官方支持,发送了一封邮件到维护者的邮箱,邮件来自 support@npmjs.help
这个域名 npmjs.help 是黑客在三天前(9月5日)刚刚注册的,专门用来干这坏事。

维护者的反应

我们发现后,在社交媒体 Bluesky 上联系了受影响的维护者。他在北京时间晚上11点15分左右回复说,他已经意识到自己的账户被黑了,并开始清理这些被入侵的软件包。

大部分被黑的包都被作者及时删除了,但截至作者写这篇文章时,simple-swizzle 这个包仍然是被入侵的状态。

维护者还在 HackerNews 论坛上说明了情况。

攻击还在继续

到了北京时间9月9日凌晨12点58分,我们的系统又检测到另一个包 (proto-tinker-wc@0.1.87) 被同一伙黑客用类似手段入侵了。这说明攻击者还在活跃。

如何判断自己是否受影响?(入侵指标)

*   钓鱼域名npmjs.help
*   有问题的包版本:如果你项目中使用了以下包的这些特定版本,请立即检查并升级到安全版本!
    *   backslash@0.2.1
    *   chalk-template@1.1.1
    *   supports-hyperlinks@4.1.1
    *   ... (以及其他列出的包和版本号,列表同上)

总结

这是一次针对 JavaScript 生态系统的重大供应链攻击。黑客通过钓鱼手段入侵了知名开源包的维护者账户,然后发布带毒的更新。这些毒包会劫持用户的加密货币交易。

所有开发者都应该立即检查自己的项目依赖,确保没有使用上述被黑的版本,并尽快更新到安全的版本。