原文作者:Fairyproof
前两天,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)。这点同以太坊是⼀致的,并没有什么反常识。
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中,不要轻易确认或者批准任何来历不明的交易,因为它可以拿你的签名代表你做任何事情。