前两天,Solana区块链上出现了安全预警,有⼀篇⽂章指出⼀个名为
https://officialsolanarares.net/mint/ 钓⻥⽹站在⽤户批准之后,可以将⽤户的原⽣代币转⾛。在该⽂章 中提到了⼀点:
恶意合约在⽤户批准(Approve)后,可以转⾛⽤户的原⽣资产(这⾥是SOL),这点在以太坊上是不可能的,以 太坊的授权钓⻥钓不⾛以太坊的原⽣资产(ETH),但可以钓⾛其上的Token。于是这⾥就存在“常识违背”现象,导致⽤户容易掉以轻⼼。
其实该⽂章这⾥的说法是不甚准确的,混淆了批准交易和Solidity中ERC-20代币授权这两个不同的概念。
真实情况是通过Solana的签名扩散机制,恶意合约直接盗取了⽤户的SOL资产,和通常意义上的授权并没有什么关联。
1. 以太坊中的授权
在以太坊中,通常意义上授权是指⽤户调⽤代币合约,向其它地址(合约)授权⼀定处理额度,这样我们在和其它 合约交易时,可以⽅便的⽀付ERC-20代币。
在这⾥,授权是必须的,否则第三⽅合约⽆权处理⽤户的代币资产。同时,这种机制也伴⽣了⼤量的授权攻击,只要你授权了恶意合约,恶意合约就可以转⾛你的ERC-20代币。
2. Solana中的授权
在Solana中,代币⼀般为官⽅提供的spl-token合约,它模拟了ERC-20代币的⾏为,因此也存在类似的ERC-20授权 概念。同样授权第三⽅合约后第三⽅合约可以处理⽤户的代币(注意不是原⽣币SOL)。这点同以太坊是⼀致的,并没有什么反常识。
全球最大肉类生产商JBS支付了1100万美元比特币解决勒索软件的网络攻击:据道琼斯报道,全球最大肉类生产商JBS美国业务首席执行官AndreNogueira周三表示,该公司已向造成其业务中断的黑客支付了1100万美元比特币的赎金,“这笔以比特币支付的赎金是为了保护JBS肉制品工厂免遭进一步破坏,并缓解与JBS有关的餐馆、杂货店和农民在此事件中遭受的潜在影响。”Nogueira还称,“付钱给罪犯是非常痛苦的,但我们为客户做了正确的事。”[2021/6/10 23:26:20]
3. Approve的涵义
不管在以太坊中还是在Solana中,我们习惯将Approve当作授权(ERC-20协议⾥有approve函数),因此⾃然⽽然的会认为是代币授权。当我们使⽤MetaMask钱包时,如果是代币授权交易会明确提示授权,并且所有交易弹出的 是⼀个确认按钮。然⽽在Solana的 Phantom钱包⾥,弹出的是⼀个Approve(批准)按钮,让⼈很容易以为是授
权交易。但真实情况是批准⼀次交易⽽并不是进⾏代币授权。所以安全预警中出现的被盗⾏为,是⽤户批准了⼀个未知交易,⽽不是⽤户进⾏了SOL的授权操作,当然也就不能说是授权偷⾛了原⽣币。
4. 交易直接转⾛原⽣货币
交易转⾛批准者的原⽣货币,例如SOL和ETH,是⾮常简单的。在以太坊上的Solidity中,只要调⽤⼀个 payabletransfe的函数就可以转⾛交易⽤户的ETH;在Solana中,相应的,只要调⽤系统合约的户的SOL资产,这和我们平常讲的代币授权概念是没有任何关系的。
函数也能转移⾛交易⽤不同的是,在Solidity中,ETH转移发⽣在合约调⽤的时候,因此钱包可以提前知道要转移的ETH数量并显示出来, ⽽在Solana中,转移是发⽣在合约内部的,因此钱包⽆法提前知晓你会被转⾛多少SOL,当然也会⽆法显示。只要你签名认同了这笔恶意交易,你就相当于签名认同了这次SOL转移,这正是这次Solana上钓⻥盗取的问题所在。
⼀段类似如下的代码就可以在合约内部转移 user 的SOL。
5. Solana中的签名扩散机制
在Solana中,有⼀个签名扩散机制。⽤户调⽤合约A,此时合约A中⽤户是签名批准的。当合约A内部调⽤合约B 时,⽤户的签名会随着跨合约调⽤⼀起扩散到合约B。因此,在合约B中,⽤户也是签名批准的。所以这⾥存在⼀个安全⻛险,当签名⼀个恶意合约时,恶意合约就获取了我们这个签名,然⽽它可以拿我们这个签名做任何事情!!!!!!!
在上述的偷盗事件中,⽤户同恶意合约 3VtjHnDuDD1QreJiYNziDsdkeALMT6b2F9j3AXdL4q8v 进⾏交易,该合约直接调⽤系统合约转移⽤户的SOL,因为签名随着调⽤⼀起扩散到了系统合约,因此系统合约认为该笔交易也是批准过的,是正常的,所以就转⾛了⽤户的资产。
6. 具体被盗交易
其中⼀笔被盗交易:
https://explorer.solana.com/tx/4j33JSGRS6rD5irzW1cA9wjQAvAgVDAnBTrGRjqtqBBWXspTzU5HpEFwTeCC2uD9hH9eA2Pw5ddHyd5JyG6h6cNq
我们可以看到该交易涉及的输⼊账号:
这其中:
⽤户账号:4XF4wyjein7ZN4RPM6YK2mC2mC6T41cZAoKjJqpP19fR
SOL转移账号:BepccLHDcXqqHi6MfpTDo9Sfc5tmRjmSC1XY48Tb8HuY
恶意合约地址:3VtjHnDuDD1QreJiYNziDsdkeALMT6b2F9j3AXdL4q8v
从上可以看出,⽤户账号调⽤合约后转移了1.2545 SOL到转移账号。同时我们可以看到并没有涉及到spl-token代币合约,出产没有通常意义上的授权这么回事。
其交易打印出的⽇志为:
从⽇志中也可以判断,恶意合约仅是简单的调⽤了系统合约转⾛了⽤户的SOL,因此⽤户签名批准了对恶意合约的交易,这个签名也扩散到了系统合约,因此判定有效。
7. 结论
在Solana中,不要轻易确认或者批准任何来历不明的交易,因为它可以拿你的签名代表你做任何事情。
关于Fairyproof
Fairyproof是一家专注区块链生态安全的公司,公司主要通过“代码风险检测+逻辑风险检测”的一体化综合方案服务了诸多新兴知名项目。
团队成员参与发起并提交了以太坊领域的多项标准草案,包括ERC-1646、ERC-2569、ERC-2794,其中ERC-2569 被以太坊团队正式收入。
团队参与了多项以太坊项目的发起及构建,包括区块链平台、DAO组织、链上数据存储、去中心化交易所等项目,并参与了多个项目的安全审计工作,在此基础上基于团队丰富的经验构建了完善的漏洞追踪及安全防范系统。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。