便利性与安全性之权衡:ERC20 中的无限授权

探索以太坊ERC20代币标准中无限批准的风险。

便利性与安全性之权衡:ERC20 中的无限授权

摘要

在以太坊中,ERC20代币被公司或用户广泛用于构建去中心化应用程序(DApps)。许多ERC20代币获得了巨大的价值并在加密市场中流通。此外,随着DeFi生态系统的蓬勃发展,ERC20代币的交易变得更加频繁。基于ERC20的标准,调用approve()方法来授权DApps或其他用户提取代币。实际上,许多DApps要求用户进行无限期授权,而这种设计带来了一个严重的问题。一系列事件的发生导致用户和DApps本身都遭受了巨大的损失。

0xffffff. 前言

“无限期授权”作为讨论已久的话题,随着DeFi的蓬勃发展和一些安全事件的出现而浮现。受许多安全事件的启发,我们再次尝试从不同方面对“无限期授权”进行全面调查。同时,我们还受邀参加了第29届区块链村会议,就此问题进行演讲。

阅读推荐:

  • 如果您是Ethereum新手,我们强烈建议您阅读全文。
  • 如果您是Ethereum专家并具有一些无限期授权的经验,您可以从0x2部分开始阅读。

0x0. 背景

在深入讨论“什么是无限期授权?”之前,我想先回顾一下“ERC20代币中的授权是什么?”。

ERC20代币

在以太坊中,除了Ether之外,各种代币在加密市场中流通并具有巨大的价值。ERC20是最流行的代币标准。根据我们未完成的统计,在CoinGecko(一个聚合代币价格的网站)和Uniswap(目前最著名的去中心化交易所之一)中已记录了超过5,600个和44,000个ERC20代币。

授权机制

授权过程主要涉及三个实体(发送者接收者代币合约)以及ERC20标准中的两个函数(approvetransferFrom)和两个变量(balanceOfallowance)(如下图所示)。

为了理解授权过程,我们展示了下图并解释了approvetransferFrom函数如何改变代币合约的状态。

  1. (步骤1)作为初始状态,发送者在合约中持有100个代币,而接收者没有收到发送者授权的任何allowance
  2. (步骤2)发送者调用approve函数,将100个代币的权限授予接收者。因此,allowance[sender][spender]从0增加到100,发送者的balanceOf没有变化。
  3. (步骤3)最后,接收者调用transferFrom将80个代币从发送者转移到自己。结果是,发送者接收者balanceOf都更新了(即20和80),同时接收者的allowance减少到20。

现实世界中的三种授权类型

在现实世界中,我们可以根据授权金额将所有授权分为三种类型。

  • 零授权: 授权金额等于零。这基本上意味着用户/发送者试图撤销其对某个平台/接收者的授权。
  • 无限期授权: 授权金额等于uint256的最大值(0xffff...ffff)或代币的总供应量。这种类型的授权被许多DeFi平台(如交易所、借贷平台)频繁使用。
  • 其他授权: 这种授权涵盖其余情况。用户通常基于平台或钱包支持的修改功能来启动此授权。

0x1. 现实世界中的事件

之前提到的授权问题也发生了一些现实世界中的事件。在我们的演讲中,我们详细回顾了其中两个(UniCat、Bancor Finance)故事。如果您想了解更多关于这些事件的信息,可以点击以下链接:

0x2. 一些测量

在本节中,我们将从链下和链上两个方面展示我们的详细调查。为了更好地理解“无限期授权”的现状,我们扮演前端用户的角色进行测量。

现实世界中的授权过程

上图显示,前端用户可能需要六个步骤来完成一个授权交易。主要有个实体(前端用户、钱包、平台、代币合约)。现在,让我们一步一步地分析流程:

步骤1、2: 首先,大多数前端(移动、网站)用户将他们的钱包连接到选定的平台并发送服务请求。

步骤3: 然后,平台将包含所需数据(最重要的是授权金额)的授权交易构建好,并发送到用户的钱包进行确认。

步骤4、5: 收到授权交易后,钱包会向用户显示相应的信息,并等待用户确认。

步骤6: 用户确认交易后,钱包会将交易发送到网络进行验证。此外,验证后的交易将修改代币合约的状态(Allowance[User][Platform])。

