一键撤销ERC20授权【DeFi安全必备】

以太坊最新的趋势是去中心化金融(DeFi),DeFi的主要应用是贷款、抵押和交易ERC20代币等。要在DEFI协议中使用ERC20代币,例如Uniswap,AAVE或Yearn,你必须授权给DAPP代表你操作代币— 这被称为ERC20授权。这些授权行为是DeFi平台功能不可或缺的一部分,但如果任其发展,可能会很危险。REVOKE是一个免费的在线应用,可以一键检查你的钱包地址持有的ERC20代币对各种Dapp的授权情况,并可以根据需要及时撤销对Dapp的授权或更新授权额度。

在这里插入图片描述

用自己熟悉的语言学习 以太坊DApp开发Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

1、为什么Dapp需要你的ERC20授权?

使用以太坊的原生ETH,可以调用智能合约功能并同时将ETH发送到合约中。这是使用所谓的payable函数来完成的。但是由于ERC20代币本身就是智能合约,因此无法直接将代币发送到智能合约,同时调用其功能。

因此,ERC20标准允许智能合约使用transferFrom()函数来以用户的名义转移代币。为此,用户需要允许智能合约代表他们操作这些代币。

这样,用户可以将代币“存入”到智能合约中,与此同时,智能合约可以更新其状态以反映出这一存入状态。相反,如果你仅向合约发送ERC20代币,则合同无法更新其状态(例如,将存款记入你的帐户)。

在这里插入图片描述

例如,如果你想将DAI“存入” Aave以赚取利息,则需要首先允许Aave合约从你的钱包中提取一些DAI。然后当你调用Aave合约的函数时,就可以指定要存入的DAI数量。使用transferFrom()函数,Aave合约将从你的
钱包中提取确切的金额,并使用相同数量的aDAI代币记入你的名下。

2、为什么无限ERC20授权存在安全风险?

当将特定金额(例如100 DAI)存入合约时,你可以选择设置恰好该金额的授权。但是,许多Dapp向用户请求无限量的授权。

这有助于提供良好的用户体验,因为用户不需要在每次希望存入代币都批准新的授权。通过设置无限制的授权,用户只需要批准一次,而无需为以后的存款重复该过程。

但是,此设置有很多缺点。众所周知,即使在已建立的项目中,漏洞也可能存在并且可能被利用。通过为这些平台提供无限制的授权,你不仅可能使存入的资金面临这些风险,而且还可以使你“安全”持有在钱包中的代币面临风险。

在Devcon V的演讲中,Paul Berg提到了这一点。在开发Sablier 时,Paul在他的智能合约中发现了一个bug(已经修复!),不仅存入的DAI(100美元)有风险,而且测试者钱包中的所有DAI都处于危险中(1万美元)!

3、ERC20授权问题在现实世界中的风险

长期以来,无限授权的风险在很大程度上是理论上的,并且在产品上线之前,Paul已经修复了Sablier的错误。那时还没有任何利用ERC20配额的漏洞利用,但随着平台不断使用无限授权,在过去的一年中,我们已经看到了许多这样的漏洞利用。

意外错误导致的ERC20授权风险

今年早些时候,Bancor遇到了一个漏洞,该漏洞使用户的资金面临风险。ERC20transferFrom()函数被意外地定义为public而不是private,这使任何人都可以执行它并耗尽用户的钱包。Bancor对合约进行了白帽攻击,以控制损失,并将资金退还给用户。

对ERC20授权的恶意攻击

除了像Bancor这样的偶然错误外,还存在其他一些恶意利用。在2020年夏天的DeFi热潮期间,人们为每个以食物为主题的新型DEFI分叉币而疯狂,其中包括一些直接的骗局。即使人们试图通过仅存入少量钱来限制风险,但由于不受限制的ERC20授权,钱包中的资金仍然面临风险。

在这里插入图片描述

ZenGo在一个名为UniCats的项目中报告了这样一种利用。人们将Uniswap(UNI)代币存入UniCat就可以收获MEOW代币,但是要存这笔钱,他们必须无限制地给予授权。当UniCat项目不可避免地陷入困境时,诈骗者不仅拿走了存入的资金,而且还拿走了用户钱包里所有的UNI代币。

