摘要
在以太坊中,ERC20 代币被公司或用户广泛用于构建去中心化应用程序(DApps)。许多 ERC20 代币获得了巨大的价值并在加密货币市场流通。此外,随着 DeFi 生态系统的蓬勃发展,ERC20 代币的交易变得越来越频繁。基于 ERC20 的标准,调用 approve() 方法授予 DApps 或其他用户提取代币的权限。实际上,许多 DApp 要求用户进行无限制的授权,而这种设计带来了严重的问题。一系列事件的发生给用户和 DApp 本身都带来了巨大的损失。
0xffffff. 前言
“无限制授权”作为一个长期讨论的话题,随着 DeFi 的蓬勃发展和一些安全事件的出现而浮出水面。受到许多安全事件的启发,我们正再次尝试从不同方面对“无限制授权”进行全面调查。同时,我们也受邀参加 第 29 届区块链村会议,就此问题发表演讲。
阅读建议:
- 如果您是 Ethereum 的初学者,强烈建议您阅读整篇博客。
- 如果您是 Ethereum 专家并对无限制授权有一定经验,您可以从 0x2 部分开始阅读。
0x0. 背景
在深入讨论“什么是无限制授权”之前,我想先回顾一下“ERC20 代币中的授权是什么?”。
ERC20 代币
在以太坊中,除 Ether 外,各种代币在加密货币市场流通且价值巨大。ERC20 是最流行的代币标准。根据我们未完成的统计,CoinGecko(一个聚合代币价格的网站)和 Uniswap(目前最著名的去中心化交易所之一)已记录了超过 5,600 种和 44,000 种 ERC20 代币。
授权机制
授权过程主要涉及三个实体(发送方、接收方 和 代币合约)以及 ERC20 标准中的两个函数(approve、transferFrom)和两个变量(balanceOf、allowance)(如下图所示)。

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

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)。如果您想了解更多关于这些事件的信息,可以点击下方提供的链接:
- UniCat 事件:链接
- Bancor Finance 事件:链接
- Primitive Finance:链接1,链接2
- Furucombo:链接,链接 (中文)
- DeFi Saver:链接
- Degen Money:Twitter
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 商店的信息(下图所示),Coinbase和Metamask都拥有超过 100 万的安装量。不知何故,Coinbase获得了更多的客户评论,并且评分更高。

关于这两个钱包的调查,我们使用它们在 Compound 平台上测试兑换功能。请注意,Compound 平台默认对用户进行无限制授权。
钱包 1:Metamask
如下图所示,当用户审查 Compound 构建的授权交易时,他们基本可以看到完整的信息,包括接收方地址、授权签名和授权金额(步骤 2)。此外,Metamask甚至允许用户通过“编辑”按钮修改他们的授权金额(步骤 2、3、4)。

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

0x223. 平台:Bancor & Curve Finance
在本节中,我们将比较 Bancor 和 Curve Finance。如下图所示,根据 defipulse 的最新统计(2021 年 8 月 7 日),Curve Finance 和 Bancor 分别是总锁定价值方面排名第一和第五的 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 的用户,建立安全意识不应该是被利用后的结果,而是在一开始就应该具备的意识。我们相信,构建一个安全繁荣的以太坊环境,不仅是社区的责任,也是我们每个人的责任。
关于我们
Twitter:https://twitter.com/BlockSecTeam



