2025年9月爆发数十亿次下载量的NPM供应链攻击事件解析
事件概述
截至2025年9月9日,JavaScript生态圈正在应对一起重大供应链攻击事件。流行开发者qix的NPM账户遭到入侵,导致包括chalk、strip-ansi和color-convert在内的数十个主流软件包被发布恶意版本。受影响软件包每周总下载量超过十亿次,成为开源史上最严重的安全事件之一。
事件发现过程
攻击最初通过CI/CD流水线中的神秘构建错误被发现,具体表现为"ReferenceError: fetch未定义"。该错误源于恶意软件尝试通过fetch调用窃取数据时,在缺乏全局fetch函数的旧版Node.js环境中执行失败。
攻击根源
攻击者控制了qix的NPM账户,得以发布关键库的恶意补丁版本。这些被入侵的软件包是无数项目的底层依赖项,通常深藏在依赖树中。
主要受影响软件包及下载量
chalk:约3亿次/周
strip-ansi:约2.61亿次/周
color-convert:约1.93亿次/周
color-name:约1.91亿次/周
is-core-module:约6900万次/周
error-ex:约4700万次/周
simple-swizzle:约2600万次/周
has-ansi:约1200万次/周
恶意加密剪贴器如何窃取资金?
这段恶意代码是精密的"加密剪贴器",通过以下双重策略窃取加密货币:
被动地址替换
1. 通过"猴子补丁"技术劫持浏览器的原生fetch和XMLHttpRequest函数拦截网络流量
2. 内置攻击者控制的BTC、ETH、SOL等主流币种钱包地址库
3. 使用Levenshtein距离算法寻找与用户真实地址最相似的攻击者地址进行替换
主动交易劫持
1. 检测到MetaMask等浏览器钱包(window.ethereum)时,劫持其通信方法
2. 用户发起交易时,在内存中修改交易数据,替换收款地址
3. 用户最终签署的实际上是向攻击者地址转账的欺诈交易
开发者应急防护措施
虽然NPM社区正在清除恶意版本,但被污染软件包仍可能存在于项目依赖中。建议立即采取以下措施:
依赖项审计
立即检查项目的package-lock.json或yarn.lock文件,识别是否使用受影响软件包
版本锁定
在package.json中使用overrides功能强制使用安全版本,这对修复传递依赖至关重要
清理重装
添加覆盖后,需删除node_modules文件夹和package-lock.json文件,重新运行npm install生成干净的锁定文件
事件启示
qix账户入侵事件暴露出开源生态存在系统性风险:
1. 这些基础库通常不是直接依赖项,而是通过数百个其他包被间接引入
2. 庞大的隐形依赖树使恶意代码能悄无声息地扩散到数百万应用中
3. 攻击者成功利用了开源生态固有的信任机制
这起事件警示我们:必须超越基础安全实践,采取包括强化CI/CD流水线、严格依赖管理政策、培养安全优先文化在内的主动防御策略。忽视这些措施将使项目持续面临可能危及知识产权、用户数据和金融资产的大规模威胁。