Solana作为一条高性能且可扩展的区块链协议,从去年起,其生态一直处于快速发展的状态。Lido和Jito等流动性质押项目和各种Meme热潮让Solana的TVL和交易量增长迅猛,而Solana的PayFi、DePIN项目则让用户和投资者看到了区块链与现实世界结合的巨大潜力。
目前,越来越多的用户进入到Solana的生态。在此趋势下,很多黑客早已伺机而动,利用Solana的特性,实施欺诈行为,并且新型的攻击手法层出不穷。作为Solana生态的安全合作伙伴,Beosin此前已为Sonic SVM、Space Runners等多个项目提供安全服务。针对此类安全风险,Beosin整理并解析了针对Solana生态的攻击手法,用户可从中了解并采取对应的预防措施,帮助大家更加安全地交互Solana生态项目。
Solana账户与交易模型
在了解针对Solana生态的攻击手法之前,用户首先需要对Solana的账户与交易机制有一个基本的了解。
Solana账户
在Solana的设计中,所有的信息都存储在账户(Account)对象中,而账户类型分为三类:
1. 数据账户,用于存储数据。数据账户又分为系统所有账户和程序派生账户(Program Derived Address)
2. 程序账户,用于存储可执行程序,即用户/Solana官方开发并部署的智能合约。值得注意的是,Solana的智能合约是可以被更新/销毁的。
3. 原生账户,指Solana上的原生程序,它们是由节点在部署时生成的智能合约,普通用户无法更新/销毁,但和其它智能合约一样,可以被合约/RPC调用。
注:Solana的程序(Program)本质上和其它区块链的智能合约(Contract)类似,下文的程序等同于智能合约。
而普通用户通过钱包生成的账户属于数据账户中的系统所有账户,可以理解为用户通过系统程序生成了一个系统所有账户,这个账户存储了地址信息和加密资产等数据。
Solana交易
首先,用户需要了解一个概念:指令 (instruction),指令定义了Solana交易中的操作,例如程序交互、代币转账等。Solana 上的一笔交易可以包含多个指令,这表示用户在Solana链上进行交互时,可以在同一笔交易中执行多个不同的操作,例如用户可以将多笔转账指令打包到同一个交易中 (batch transfer),这些指令将按顺序执行。
用户可以在Solana的区块链浏览器中,选择一笔特定的交易,然后在Instruction Details里查看该交易包含的指令,从而获得相关指令调用的程序,以及涉及到的转账双方的地址等信息。以Solscan的某一笔交易为例:
该笔交易调用了系统程序和代币程序的burn函数,将一定数量的$PONK代币销毁。
针对Solana生态的攻击手法
随着Solana的热度上涨,钓鱼攻击与Rug Pull在其生态中也日渐猖獗。根据Scam Sniffer的报告,今年9月,大约1万名用户因钓鱼攻击而造成了总共超过4600万美元的损失,用户需要格外对钓鱼攻击提高警惕。以下是Solana生态主要存在的造成用户损失的攻击手法:
1. 空投诈骗
钓鱼攻击者在社交媒体上发布伪装成空投活动的钓鱼网站链接,或是向用户的钱包地址转入NFT,诱骗用户访问钓鱼网站并签署交易,导致用户的资产被盗。
由于Solana允许将多笔转账打包成一个交易,因此用户只需一次签名即可将钱包中的所有资产一次性转移到钓鱼者的地址中,造成巨大的损失。在使用钱包签署交易时,用户必须谨慎确认每一次签名的结果,以免遭受损失。
2. 模拟交易的失效
由于Phantom等钱包提供模拟交易,用户可通过观察钱包的模拟交易结果来避免钓鱼。但模拟交易的结果并不是实际的交易结果,钓鱼攻击者可以合并交易、恶意浏览器插件等方式伪造钱包的模拟交易结果,诱导用户签署恶意交易。
今年8月,有Solana的用户下载一个名为“Bull Checker”的浏览器插件,其权限为可读取和改变你访问的所有网站的所有数据,导致了用户的Solana资产被盗。具体原因如下:
当钱包模拟用户发起的交易时,由于攻击者地址的SOL余额为0,不会执行恶意转账的操作,可以顺利通过模拟交易的检查。在实际交易时,Bull Checker这个插件会将Wallet Adaptor的signTransaction()替换为它的恶意实现,将未签名的交易发送到攻击者的服务器,附上一个钓鱼程序的调用。交易中用户会发送小额的SOL到攻击者地址,从而触发恶意的转账。
如果一个浏览器插件同时具有“读取”和“更改”等广泛的权限,请确认该插件是否需要这些权限。比如Bull Checker的功能实际上只需要读取数据即可。用户也应格外注意模拟交易的结果并不能代表实际交易的结果,钓鱼者有多种手段去修改/阻止显示模拟交易的结果。
3. 权限转移
这种钓鱼手法与以太坊生态的手法类似,钓鱼者通过诱导用户签署交易,转移代币账户的所有权。用户在签署交易时,尽管许多钱包会发出警告,但许多用户仍然可能被诱导。
Solana生态的每一个代币,都有一个单独的账户 (Token Account),每个代币账户中会有一个所有者 (Owner) 的属性。
在默认情况下代币账户的所有者会被指定为当前持有代币的地址,但这是可以通过调用 createSetAuthorityInstruction()进行修改的。当用户被误导调用了该函数,其钱包某个代币账户的所有权会被转移到黑客地址,随后黑客可将用户的代币转移走。
4. 地址投毒
钓鱼者通过伪造与用户常用地址相似的钓鱼地址,使得用户将资产误转到钓鱼者伪造的地址。这种手法此前在以太坊和Tron链较为常见,近期也开始在Solana上大量出现。
5. 代币拓展
今年9月,有部分Solana用户发现自己在进行代币兑换/转账之后,代币被销毁了。Beosin研究发现,代币被销毁的原因是该代币程序有一个名为Permanent Delegate拓展功能。
Permanent Delegate是Solana官方对代币功能的扩展,管理员在任何时候都有权转移或销毁代币。其目的是为了适用于特殊的应用场景,例如代币回收、稳定币的监管。在创建代币时,创建者需要利用createInitializePermanentDelegateInstruction指令来初始化permanentDelegate。
由于Permanent Delegate的权限过大,一些黑客利用该拓展功能发行代币,吸引用户购买其代币后,通过销毁或转移获益。
除了Permanent Delegate这个拓展功能外,攻击者还可能利用Transfer hooks、Transfer fees等拓展功能对用户造成资产损失。
总结
通过以上介绍,我们希望大家能够对Solana的账户、交易和攻击手法有更全面深入的了解。从选择安全性更高的钱包和插件、提高自身反诈骗意识,到了解新型的攻击手法,这些预防措施能够在很大程度上降低风险,确保用户的资产安全。Beosin也将会在之后为大家带来更多骗局分析与安全指南。
Beosin作为全球最早一批从事形式化验证的区块链安全公司,主打”安全+合规“全生态业务,在全球10多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控与阻断、被盗追回、虚拟资产反洗钱(AML)以及符合各地监管要求的合规评估等“一站式”区块链合规产品+安全服务。欢迎点击公众号留言框,与我们联系。