(在接下来的部分,我们将首先介绍我们对每种测量类型(链下和链上)的动机。然后,我们将从不同方面展示我们的测量结果和发现。)

链下调查

动机

在现实世界的授权过程中,我们可以轻松地发现前端用户直接与钱包和平台的UI进行交互。因此,我们选择了15个知名钱包和24个DeFi(去中心化金融)平台进行链下调查。

(调查结果汇总在下图中的两张图中。)

此外,我们主要考虑它们在授权方面的解释和灵活性:

  • 解释
  • 钱包:1)钱包是否显示了有意义的授权交易信息(包括用户、接收者、代币和授权金额);2)钱包是否对“无限期授权”发出特殊警告或通知用户
  • 平台:(标准1)平台是否在其Web UI上为授权交易提供有意义的解释;(标准2)平台是否通知用户授权交易的存在;(标准3)平台是否通知用户两个交易是连续执行的
  • 灵活性:无论是在钱包还是平台中,UI是否提供对授权金额的修改功能

(在接下来的部分,我们将展示上述两个方面在钱包和平台中的表现结果。我们为钱包和平台各选择两个案例。)

0x222. 钱包:Metamask & Coinbase

我们将展示我们在Coinbase钱包和Metamask(chrome扩展)钱包上的调查结果。根据Google Play商店的信息(下图所示),CoinbaseMetamask都拥有超过100万次安装。某种程度上,Coinbase从客户那里获得了更多的评论,并且得分更高。

关于两个钱包的调查,我们使用它们来测试Compound平台上的交换功能。请注意,Compound平台默认对用户进行无限期授权。

钱包1:Metamask

如下图所示,当用户审查Compound构建的授权交易时,他们基本上可以看到完整的交易信息,包括接收者地址、授权签名和授权金额(步骤2)。此外,Metamask甚至允许用户通过“编辑”按钮修改他们的授权金额(步骤2、3、4)。

钱包2:Coinbase

与Metamask钱包相比,Coinbase钱包根本不显示任何重要信息。用户只有在确认授权交易后才能查看更多详细信息(下图)。请注意,步骤2、3、4仅在授权交易处于待处理或已完成模式期间之后显示。因此,Coinbase钱包隐藏了授权交易的必要信息,并且不提供对授权金额的任何修改功能。

0x223. 平台:Bancor & Curve Finance

在本节中,我们将比较BancorCurve Finance。如下图所示,根据defipulse的最新统计数据(截至2021年8月7日),Curve FinanceBancor在总锁仓价值方面分别为第一和第五大DEX(去中心化交易所)。

在对这两个平台的调查设置中,我们将使用Metamask钱包来测试这两个平台提供的交换功能。

平台1:Bancor

我们在测试Bancor的交换功能时,它解释了需要进行授权交易(下图),甚至为用户提供了两个选项(无限期/有限期授权)。除了无限期授权外,Bancor中的有限期授权仅需要用户用于交换的确切allowance金额。

平台2:Curve Finance

然而,在Curve Finance上,发生了一件“有趣”的事情。如下图所示,当我们请求交换时,Curve Finance的UI显示“请批准10 USDT进行兑换”(下图),但Metamask却收到一个无限期授权交易。这绝对是对用户的误导信息。

后来,当我们试图就此事与Curve Finance确认时,他们承认了我们的担忧,并表示这是因为“用户不喜欢每次都授权”(下图)。

Curve Finance类似,Yearn Finance的UI也存在同样的问题。(我们在演讲中也提到了并展示了证据。)

0x23. 链上调查

0x231. 动机

为了进一步了解链上“无限期授权”的情况,我们收集了所有交易(截至2021年4月30日)继续我们的探索。如下图所示,“无限期授权”的数量近年来增长非常迅速。在我们的调查中,我们发现UniswapV2的引入似乎是刺激“无限期授权”增长的主要因素。而且,我们将根据测量结果详细解释这一点。

同时,为了代表代币和平台(因为它们是比用户本身更相关的术语)来探索“无限期授权”,我们将从两个方面进行调查:

  • “无限期授权”的分布
  • 风险分析

0x232. “无限期授权”的分布

