在那个只有零和一的世界里,对零的向往,终究是一的执着。

正在下载:code.zip NPM软件供应链安全事件

经过调查,确定了chalk和debug等知名的NPM库被黑,他们均是归属于同一个NPM账户qix维护。一开始,确定了18款被黑的库,接着又陆续检查出duckdb和coveops等多个库也存在恶意代码。目前已检测出恶意库和对应版本的列表如下:

0x02 技术分析

以chalk库为例进行分析,对应版本是5.6.1,被感染的文件路径是"chalk/package/source/index.js",如下可见在第11行插入了一行被混淆的JS代码即恶意代码。

依然是使用开源工具“decode-js”即可解出代码混淆,代码变得相对可阅读和分析:

发现代码中内置了大量的加密货币的账户地址,这里应该就是攻击者准备偷偷转币的接收地址:

再借助kimi将代码转换得更易阅读一些后,重点看下几个核心的节点。首先是环境检测入口,判断当前浏览器环境中是否存在以太坊环境,若是成功获取到以太坊账户,则运行runMask函数去拦截和篡改以太坊交易,否则仅运行initLocal函数来劫持交易地址替换为上述接收地址列表中的地址。

2个核心函数本质上都是hook劫持,不同的是runMask函数目的是为了劫持交易请求包,而initLocal函数目的是为了劫持数据响应包。先看下以太坊环境下劫持交易请求,分别对window.ethereum对象的'request', 'send', 'sendAsync'这3个请求接口进行hook,利用Object.defineProperty方法强制覆写的方式据kimi说是可绕过多数前端框架的只读保护。

Hook了3个请求接口后即可通过createProxy函数拦截和篡改以太坊交易,这种方式的好处是在交易请求时偷偷修改接收账户地址,用户难以发现和感知。

篡改交易的参数以替换转账目标为“0xFc4a4858bafef54D1b1d7697bfb5c52F4c166976”,以太坊交易在用户发起普通转账或合约调用授权/Permit等交易的过程中都会自动篡改目标地址,而Solana交易则是统一把所有pubkey 换成攻击者固定公钥“19111111111111111111111111111111”。

再来看下其他环境下的劫持,主要是先对fetch和XMLHttpRequest的send这2个请求接口进行hook,然后对其请求返回的响应内容进行拦截和修改,以替换其中的转账地址。另外,这里的fetch函数赋值可能就是上述提及被发现的构建错误位置,猜测因为攻击者未检测该JS原生函数是否存在就直接使用导致在某些不兼容的环境里报未定义错误。

替换的过程是先通过内置的一个正则列表检测出各类币种地址,然后从攻击者内置的地址池中选择一个最接近的地址进行替换。

而这个选择过程就是采用所谓的计算字符串的编辑距离(Levenshtein 距离算法)来实现寻找与目标地址相接近的转账地址,试图以微小的差异让用户在进行肉眼验证时难以察觉,因为像以太坊地址这种长字符串,用户通常只会检查前几位和后几位字符。

0x03 攻击溯源

这个事件由于事发突然且影响又广,所以很快就被发现并阻断了攻击扩散。NPM被黑账户的维护者也第一时间分享了他(qix)被钓鱼攻击的邮件,发件地址是“support@npmjs.help”,发送时间是9月8号早上8:50(北京时间)。攻击者以更新2FA为由骗取qix进行点击,然后对其实施相关账号的权限窃取。

由于当前已无法访问钓鱼链接(https[:]//www.npmjs[.]help/settings/qix/tfa/manageTfa?action=setup=totp),所以借助Wayback网站(web.archive.org)备份查看发现钓鱼网站首页展示的是一个类似npm仓库首页的假npm站点,结合钓鱼链接URI路径推测该站点可能采用代理技术1:1仿冒了npm站点并诱导qix进行账号登录后窃取权限凭证。

分析攻击者邮箱的域名“npmjs.help”后发现,该域名注册时间为9月6号,正好在此次攻击的前2天,说明此次攻击极具针对性。

随后北京时间23:15分qix在Bluesky回复说他意识到自己账号被黑,然后开始进行清理工作。

0x04 总结

软件供应链安全事件又添一典型案例,此次攻击来得快去的也快,令人深思。从攻击得手,到传播影响,再到发现和清理以及分析响应,不过半周时间,看来安全的对抗虽然日趋成熟但是也永远不能懈怠。

0x05 参考链接

1、JavaScript 生态供应链又一暴击 - 最新 npm 精准投毒搞钱活动详析,https://mp.weixin.qq.com/s/tawNdBQV6jKK9rSpsR3Deg

2、npm debug and chalk packages compromised ,https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised

3、npm Author Qix Compromised via Phishing Email in Major Supply Chain Attack,https://socket.dev/blog/npm-author-qix-compromised-in-major-supply-chain-attack

4、Compromised NPM Packages on 08-09-2025 ,https://github.com/Cyb3r-Monk/Threat-Hunting-and-Detection/blob/main/Uncategorized/NPM%20debug%20and%20chalk%20compromise%2009-2025.md

5、https://x.com/StarPlatinumSOL/status/1965113543910703175

6、https://x.com/JFrogSecurity/status/1965301271155343531

7、https://bsky.app/profile/bad-at-computer.bsky.social/post/3lydioq5swk2y

8、https://github.com/debug-js/debug/issues/1005

9、https://news.ycombinator.com/item?id=45169794