Solana 差点毁于一旦? ——官方 web3.js 库被攻击的生死 5 小时

NiqNiq
/2025年7月18日
Solana 差点毁于一旦? ——官方 web3.js 库被攻击的生死 5 小时

要点总结

• 黑客通过获取 npm 发布权限上线恶意版本,暗中收集私钥,目标主要是处理私钥的 bot 类项目。

• 本次攻击未波及 GitHub 仓库,完全绕过审查流程,凸显供应链发布权限的重要性。

• 非托管钱包(如 OneKey)因不联网保存私钥而完全幸免,托管钱包与在线服务暴露风险点极多。

• 开发团队应启用多重身份验证、限制 npm 权限,并提升内部安全意识,防范钓鱼与社工攻击。

• 开发者切勿盲目使用 @latest,应锁定依赖版本、查看 changelog,并使用 lock 文件确保依赖安全性。

• 社区还发现多个钓鱼 npm 包伪装成 Solana 组件,用户务必核对包名来源,切勿轻信看起来“官方”的名称。

• Web3 核心信条仍然成立:Not your keys, not your coins——真正的控制权在于你手中的私钥是否可控。

捏了一把汗,差点变成 Dexx 爆雷事件大型版。  

搞搞项目方已经满足不了黑客。现在是直捣黄龙——杀到了区块链官方库了。  

不久前,Solana Lab 官方的 web3.js 库遭到入侵,发布代码被篡改的新版本,使其能够窃取私钥。

还好,发现及时,根据 Solana Scan 数据,只造成了约 16 万美元的损失。  

不废话,OneKey 为你专业解读 

@solana / web3.js 是什么?

它是 Solana 官方推出的 JavaScript 核心库,由 Solana Labs 团队开发并维护,专门用于与 Solana 区块链进行交互。  

你所交互的绝大部分 Solana 应用程序(比如 Jupiter、Pumpfun)都会用到。该库每周下载量超过 400,000 次,是开发基于 Solana 的去中心化应用(dApps)时最常用的工具之一,提供了操作 Solana 区块链的完整 API。  

说它是 Solana 开发生态的基石也不为过。

—发生了什么?攻击详细经过

攻击发生在北京时间 2024 年 12 月 2 日晚上 11:20 和 12 月 3 日凌晨 4:25 之间。  

Solana 官方 Web3.js 库的维护者遭到网络钓鱼或者社会工程攻击,被拿到了电脑或者账号的权限。

黑客在拿到拥有发布权限的账户之后,npm 发布了两个被篡改的  web3.js 版本:1.95.6 和 1.95.7。

黑客在发布的这两个版本中,偷偷加入了一个名为 addToQueue 的恶意函数。这个函数表面上看起来是处理正常的网络请求(类似于处理网站访问请求),但实际上它在暗中窃取用户的私钥——如果开发的项目是直接处理私钥的,比如 bot 之类的项目。黑客在多个本来正常处理私钥的地方都调用了这个恶意函数。  

据安全研究员 Christophe Tafani-Dereeper,这种攻击手法非常狡猾,恶意代码巧妙地隐藏在正常的功能中。  

黑客还搞了一个域名为 “sol-rpc[.]xyz” (看着十分官方)的服务器,用来接收被窃取的私钥。这个服务器现在已经被关闭。  

事件发生后,Solana 开发者 @trentdotsol 首先报告了这一情况。多个 Solana 基于项目,如 Solflare、Phantom Wallet 和 Helium,纷纷表示未受到此次攻击的影响。这主要是因为他们并未在这段时间内更新受影响的库版本,且多数非托管钱包不会在交易过程中暴露私钥。  

(注:非托管钱包就是你的私钥是自己保存的,不会被钱包存在服务器上。比如OneKey 硬件钱包就是很硬核的从生成到储存完全离线的非托管钱包,而各种 Meme 狙击交易 Bot 就是典型的服务器储存私钥的托管钱包。)  

由于攻击发生在短短 5 小时内,且社区反应迅速,损失得到了有效控制。据 Solscan 数据显示,攻击者共窃取了约 16 万美元的加密货币。这对于区块链领域的攻击来说,已经是相对较小的损失。

官方在发现问题后,立即从 npm 注册表中移除了受影响的版本,并发布了安全的版本 1.95.8。社区也积极呼吁开发者尽快更新到最新版本,并轮换可能受影响的密钥和凭证。  

—学到什么?说的道理

1、对于用户:

此次攻击,针对的就是非托管钱包,或者在运行过程中直接在本地使用私钥的服务。  

谨慎使用托管钱包(也就是私钥不是自己保存的,比如各种 meme 交易 bot)和类似的网络服务,这种工具和服务,通常都有很多很多的「风险点」,很容易被黑客甚至是团队内部盯上——毕竟私钥基本都是在服务器上。  

不要再这种钱包和服务,不要放大资金。使用非托管钱包,自己离线保存私钥助记词。考虑使用硬件钱包。我们在之前做了一个表格,详细对比了各种钱包的安全利弊(https://x.com/OneKeyCN/status/1857602496342241480)。如果你对刚才说的概念完全没有概念,思想停留在 Web2 的登录,一定要看下。  

Web3 永远记住一句话:「Not your keys, not your coins.」。任何加密资金的管理核心都是私钥。  

2、对于开发供应链上游:

供应链安全至关重。希望 Solana Labs 团队能吸取教训,员工要做好防社工钓鱼的准备。还要确保 npm 账户启用了多因素认证,防止账户被轻易入侵,并限制对关键依赖包的发布权限。作为官方、供应链源头,安全措施怎么拉满都不过分。  

3、对于开发者:

可能有人可能会问了:“是谁审核了那个 PR(合并代码请求),怎么就通过了?”  

其实此次攻击不涉及 Github 源代码库。黑客是直接发布的 npm 包,这不需要代码一定要提交到源码仓库。只要拥有发布权限,开发者就可以在自己的电脑上运行一个简单的命令 npm publish,将本地的代码包上传到 npm 的服务器。

据悉,拥有这个发布权限的账户足足有 14 个之多…(来源:https://x.com/beeman_nl/status/1864120050627567768)  

中招的人,大概率是不在意包的版本,随手就使用最新版;或者是恰好在这个时候需要升级。只要在恶意版本发布期间执行了 npm install @solana/web3.js 命令,或者使用了 npm install @solana/web3.js@latest 指令,就中招了。  

所以 @latest 要慎用!要避免在无人监督的情况下自动更新依赖库。应在更新前查看变更日志和社区反馈。

为了防止类似攻击,建议开发者在安装和更新依赖时,仔细检查包的版本和来源,及时关注安全公告,并使用锁定文件(如 package-lock.json)来确保安装的依赖版本的可信性。

而且,npm 包钓鱼还不止这些,几天前,Socket 曾警告称,有一个名为 solana-systemprogram-utils 的虚假 Solana 主题 npm 包,其目的是在 2% 的交易中偷偷将用户的资金重新路由到攻击者控制的硬编码钱包地址。使用前要核对好。

使用 OneKey 保护您的加密之旅

View details for OneKey ProOneKey Pro

OneKey Pro

轻触。认证。掌控。

View details for OneKey Classic 1SOneKey Classic 1S

OneKey Classic 1S

轻巧便携。银行级安全。

View details for OneKey SifuOneKey Sifu

OneKey Sifu

即刻咨询,扫除疑虑。

继续阅读