为了帮助理解下图,我们将首先解释图中提到的每个术语:

  • Y轴(最高授权比率):值越大 -> “无限期授权”在所有授权交易中的百分比越高
  • X轴(活跃度):值越大 -> 平台或代币越活跃。活跃度取决于授权交易的数量以及第一次和最后一次授权交易之间的时间差
  • 点的大小:尺寸越大 -> 涉及的代币或平台授权交易越多

(下图仅显示了授权交易中涉及频率最高的前1000个代币/平台)

(平台)

(代币)

平台: 从平台的图表中可以看出,UniswapV2在三个方面都明显领先于其他平台。这就是为什么我们声称“UniswapV2的引入似乎是刺激‘无限期授权’增长的主要因素”。

代币: 关于分布,USDC、USDT和DAI表现最好,基于上述三个术语。这些代币都是稳定币,因为稳定币通常用于加密市场的交易。至于其他突出显示的代币(前10名代币),它们在最高授权比率方面非常相似。

0x233. 风险分析

根据之前的结果,我们选择USDC、USDT、DAI(前3名代币)和两个平台(Bancor、UniCat)进行风险分析。同时,我们还定义了两个术语(下图所示)来帮助揭示已授权代币的风险。

风险金额

  • 对于代币,风险金额等于通过调用transferFrom函数可以转移的总代币数量
  • 对于平台,风险金额等于通过调用transferFrom函数可以转移的单个代币的总量

风险率

  • 对于固定代币,风险率代表风险金额占该固定代币总供应量的百分比

代币: 如下图所示,USDC和USDT在一年半的时间内都相当稳定(风险率在10%左右)。DAI在年中经历了急剧下降,最终稳定下来(也约占10%,但波动更大)。这种现象可能表明存在特定事件或DAI的工作机制。因此,我们还有一些工作要做来探索原因。

平台: 关于平台的风险分析,我们将展示Bancor(使用BNT代币)和UniCat(使用UNI代币)的风险金额趋势图(下图)。

Bancor的趋势图显示了即时增长和下降。这实际上完美地解释了团队如何快速将他们可被利用的代币从错误合约转移到安全的地方。

至于UniCat的趋势图,我们确认一些明显的下降实际上是由UniCat的后门攻击造成的。

0x3. 现有解决方案

如前所述,“无限期授权”是生态系统中长期存在的一个问题。通过各种讨论,已经提出了一些解决方案来改进授权过程:

  • ERC777
  • EIP2612

在介绍解决方案之前,我们想再次提醒您“无限期授权”的根本动机:

  • approve/transferFrom都需要两个交易
  • 定制的授权要求用户在每次交易或存款前进行授权(这意味着需要支付更多交易费用)
  • 平台希望通过一次性要求无限期授权来最大化用户体验

0x31. ERC777

作为2017年提出的代币标准,ERC777在改进ERC20代币的授权过程方面具有以下优点:

  • 用户可以“授权”一个操作者(如交易所)以期望的金额转移他们的代币
  • 用户不必反复提交授权交易
  • 用户不必担心“无限期授权”的风险

总之,通过ERC777,用户可以与任何授权的操作者实现原子化购买。

然而,ERC777的缺点也很明显:

由于标准中应用的钩子(更多详情),交易费用很高。 用户必须选择一个值得信赖的操作者(这又将问题抛回给用户)。

0x32. EIP2612

关于EIP2612,在该提案中,作者指出用户可以使用签名消息进行交易验证,这样用户就不需要支付任何交易费用来修改他们的allowance。更直接地说,通过EIP2612,授权交易变得免费。此外,该提案目前被UniswapV3用于借贷提供者代币

0x4. 结论

总而言之,“无限期授权”确实降低了用户执行多次授权交易的成本。然而,通过我们的调查,一些平台和钱包在便利性和安全性之间的权衡中仍然显得无害。更糟糕的是,其中一些甚至试图通过显示错误信息来误导用户。因此,我们建议平台和钱包不要使用“无限期授权”,而应认真考虑开发更安全的UI或协议来从一开始就保护用户。作为DeFi的用户,培养安全意识不应是利用漏洞的结果,而应是在一开始就具备的意识。我们相信,构建一个安全繁荣的以太坊环境不仅是社区的责任,也是我们每个人的责任。

关于我们

https://www.blocksecteam.com

[email protected]

Twitter:https://twitter.com/BlockSecTeam

Medium:https://blocksecteam.medium.com/

Sign up for the latest updates