执行摘要
2025年9月8日,一场严重的供应链攻击影响了超过20个广泛使用的NPM包,原因是维护者Josh Junon(Qix-)遭遇了一场复杂的钓鱼攻击。包含恶意软件的恶意版本包——包括 chalk、debug、strip-ansi、ansi-regex、color-convert、wrap-ansi 以及许多其他包——每周总计被下载数十亿次,现已被植入加密货币窃取恶意软件。
此事件凸显了开源生态系统在面对针对维护者的社会工程攻击时的持续脆弱性。
攻击向量与方法论
攻击始于一封看似合法的NPM支持部门的2FA重置通知邮件,属于高度复杂的钓鱼邮件。
该邮件发送自 support@npmjs.help,成功绕过了维护者的初步审查。正如Josh Junon在其披露声明中所述:"这是一封看起来极其真实的2FA重置邮件。我应该更加仔细地查看,但它从我眼皮底下溜过去了。"
GitHub Check
此次攻击展示了有针对性的方法,专门针对下载量高的包,而保留同一账户上使用较少的包。这种选择性目标定位表明攻击者有着明确的目标,并且了解NPM生态系统中影响最大的包。
恶意代码技术分析
基于Aikido的分析,在受感染的包中发现的注入恶意代码展现了复杂的混淆技术和数据泄露能力。该恶意软件包括:
主要恶意行为:
- 以太坊钱包检测:通过
window.ethereum检查加密货币钱包的存在 - 加密货币地址替换:实现了复杂的系统来检测并替换各种加密货币地址,包括:
- 比特币(Legacy和SegWit)
- 以太坊
- 波场(TRON)
- 莱特币
- 比特币现金
- 索拉纳(Solana)
- 网络劫持:劫持fetch和XMLHttpRequest以实时修改加密货币交易
- 交易操纵:专门针对去中心化金融平台,包括Uniswap、PancakeSwap、SushiSwap和1inch
该恶意软件使用了大量混淆技术,包含超过40个跨不同区块链的硬编码加密货币地址,表明这是一次组织严密的行动,旨在将加密货币交易重定向到攻击者控制的钱包。
受影响包的完整列表
以下包已确认被植入恶意版本的恶意软件:
- ansi-styles @ 6.2.2
- strip-ansi @ 7.1.1
- ansi-regex @ 6.2.1
- debug @ 4.4.2
- color-convert @ 3.1.1
- color-name @ 2.0.1
- supports-color @ 10.2.1
- chalk @ 5.6.1
- wrap-ansi @ 9.0.1
- slice-ansi @ 7.1.1
- color @ 5.0.1
- color-string @ 2.1.1
- is-arrayish @ 0.3.3
- simple-swizzle @ 0.2.3
- supports-hyperlinks @ 4.1.1
- has-ansi @ 6.0.1
- chalk-template @ 1.1.1
- backslash @ 0.2.1
恢复步骤
识别暴露情况
您可以使用GitHub搜索查询来在您的环境中查找受感染的版本。这是一个示例GitHub搜索查询。
要评估特定项目是否易受攻击,请使用以下命令:
# Check if your project uses any affected packages
npm list chalk debug ansi-styles strip-ansi ansi-regex supports-color wrap-ansi color-convert slice-ansi color-name color color-string is-arrayish simple-swizzle
# Check your package-lock.json for specific versions
grep -E "(chalk|debug|ansi-styles|strip-ansi|ansi-regex|color-convert|wrap-ansi|color-name).*version" package-lock.json删除受感染的包
# Clear your npm cache
npm cache clean --force
# Remove node_modules and package-lock.json
rm -rf node_modules package-lock.json
# For yarn users
rm -rf node_modules yarn.lock轮换密钥并监控加密货币钱包
如果受感染的包在您的环境中执行,请采取以下步骤:
轮换所有密钥
轮换所有已暴露的密钥,例如:
- API密钥
- 数据库凭证
- 认证令牌
- 加密货币钱包密钥
监控加密货币钱包
如果您的应用程序处理加密货币交易,请监控所有钱包的未授权活动。
适用于StepSecurity企业客户
以下步骤仅适用于StepSecurity企业客户。如果您不是现有企业客户,可以通过安装StepSecurity GitHub App开始14天免费试用,以完成以下恢复步骤。
使用NPM包冷却期检查
NPM冷却期检查会在pull request引入在组织配置的冷却期(默认:2天)内发布的npm包版本时自动使其失败。一旦冷却期过去,检查将自动清除,无需采取任何操作。
原理很简单——大多数供应链攻击在恶意包发布后的前24小时内就会被发现,而被入侵的项目往往是那些急于立即采用新版本的。通过在允许新依赖项之前引入一个短暂的等待期,团队可以在保持依赖项更新的同时减少遭受新攻击的风险。
以下是显示此检查如何保护项目免受使用此事件中涉及的恶意包的示例:
GitHub Check
发现升级到受感染npm包的Pull Request
我们添加了一个新的控制项,专门用于检测升级到这些受感染包的pull request。您可以在StepSecurity仪表板上找到新的控制项。
使用StepSecurity Harden-Runner检测CI/CD中的受感染依赖项
StepSecurity Harden-Runner为您的GitHub Actions工作流程添加运行时安全监控,提供CI/CD运行期间网络调用、文件系统更改和进程执行的可见性。Harden-Runner在CI/CD中使用受感染的nx包时会检测它们。这是一份示例Harden-Runner洞察页面,展示了此检测功能:
如果您已经在使用Harden-Runner,我们强烈建议您查看Harden-Runner仪表板中最近的异常检测。您可以按照此指南开始使用Harden-Runner。
使用StepSecurity Artifact Monitor检测授权管道外发布的软件版本
StepSecurity Artifact Monitor通过持续监控跨包注册表的工件,提供对未授权包发布的实时检测。
该工具本可以通过检测受感染版本是通过项目授权CI/CD管道之外发布的来标记此事件。监控器跟踪发布模式、验证来源,并在包通过异常渠道或从意外位置发布时向团队发出警报。
通过实施Artifact Monitor,组织可以在几分钟内而不是几小时或几天内捕获供应链入侵,显著减少暴露于恶意包的窗口期。
您可以在我们的文档中了解有关在安全工作流程中实施Artifact Monitor的更多信息。
行业响应与缓解措施
开源社区对此事件做出了迅速响应。Chalk组织的维护者Sindre Sorhus迅速发布了干净版本并撤销了受感染维护者的访问权限。NPM支持部门启动了事件响应程序,尽管维护者报告了账户恢复的初步延迟。
向Aikido安全团队致敬,他们首先检测到并公开报告了此入侵事件,使社区能够快速响应。
我们还要感谢Josh Junon(Qix-),这位受影响的维护者在发现入侵后立即进行了透明披露和负责任的报告。Josh及时向社区发出警报,提供了受影响包的完整列表,并积极努力修复问题。
经验教训与未来预防
此事件凸显了几个关键的安全考量:
- 社会工程攻击仍然有效:即使是经验丰富的开发者也可能成为复杂钓鱼攻击的受害者
- 2FA并非万无一失:当重置机制被入侵时,账户接管仍可能发生
- 自动化防御至关重要:依赖扫描和包冷却期等工具提供了关键保护
结论
通过维护者账户接管入侵超过20个流行NPM包代表了2025年最重大的供应链安全事件之一,影响了整个JavaScript生态系统。虽然直接威胁已被遏制,但此次攻击作为关键提醒,凸显了全面供应链安全措施的重要性。
组织必须实施多层防御,包括自动化安全检查、依赖项管理策略和事件响应程序。社区对此事件的快速检测和响应表明,在保护现代软件供应链方面,社区警觉性和自动化安全工具的重要性。