一次侥幸:NPM 漏洞事件险些给加密货币用户带来浩劫

  • Galaxy
  • 发布于 7小时前
  • 阅读 59

NPM(Node Package Manager)上知名开发者账号qix遭受网络钓鱼攻击,导致多个流行的 JavaScript 库被植入恶意代码,攻击者试图通过替换加密货币交易中的接收者地址来窃取资金。虽然攻击影响有限,只造成少量资金损失,但它暴露了软件供应链的潜在风险,并提醒开发者和用户采取更严格的安全措施,例如升级到修复版本、锁定依赖项版本、避免盲签交易等。

一次侥幸:NPM 漏洞几乎给加密货币用户带来了灾难

NPM 漏洞

一个化名为 qix 的著名软件开发者的 node 包管理器 (NPM) 帐户在周一被盗用,这给 Javascript 社区和整个网络,尤其是加密货币用户带来了冲击。qix 是许多顶级 JavaScript 包的广受尊敬的维护者,这些包每周总共被下载超过 10 亿次。在诊断发生了什么以及投资者如何保护其数字资产之前,我们将解释事件背后的机制,以及为什么它有可能被广泛传播。幸运的是,我们的研究表明,该漏洞本身并没有特别有效,我们将在下面更详细地解释。

现代商业的很大一部分在线运行,其中链上业务的份额不断增长。所有这些工具和服务的核心是软件开发人员编写的数百万行代码。大型公司、Web3 初创公司和独立项目的开发人员都遵循类似的路径。他们将代码存储在 GitHub 上,将其打包以供内部或公共使用,并通过包管理器发布。JavaScript 编程语言的主要包管理器是 NPM,它是这次攻击的核心。虽然 Ethereum 智能合约主要用 Solidity 语言编写,但周围的技术栈在很大程度上依赖于 JavaScript 和 TypeScript。前端、机器人、脚本和 Web3 库都依赖于 Javascript 和 NPM,因此受污染的包可以通过大小团队使用的核心存储库传播。Web3 以及互联网的大部分都是建立在 JavaScript 上的。

虽然公司代码库的许多部分都是从头开始编写的,但团队也会导入包以节省时间并在受信任的工作基础上进行构建。开发人员依靠 NPM 将包引入其代码库,然后使用构建文件和部署管道管理这些包。这种选择是一把双刃剑;一方面,你可以通过使用信誉良好的软件包来节省开发时间并加强你的代码。另一方面,你可能会将自己暴露于恶意软件包。这正是本次事件中发生的事情。

发生了什么?

9 月 8 日星期一,qix 收到了针对其 NPM 帐户的网络钓鱼邮件,攻击者可以通过该邮件将恶意版本的关键 JavaScript 库发布到 NPM 注册表。

其中一些库包括:

  • chalk: 每周约 3 亿次下载

  • strip-ansi: 每周约 2.61 亿次下载

  • color-convert: 每周约 1.93 亿次下载

  • color-name: 每周约 1.91 亿次下载

  • error-ex: 每周约 4700 万次下载

  • simple-swizzle: 每周约 2600 万次下载

  • has-ansi: 每周约 1200 万次下载

在他们的依赖树(软件的供应链)中的任何地方拥有这些或相关 NPM 包的开发人员,都可能在不知情的情况下提取受污染的更新。即使他们没有直接安装这些包,恶意软件也可能作为依赖项的依赖项到达。有几种途径可以实现这一点,并且有一些标准控制措施可以帮助组织降低风险。

如前所述,开发人员依靠通过 NPM 分发的 JavaScript 库来节省时间并提高可靠性。项目在 package.json 文件中声明依赖项(必要的软件包),并且通常包括一个锁文件,例如 package_lock.json,以标识确切的版本。简而言之,这些文件精确地指定了构建应安装的包和版本。当版本被锁定并且锁文件受到尊重时,构建不会拾取恶意版本。当未定义版本范围,或者缺少、忽略或重新生成锁文件时,风险就会浮出水面。一些开发人员还通过指定自动提取较新稳定版本的版本范围来部署最新版本。在恶意版本生效期间运行的任何构建都可能拉入恶意软件包版本。在每次运行时解析依赖项的自动构建或持续集成 (CI) 系统可能会扩大这种风险。

