DeFi安全篇:合约留后门,无脑授权有风险
很多用户在参与 DeFi 流动性挖矿的过程中,需要授权合约,但大家可能有所不知,如果你不小心授权了某些不靠谱的合约,钱包里的币就危险了。
之前就有人在 Twitter 上讨论过授权合约被钓鱼的案例,因不小心授权某些开了后门的合约,有人一夜之间被盗走价值 14 万美金的 UNI。
这个故事的主人公名叫 Jhon Doe,去年九月,他参与了 Unicats 收益农场,当时他对这个项目还蛮看好的,觉得它可能会成为下一个 YFI。(Unicats 项目合约地址:0xB246bcD5bAac8E342941d0f803d528b6668E42Cd)
接下来,Jhon 打算质押 UNI,然后收到了 MetaMask 钱包的提示,“需要授权合约无限使用UNI”(这里划重点:无限授权)。授权是在 DeFi 挖矿中是很常见的一个操作,所以他就没细看。
质押 UNI 之后,挖出来一些 MEOW,他觉得赚的差不多了,可以收菜收工了,就把资金都撤回了自己的钱包。(以太坊链上记录下了他收菜的过程:etherscan.io/tx/0x751ae0fba597496f057426672fb736efdc837aa0860f1d626b4e7dd6e9052c80)
撤走资金以后,Jhon 以为钱都放在自己钱包里就可以高枕无忧了。殊不知,这个合约留了后门,一旦他授权了这个合约使用自己的 token,即使他从挖矿池子中撤走资金,这个合约任何时候都能调用他的 token。
第二天醒来以后,Jhon 发现自己一半的 UNI 都在未通过自己授权和签署交易的情况下被转走了。
Jhon 一下子就懵了,他钱包的私钥从没有泄露过,钱包也没有漏洞,自己并没有操作过转账,钱好好放在钱包里还能被转走?排除了种种因素,推测出最有可能导致丢币的原因是:
以太坊网络上最流行的 token 使用的 ERC20 标准设计中的一个已知但经常被忽略的漏洞。
这个 UniCats 是个什么项目?为什么就能轻轻松松盗走别人钱包里的币?这让以后我们 DeFi 挖矿还敢挖吗?
“小猫钓鱼”
UniCats 是一个类似 Yam 和 Sushiswap 的 DeFi 衍生品项目,抄袭抄的赤裸裸的,连前端界面都和 Sushiswap 完全一样,除了可以挖平台代币 MEOW 之外,还可以挖 UNI 等其它代币,在 2 池中还可以质押 UNIOW 和 UNI 的 LP 代获得 MEOW 代币。为什么这个项目会选择 UNI 呢,因为当时 Uniswap 发币,很多 Uniswap 的老用户都免费领到了一堆 UNI 空投,大家不用专门买 UNI,会有比较低的参与门槛。
Jhon Doe 是参加这个协议的用户之一,当时 DeFi 的 fomo 情绪很浓,很多人都说“审计是为新手准备的”,所以进了这个坑也很难怪他。
JHON 先后在 UniCats 合约中质押了两笔 UNI,价值分别为 $17K、$15K,质押的操作要求他准许 UniCat 合约对钱包里 UNI 代币的无限制访问(链上记录了他授权的操作:etherscan.io/tx/0x12c4939adcd3783f451d104be266cfbe04b8142b31e4d6e8437a46256ec4fe06)。可能是因为 Jhon 看到大家都这么做,每个人都要一开始点击授权合约,所以没有对此有任何疑虑。
一开始还挺好的,收成不错,赚了一些 MEOW。耕种一天之后,Jhon 开始从 Unicats 合约中解押自己的 UNI。
链上记录:
etherscan.io/tx/0xaf90d9ff2e9dc63ef6c6082a18214f991cc52493b0cc5c47d84590faac798f42
etherscan.io/tx/0x751ae0fba597496f057426672fb736efdc837aa0860f1d626b4e7dd6e9052c80
收获颇丰,又入袋为安,是一次很成功的经历,他就放心地睡觉去了。
之后的事情,我们在上文也提到了。之后项目方表示:“出了 bug”、“被黑客入侵”、“项目方非常努力”...换句话说就是,他们希望这个项目有成功的未来,现在正在“把这个美好的项目留给社区”,然后就卷款删号跑路了。除了 Jhon 还有一些用户也被坑了,甚至有的人还没来得及撤出资金。
开发人员跑路前在Tg群发的消息
贪婪的“猫”
UniCats 合约的有一个功能:setGovernance(设定治理),有人读的未经审核合同可能掠过这部分,因为它是相当流行的有智能的管理重点和管理地址合同。
setGovernance 是开发者 Whiskers 用来直接从用户帐户中提取资金的功能。函数接收两个参数:一个地址、一些数据,需要将 _governance 设置为 UNI token 地址,并为数据传递函数 transferFrom(from:Jhon Doe,to:UniCats,amount:10K UNI),然后会触发 UNI 合约,要求它代表用户将资金转移到 UniCats 合约。
实际上,transferFrom 的调用者是 UniCats 合约,像刚才我们提到的 Jhon,他已经批准合约随意使用自己所有的UNI资产,合约会将 Jhon 的 UNI 资产转移到合约中相同的 trasnferFrom,然后从他的钱包中盗取资金。
当UNI合约收到此项调用时,会尝试这项请求不会遇到任何错误。所有的转账都会通过,因为 Jhon 确实授权了合约来处理他的资金。资金从 Jhon 的帐户中转到 UniCats 合约中,然后再转给 Whisker。
所以关键点就在于 Jhon 对 UniCats 合约的授权。
除了 Jhon 之外,这个诈骗合约也有其他一些受害者,比如另一位用户也是通过完全相同的过程损失了 1 万个的 UNI,他质押在 UniCats 中的资金全被删除了,根本无法提现。
有一个信息大家需要知道,即使你地址余额为 0,这个无限批准的风险都还在,也就是说 UniCats 随时都能把你的钱拿走。只要你没有撤消批准,或者这个账户/地址之后完全废弃再也不用了,就会随时会被攻击。
在盗取了用户的资金之后,UniCats 项目方将 UNI 换成 ETH,然后将 ETH 被转移到 Whiskers 控制的帐户中,接着又以每次100 ETH的方式存入Tornado Cash(混合服务)。
练习钓鱼
在 UniCats 项目方发起攻击之前,Whiskers 还做过一些链上的练习(链上记录:etherscan.io/tx/0x83b3549e8597fbfa526bc46dc48160975cf08fd951f955dca9a0da3f5727e7d9),创建了一个单独的合约和管理员帐户(由 Torando 现金资助),以确保黑客攻击能够正常工作。
在此交易中,Whiskers 尝试使用相同的 setGovernance 调用,直接从合约中提走少量 UNI,从合约中获取 2.75 UNI(当时价值 9 美元)。这个是第一阶段,UniCats 合同本身的资金被耗尽。
后来,该帐户执行另一种转账练习,它滥用了 baDAPProve 漏洞,由 Tornado 现金资助的帐户将少额UNI直接转换为ETH。
这些练习运行了几个小时之后,才发起了正式的攻击。正式攻击的方式和练习的方式基本上是差不多的,都是分两个阶段。
练习攻击的记录:etherscan.io/address/0xcdd37ada79f589c15bd4f8fd2083dc88e34a2af2
回顾
曾经与 Unicats 进行过互动但尚未拒绝UniCats使用其令牌的每个帐户,在它们这样做之前都仍然很脆弱。即使是那些只批准了令牌但从未实际发送过任何资金的人。
在直接抽走 UniComp 合约的同时,whiskers 能够在 Uniswap、SushiSwap 和 Balancer上获取 17K UNI(约 5 万美元)以及押注 LP 代币的 UNI/ETH。(完整的交易 list 可以看这里:https://explore.duneanalytics.com/queries/11061/source)。
在第二阶段,使用 baDAPProve 漏洞,Whiskers 总共捞了 6 万 UNI(价值约 18 万美元)。这些钱是从大概 30 个账户中取出来的,损失最大的是 Jhon Doe,总共损失了 37K UNI,当时价值约 12 万美元。从他们账户中拿走的资产比他们原本在协议中质押要多,因为Jhon的UNI并不是全部质押进合约中挖矿了。
每一个曾经和 Unicats 交互过,并且授权 UniCats 使用自己代币的账户都随时有被攻击的风险,哪怕仅仅只是授权过但从没有转过资金。
你可能会觉得这个故事中的 Jhon Doe 很笨,但其实他在 DeFi 领域还挺有经验的,他的地址有超过 1600 笔交易。
这是一场很“完美”的攻击,需要无限使用的授权,很少有人真正了解其中的含义。在大环境的 fomo 情绪下,每一个投资者都梦想暴富,渴望自己找到下一个 YFI,黑客就是从中利用了这些因素以及这些系统经常试图隐藏的复杂性达到目的。
如何保护自己免受攻击
我建议,参与DeFi时,只授权可信任的合约,如果是去体验新项目,用的资金要控制在自己能承受的最大损失之内,以将风险最小化。
这次攻击的根源在于ERC20的工作方式以及它的一些限制,这个限制仅存在于ERC20协议中,其它的协议标准还没有这个问题,但是由于ERC20仍然是最受欢迎的token标准,所以大家有必要了解一些策略来避坑:
首次与未知的DeFi合约交互时,要先做研究。
诸如MetaMask这样的钱包有一个功能是,可以自己设置最大批准的金额。如果你不完全信任一个DeFi合约时,就可以提前进行设置,把风险控制在自己能够承担的范围之内。
如果你已经授权了一些 DeFi 合约,而且有一些顾虑,不太确定会不会有风险,就可以用工具撤销授权,我给大家介绍几个工具:
approved.zone
revoke.cash
tac.dappstar.io/#/
未来 DeFi 和 ERC20 都会继续发展壮大,建议大家好好学习,了解清楚这些复杂的金融系统,保护好自己的钱袋子,注意安全!
微信扫描关注公众号,及时掌握新动向
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场