原文来源:Keystone 中文
从 EVM 到 Solana:如何避坑钓鱼骗局
近期有一位用户发文,讲述了自己在 Solana 上被钓鱼丢失了几百万人民币资产的经过,据描述:他在 Maneki 项目的推文下方,误点了回复里钓鱼团伙发的链接进入网站。
令他费解的是,在交互的过程中,网站似乎没有要求他做任何的代币授权操作,黑客直接就得手了。当他意识到网站可能有问题,试图转走钱包中的代币避免被盗的时候,却发现多次尝试都是交易失败,再也无法转出。
由于提供的细节有限,事发经过我们无法完整重现。但可以确定的是,用户失去了对 Maneki 代币账户的控制权,所以才会出现用户试图转走钱包中的资产失败。习惯了 EVM 的用户可能会很疑惑,这账户控制权又是什么呢?
这是由于 Solana 采用了不同于 EVM 链的实现方式,假如继续按照 EVM 上的使用习惯来交互 Solana,拿着前朝的剑想杀当朝的官,无疑会面临巨大的风险。
在 Solana 上想要愉快地玩耍,势必要对 Solana 的特性与欺诈手法有所了解。为此我们也整理了一些 Sol 上那些与 EVM 有所不同的攻击方式,希望能够帮助不了解 Solana 的用户避坑。
1. 鸠占鹊巢:代币账户所有权转移
我们开篇案例的主人公遭遇的就是这类攻击,在 Solana 钱包中,对于每一个代币,都会有一个单独的账户(Token Account),类似于我们银行卡中会有人民币账户,美元账户等等,彼此之间是独立开来的,而且每个代币账户还会有一个所有者的属性。
在默认情况下代币账户的所有者会被指定为当前的钱包,但是这并不是写死的,通过调用 createSetAuthorityInstruction 的操作,可以改变代币账户的所有者,黑客正是利用了这个操作,诱导用户将钱包中的某个代币账户所有权转移到他的钱包。
一旦成功,哪怕代币还在钱包中,用户却无法将代币转出,这和代币被盗没什么两样。
由于这个操作风险很高,因此 Phantom 和 @Backpack_CN 钱包都会拦截并提示该交易的风险,需要对交易进行二次确认,除非用户一意孤行强行批准交易。
2.Solana 上不需要先授权再交易
在 EVM 上,钓鱼合约如果想转走受害者钱包中的代币,需要用户在代币合约上对钓鱼合约进行授权,获得授权的钓鱼合约才能发起交易转走用户的资产。
而在 Solana 上,approve 并非是授权而是批准交易,如果用户把这当成的代币授权的环节,一旦 approve 了,钓鱼的交易就被发送出去,很难有挽救的余地。
还有一个更危险的情况是:假设用户在 EVM 上被诱导了授权代币,此时受影响的只是单一代币,其他未被授权的代币不会被盗走。而 Solana 由于无需授权只要用户批准即可转移代币,结合接下来要介绍的第三点特性,则可能会给用户造成极大的损失。
3. 小心被诱导转移多个代币
Solana 的交易设计,允许在一笔交易中加入多个子交易,每个子交易可以完成一项交互,比如转出某个代币。相对 EVM 上的代币转移,每种代币都需要一笔单独的交易来完成,Solana 的这个特性提供了一定的便利。
比如大家的钱包中可能会存在着一些价值很低不到 1u 的代币,sol-incinerator 便利用了这个特性允许用户批量将钱包中的小额代币发送并兑换回 SOL,而不需要多次兑换耗费大量的 Gas 也节省了操作时间。
有利便有弊,这个特性也给黑客作案带来的极大的便利,只要成功蒙骗到一次用户确认交易,便可以将用户钱包中的代币、NFT 甚至是 SOL 都洗劫一空。因此如果看到一笔交易中包含大量的 TOKEN 转移,就要小心是不是黑客利用了这个特性准备清空你的钱包。
4. 骗取交易签名
在 EVM 中,permit 签名由于其隐蔽性、不出现在授权者的钱包中等特性深受钓鱼团伙的喜爱,目前有超过一半以上的钓鱼攻击方法都是它。而在 Solana 的世界,也有一种相似的方法:Durable Nonce(持久唯一数)。
Durable Nonce 的特性和 permit 类似,如果用户在不知情的情况下签署了交易,并不会立即丢失资产,也不会在自己的钱包中看到这笔交易,而是会把签名过的交易信息发送给钓鱼团伙,再由他们来把交易发送到区块链上,这种离线交易的特点与 permit 如出一辙,也同样地危险。
由于 Solana 可以模拟交易结果,Durable Nonce 的可读性比 permit 要好一些,用户也更容易识别。所以钓鱼团伙为了更顺利地盗取用户资产,还将 Durable Nonce 与合约升级结合起来,试图以此瞒天过海避开交易模拟给用户带来的警告。
钓鱼网站先使用正常的不含恶意交易的合约与用户交互,此时钱包的交易模拟功能呈现出来的信息是看不出来有什么问题的。
而当用户批准后,拿到用户的签名的钓鱼团伙并不急于将交易广播上链,而是等待一段时间后再将合约升级到包含恶意代码的版本,最后将交易广播上链,用户会突然发现资产丢失,而自己没有任何操作,因为有可能这笔签名是几天前做的。
这种升级后的攻击方式极为隐蔽,危害也极大,目前的交易模拟功能暂时也无法展示出来风险。因此仍然要提高防范的意识,不要过于依赖钱包软件的提醒和盲目信任交易模拟的结果。
结语
可以看到上述的这些功能特性,最初的设计目的都是希望降低用户的使用门槛,提供更多的便利。没曾想新技术和双刃剑一样,也给钓鱼团伙提供了更多样的攻击手段。
就在写下这篇文章的前夕,Solana 发布了 Action 和 Blink 这两个新的功能,大家在对这两个功能无限遐想的同时,也有人提出了钓鱼团伙可能利用新功能来行骗的警告。
Solana 上的钓鱼具有一键操作,隐蔽性高等特点,交易模拟功能由于 rpc 不稳定等原因有时并不能起作用,因此也不能完全依赖于这个功能。
建议有条件的用户可结合 Keystone 硬件钱包来进行交互,等于增加了一次额外的确认,避免由于冲动或者误点带来的快速确认交易。
此外 Keystone 也在硬件端对交易进行了解析,在软件钱包交易模拟失效的情况下,硬件端仍然能够解析交易内容,提供最后一道防线。
区块链的技术是在不断发展与变革中进化的,我们忧心新技术带来的风险,但却也不能因此而停下脚步,钓鱼团伙作为过街老鼠人人喊打,从业者包括硬件钱包、安全公司们也在不停地针对新的威胁迭代着解决方案。
作为普通用户,时刻提醒自己不被「免费馅饼」冲昏头脑,而是仔细检查交易内容,在这样的安全意识前提下,钓鱼就很难得逞。