专辑简介:

技术派是 PANews 推出的与技术相关的文章的集合地,如果你是研究技术的个人或团队,内容包括但不限于与智能合约相关的,与各大公链技术相关的,与安全相关的,欢迎 点击此处下载PANews 注册投稿,在这里让你技术文章让更多人受益,在这里你也能交到同好互相交流。

作者: 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中,不要轻易确认或者批准任何来历不明的交易,因为它可以拿你的签名代表你做任何事情。