Solana钓鱼诈骗研究报告
介绍
近期,Solana 生态的钓鱼以及诈骗事件依旧频发不断,随着该生态的迅速增长,大量的黑灰产也开始转移阵地,他们通过更高级的技术手段和更隐蔽的钓鱼手法持续的攻击 Solana 的普通用户。各种类型的钓鱼诈骗层出不穷,近半年来,GoPlus 安全团队通过大量的案例研究,发现了目前主要流行的四种钓鱼诈骗场景:空投诈骗、钓鱼签名、权限转移、地址投毒,本文将分别展开介绍这四种形态的钓鱼案例及其原理。同时,我们也收到了大量用户反映的情况,在 Solana 的一些主流钱包里,某些钓鱼诈骗的交易的模拟失效导致造成用户资损,本文同时会对这一技术进行深度解析。
诈骗场景解析
空投诈骗
首先,空投诈骗是指钓鱼者在 Twitter、Discord 等社区中投放伪装成空投活动的钓鱼网站链接。
恶意链接投放
其中,针对 NFT 的链上空投钓鱼,是钓鱼者向用户空投关联了钓鱼链接的 NFT,并诱使用户点击链接并签署恶意交易。下图给出了一个案例,该用户收到了一个声称可以兑换 1,000 个 ZERO 代币的 NFT,然后这个用户点击了 NFT 中的链接并签署交易,后面用户就发现他钱包中的 BONK、ZERO、USDT 等代币都被盗了。
链上空投钓鱼 NFT
空投诈骗的原理相对简单,也就是钓鱼者通过虚假的空投活动,诱使用户进入网站并签署将钱包链接到该网站的交易。此时,网站将发起包含一个或多个 SOL/SPL Token 转账指令的钓鱼交易,从而获取用户的数字资产。一个指令和多个指令进行转账也有区别。比较简单的钓鱼,如左图展示的这样,就是一笔交易,只转一种类型的代币。而更复杂的钓鱼如右图所示,它可以做到在一笔交易里包含很多个转账指令。
一个指令/多个指令转账
钓鱼签名
第二类诈骗是钓鱼签名。一些有经验的用户会通过观察钱包的模拟交易结果,来避免空投钓鱼,然而,钓鱼者便利用了这一点,采用反模拟和伪造模拟技术来迷惑用户,从而增加恶意交易被签名的可能性。具体的,通过合并交易、恶意浏览器插件等反模拟的手段(下文将会重点介绍),使得钱包软件显示虚假的收益结果,甚至是不显示模拟结果,从而诱导用户签署钓鱼交易。
权限转移
第三类诈骗是权限转移。首先,Solana 上 SPL Token 的 approve 操作并不会直接导致代币转移,但是会导致代币资产的权限转移。因此,钓鱼者通过诱导用户签署包含 approve 的钓鱼交易,使得用户钱包中的某个代币账户所有权,转移到钓鱼者的钱包。在代币账户所有权发生转移时,如下图所示,此时主流钱包软件会发出所有权转移的警告提示。
代币账户所有权转移的警告
权限转移的原理是,由于 Solana 中的每一种代币,都会有一个单独的账户 Token Account。黑客他通过发起包含 createSetAuthorityInstruction 操作的交易,就能改变代币账户的所有者。该操作一旦成功,哪怕代币还在钱包中,用户也无法将代币转出。
createSetAuthorityInstruction 结构体
地址投毒
第四类诈骗是地址投毒。它的目标是诱导用户向钓鱼地址转账,并且该钓鱼地址与用户日常交互或者是用户认可安全的地址相似,比如有相同的前缀或后缀,而这些前缀和后缀也是精心设计的。如下图所示,可以看到这两个地址,除了红圈框出来的不同之外,两者的前缀和后缀都相同,从而迷惑用户复制伪造的钓鱼地址,并向该地址进行转账。地址投毒这类诈骗常见于以太坊、波场链,近期也逐渐扩散到 Solana 生态中。
EVM 地址投毒示例
地址投毒也可以细分为以下几个类别:
1)0U/小额转账,指钓鱼者转移 0 额度或者少量的加密货币,来诱导用户错误地复制历史交易记录中的钓鱼地址。
2)转账 空投混合投毒,指钓鱼者通过少量代币转账,并在交易附言 Memo 中添加空投钓鱼连接,来诱导用户点击。
转账 空投混合投毒案例
第三种是虚假系统 Program 地址投毒,虚假系统 Program 地址是指攻击者生成和虚假系统 Program 地址类似的地址作为钓鱼地址,使得用户错误地认为该钓鱼地址是一个受信任的地址。该类诈骗在 2024 年 2 月 3 号,Scam Sniffer 在 Twitter 上报道了一起 Solana 地址投毒事件,攻击者生成和系统程序相同尾号的地址,从而让用户误认为该伪装地址是一个正常的系统程序。其中,虚假系统 Program 地址可通过命令「solana-keygen grind --starts-with <想要的前缀>:1 --ignore-case」生成,例如我想要一个「8888」的前缀,那么就将该前缀写入此命令中,便可获得。
虚假系统 Program 地址投毒案例
虚假系统 Program 地址生成案例
钱包模拟交易及反模拟
Solana 上的模拟交易为用户提供了在交易上链前观察交易执行结果的途径。模拟交易操作的具体过程如下图所示,在构建出一个交易对象并将其序列化后,请求 simulateTransaction 方法即可返回模拟交易的结果,如哪些账户的余额、权限发生了变化等。该功能常见于钱包软件,用于在交易确认前辅助用户检查交易安全性。
模拟交易操作
但在某些情况下,模拟交易也可能失效,主要分为两类情况:
1)反模拟:交易模拟因网络波动等某些原因失败,导致无法推断交易执行结果。
2)虚假模拟:交易模拟成功,但是模拟得到的执行结果和上链后的效果不同。
反模拟
反模拟在两种情况下可能会发生:
1)钱包实现机制缺陷。例如,早期 Phantom 钱包发起多笔交易时,合并不同交易内的指令,导致被模拟交易大小超出最大限制。
2)网络出错。模拟交易请求钱包 RPC 服务,拒绝服务攻击、恶意插件代理请求、请求长时间未响应等原因,导致网络错误进而使得模拟失败。
以 Phantom 钱包为例,在其实施模拟交易时,我们有意制造网络错误,具体代码如下图所示:首先,通过 Solana 的 web3 连接一个 rpc 服务。然后,创建数十个交易,每个交易都包含大量指令。最后,将上述交易发送到钱包,由于可能的网络超时,无法查看模拟结果。
反模拟案例
虚假模拟
虚假模拟的发生也有两种可能的原因:
1)Durable Nonce。该机制允许先签名,在未来某个时间发起交易。但注意到,若交易触发了一个可升级的合约(合约逻辑被恶意修改),这就会导致签名时模拟的交易执行结果和发起交易时的执行结果可能不同。
2)钱包实现缺陷。例如,钱包同时模拟多笔交易,结果可能不准确。
同样以 Phantom 钱包为例,我们同时发起完全一致的多个交易,模拟执行仅展示其中一笔交易的结果。如下图所示,代码指示的逻辑发送了 0.00002 SOL,但模拟结果仅为 0.00001 SOL。
主流钱包反模拟与虚假模拟问题
进一步,我们也探索了其他钱包是否存在与上述情况类似的反模拟和虚假模拟问题。这里我们尝试对另外两款常见的 Solana 钱包,即 Solflare 和 Backpack 进行分析。
Solflare
· 在网络超时的情况下不会显示确认按钮,降低了因网络延迟导致的反模拟风险
· 同时模拟多笔转出交易,不显示余额变动情况,直接提示风险;
虚假模拟案例
Backpack
· 与 Solflare 类似,在网络超时的情况下不会显示确认按钮,降低了因网络延迟导致的反模拟风险
· 可能有潜在的虚假模拟风险。参考上述 Phantom 虚假模拟代码,发送 0.00002 SOL,但模拟结果为 0.00003 SOL。
总结
目前,Solana 生态中用户安全依然存在诸多隐患。尽管主流钱包已经具备一定的安全功能,但这些功能尚未能够覆盖所有的安全问题。例如,交易模拟结果并非总是可信,这为用户带来了潜在的风险。即便用户采取了预防措施,如检查模拟交易结果,但依旧可能会被反模拟和虚假模拟技术所迷惑,从而签署恶意交易。为了应对这些挑战,GoPlus 安全团队将于本月推出 wallet drainer detection 功能。这项能力将赋能 Solana 生态的主流应用,通过实时检测和拦截潜在的诈骗和钓鱼交易,全面保护用户的每一笔交易。这不仅能显著提升用户的安全体验,也有助于 Solana 生态的稳定和繁荣发展。GoPlus 安全团队呼吁 Solana 公链及其生态合作伙伴,共同加快用户安全基础设施的建设,为用户提供更加安全、可靠的交易环境。通过持续的技术创新和安全防护升级,我们相信能够有效减少钓鱼诈骗事件的发生,保护用户的数字资产安全,实现 Solana 生态的长期稳定和健康发展。