如何发现的,谁受到了影响?

加密硬件钱包制造商 Ledger 的首席技术官 Charles Guillemet 是第一个在 X(前身为 Twitter)上公开 此漏洞的人,获得了超过 800 万的浏览量。他的推文引用了一位名为 JD Stärk 的软件工程师撰写的一份非常深入的报告。几家信誉良好的钱包和 DeFi 应用程序报告说,该事件没有产生任何影响。Ledger、Phantom 和 MetaMask 表示他们的平台是安全的,MetaMask 引用 了版本锁定、严格的发布检查以及其他威胁检测机制。Uniswap 其任何应用程序都没有风险。AerodromeBlastBlockstream JadeRevoke.cash 也报告说没有受到影响。

Stärk 说,一位同事在重新构建期间遇到一个神秘的构建错误,该错误追溯到 error-ex 包:

ReferenceError: Fetch is not defined

该同事的 package-lock.json 允许 error-ex 1.3.2 或更高版本,因此构建拉取了恶意 1.3.3 版本。之所以被发现,是因为他们的 Node.js 环境没有提供全局 fetch 函数。Fetch 是一个标准的 API,可以发出网络请求并返回响应。由于恶意软件假定 fetch 存在,因此调用在测试期间失败并暴露了问题。在默认情况下提供 fetch 的较新环境中,代码可能会在未被注意的情况下运行并被部署。

与 Stärk 描述的环境不同,缺少全局 fetch 会导致明显的失败,Ledger 可能是针对默认提供 fetch 的较新运行时进行构建的。在这种情况下,有效负载可以毫无错误地运行。然后,检测将依赖于自动安全措施,例如标记意外网络调用的扫描程序、验证包完整性和签名的检查以及阻止未知域的管道规则。但是,在此漏洞中,软件包是通过合法的 NPM 工作流程发布的,并且没有联系可疑域,因此域验证和网络调用检查不会捕获它。

Ledger 可能在测试或自动部署检查期间发现了该问题。依赖项差异可能会显示意外的添加,静态分析可以标记对不熟悉域的网络调用,并且对捆绑工件的完整性检查可以高亮显示可疑的代码路径。暂存运行或小型 canary 部署也可能触发记录异常 fetch 活动的遥测。在任何这些情况下,可能的响应都是冻结版本、回滚工件并审核依赖项树,同时验证生产流量是否受到影响。

Ledger 最初将其描述为大规模的供应链攻击,但后续分析表明,观察到的影响有限。

解剖攻击

攻击者通过在六个区块链上创建 280 个钱包 来设置漏洞:Bitcoin (BTC)、Ethereum (ETH)、Solana (SOL)、Tron (TRX)、Litecoin (LTC) 和 Bitcoin Cash (BCH)。该漏洞使用两种不同的攻击方法将发送者的钱包地址替换为攻击者的地址之一。

攻击向量 1:被动地址交换

该代码首先检查你的浏览器中是否激活了钱包扩展程序,例如 MetaMask 或 Phantom。如果未找到,它将开始拦截与你正在使用的站点之间的流量。然后,它确认你正在加密货币原生站点上发起转账,并将收件人的地址与列表中几乎匹配的地址交换。该漏洞依赖于用户在点击“发送”之前没有注意到细微的差异。这种模仿方法很难发现与你粘贴或键入的地址不同的几个字符。

攻击向量 2:主动交易劫持

如果存在钱包扩展程序,恶意软件会切换到其最危险的方法。当你发起交易时,它会在数据到达扩展程序之前拦截数据,在内存中将收件人地址替换为攻击者控制的几乎相同的地址,然后将更改后的请求转发到你的钱包以进行确认。由于地址几乎匹配,因此很容易忽略几个字符的差异。如果你没有逐个字符地验证地址,你最终可能会将资金发送给攻击者。