另一个类似的情况发生在一个名为Degen Money的项目中,该项目使用了一种不太复杂(但效果也不差)的方法。他们没有开发自己的智能合约,而是创建了进行两次批准交易的前端。一个到有效的合约,另一个到完全不同的地址。

由于许多人没有专门检查合约地址,因此攻击者可以耗尽用户的钱包。

4、硬件钱包可以对抗ERC20授权风险吗?

通常,硬件钱包比移动、桌面或基于浏览器的钱包要安全得多。原因是控制资金的私钥安全地存储在硬件钱包中,并且永远不会离开设备。因此,通过使用硬件钱包,你可以确保没有人可以窃取您的私钥。

但是,ERC20授权的问题在于,没有人需要窃取你的私钥来从钱包中提取代币。因此,硬件钱包无法为本文讨论的漏洞提供任何保护。

使用硬件钱包仍然是一个好习惯,因为它们确实可以保护你免受一系列其他可能的攻击。但是需要注意的是,它们不能防止ERC20授权漏洞利用或许多其他智能合约漏洞利用。

5、Dapp开发人员如何应对ERC20授权风险?

Paul在Devcon上的演讲中,提到了无限授权问题的几种可能的解决方案,它们各有优缺点。这些解决方案中最实用的是使用 批准-支出 模式。在这种模式下,Dapp仅要求用户批准他们当时想要使用的确切金额,而不是要求无限量授权。

这会导致糟糕的用户体验,因为用户每次想要发送交易时都需要发送新的授权交易,而不是之前仅需进行单个授权操作。这还具有另一个缺点,即交易费用更高,当以太坊Gas费用像去年夏天一样上涨时,这尤其麻烦。

因此,更好的选择是向用户提供选择,他们可以选择仅批准他们当时需要花费的费用,或者如果他们打算在不久的将来进行更多交易,则可以批准更大的金额。此策略已被多个项目采用,例如1inch.exchange和Curve.fi。

在这里插入图片描述

减轻交易成本的另一种解决方案是采用诸如EIP2612之类的标准,该标准使用户可以签署一条消息以设置其授权额度(免费),而不必发送交易即可。但是,该标准并未得到广泛采用,并且围绕它建立的工具也不多。

6、用户如何来应对ERC20授权风险?

由于ERC20授权是许多智能合约功能不可或缺的组成部分,因此不能完全停止审批Dapp的授权要求。但是在可能的情况下,请尽量避免无限额度的授权。

人们比一年前更加了解此问题,因此某些dapp允许你选择仅授权目前需要花费的金额还是无限授权,但大多数应用仍然未提供此选项。即使这样,高级用户也可以通过Metamask的界面降低其授权额度。

在这里插入图片描述

当你使用dapp时,如果要大量使用该dapp并且信任该项目,那么可以无限制的授权;如果不经常使用dapp或不信任该项目,那么就授权较小的额度)。在这两种情况下,都应定期(例如每月)复查你的授权额度,并撤销不再使用的授权。

7、用REVOKE一键审查/更新/撤销ERC20授权

REVOKE是一个可以帮助你检查并更新或撤销ERC20代币授权额度的在线应用,你可以一键检查你的钱包地址持有的ERC20代币对各种Dapp的授权情况,并可以根据自己的需要及时撤销授权或更新授权额度:

在这里插入图片描述

8、结论

ERC20授权对于许多分散式应用程序的运行必不可少,但与此同时,无限的授权通常对安全性有害。我们已经看到了2020年利用ERC20配额的几项漏洞利用,如今对该问题的认识比一年前要高得多。作为用户,你可以做一些事情来减轻所讨论的风险,例如使用REVOKE定期检查和撤销不必要的对Dapp的授权。


原文链接:一键撤销ERC20授权 — 汇智网

猜你喜欢

转载自blog.csdn.net/shebao3333/article/details/113822466