当用户在钱包中签署交易时,它会在广播到网络之前显示收件人、资产、金额和费用以供审查。但是,此攻击会在提示出现之前在内存中交换收件人,因此钱包会显示攻击者的地址,就好像它是正确的一样。要发现骗局,用户必须手动或使用允许列表来检查地址。此功能将阻止任何发送到未在列表上指定的地址的交易,或者在发送之前向用户显示明显的警告。盲签是指应用程序不提示用户确认其交易,因此几乎不可能检测到地址交换,这使得此模式风险最高,并且最有可能将资金发送给攻击者。

攻击的影响

Arkham 的研究 表明,此次攻击的影响远小于它可能产生的影响。总共,他们发现了 17 笔交易和 1,043.21 美元的被盗资金,其中包括 436.84 美元,这些资金似乎是故意作为嘲讽发送给攻击者的。

Galaxy Digital 没有受到此漏洞的影响。机构和机构交易平台受到的影响小于日常用户。他们与 DeFi 前端的交互较少,通常通过托管人路由活动,并依赖于地址允许列表、多步骤审批和禁用的盲签等控制措施,这些措施共同限制了他们对此技术的风险。

NPM 社区Swift采取行动修补受影响的软件包,这限制了对开发人员的影响。维护人员发布了干净的版本,发布了公告,并提示项目进行升级,从而缩短了恶意代码可以运行的时间窗口。

加密生态系统工具也Swift做出了反应。诸如 Etherscan 和 Solscan 之类的区块浏览器标记了攻击者地址,在地址和交易页面上添加了警告标签,并通过其 API 推送了这些标签。这使得这些地址更容易被发现,阻止了重复使用,并帮助钱包和分析服务降低了它们的优先级或阻止了它们。

Etherscan NPM 黑客

截至 9 月 11 日

防御此攻击:开发人员和用户的操作

开发人员:升级到已修复的版本并锁定它们,以便传递安装无法拉取易受攻击的版本。某些受影响的版本可能仍然可以访问,因此请在整个项目中强制执行安全版本并重新生成干净的锁文件。将锁文件保留在源代码控制中,启用自动更新警报,并且如果出现易受攻击的版本,则使 CI 失败。删除未使用的依赖项,审查新的维护人员和权限更改,并通过锁定版本和提交锁文件来确保你的构建和安装过程始终产生相同的结果。

DeFi 用户:不要使用盲签。除非绝对必要,否则保持禁用状态。对于正常的签名交易,请在批准之前查看完整的收件人地址。使用地址簿或允许列表,比较不仅仅是第一个和最后一个字符,并在向新收件人付款时发送少量测试。保持扩展程序处于最新状态,删除你不使用的扩展程序,并通过保存的书签而不是消息或广告中的链接来访问应用程序。

结论

这是一次侥幸。攻击者短暂地通过广泛使用的软件包获得了进入数百万个应用程序的途径,但没有推动广泛的代码执行。相反,他们依赖于最终用户地址交换,这种交换是公开的、Swift被检测到的,并在数小时内得到控制。行业应该将这种结果视为运气,而不是策略。

更有能力的参与者可以使用相同的立足点进行静默供应链篡改或远程代码执行,从而产生更大的影响。通过在网页中运行的代码,经验丰富的攻击者可以监视和修改所有网站和 Web3 应用程序的流量;收集凭据、会话 cookie 和 API 密钥;注入窃取程序;并悄悄地泄露数据。

结论很简单。使依赖项保持最新并锁定构建,并指导用户避免盲签并验证每次发送时的收件人地址。

  • 原文链接: galaxy.com/insights/rese...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Galaxy
Galaxy
Official Galaxy X account. Global leader in digital assets and data center infrastructure.