“是便利还是阴谋”:以太坊ERC20代币的无限授权该何去何从?
0xffffff. 前言
“无限授权”作为一个被长期关注的话题,随着DeFi生态的发展和与其相关的攻击事件的不断发生,一次又一次地被摆上了台面。受大量攻击事件的启发,本文对这一话题展开了详细的研究。我们获邀在DEFCON 2021 (Blockchain Village 29)(https://www.blockchainvillage.net/)发表主题演讲。以下为会议视频的相关链接:https://www.bilibili.com/video/BV1w54y1E7f1/。
阅读建议:
如若您是刚刚接触以太坊不久,这里建议您阅读全文。
如若是大佬驾临或者有以太坊相关知识背景的读者,可以直接从0x2部分开始阅读了解我们的工作。
0x0. 无限授权·之·背景介绍
在分析ERC20代币的无限授权问题之前,我们首先再回顾一下到底什么是ERC20代币授权?
0x01. ERC20 代币中的代币授权
在以太坊中,除了以太币(Ether)之外,还流通着各种各样的代币(Tokens)。ERC20是现存各种代币标准中最为流行的一种。据我们不完全的统计,代币价格统计平台CoinGecko与链上著名交易所Uniswap分别收录了超过5,600和44,000种符合ERC20标准的代币。
关于ERC-20代币的授权操作,其中主要涉及到三个主体(用户/User,代币合约/Token Contract,平台/Spender)以及ERC20标准中的两个变量(balanceOf
,allowance
)和两个函数(approve
,transferFrom
函数)。简单来说,关于授权行为,如果用户想要在相关平台上使用他/她们的代币,用户必须先完成一个授权交易(涉及到allowance变量和approve函数),然后再执行他/她们的动作交易(涉及到balanceOf和allowance变量以及transferFrom函数)。也就是说,广泛意义上讲,用户需要通过两个交易来使用他/她们的代币(类似 存币,兑换,等等行为)。
0x02. 代币授权分类
理论上,基于所授权代币的数量,我们可以将代币授权分为三类:零授权,无限授权以及其他授权 。
零授权:
授权代币数量为零
零授权同样也可以理解为授权驳回(revoke),相当于取消平台对你相关代币的转账权限
无限授权:
授权代币数量为数据类型uint256
的最大值(0xffff..ffff)或相关代币的总供应量
无限授权作为提高用户体验的方案被广泛应用于许多平台(例如,交易所、借贷平台等)
其他授权:
该类型代币授权,往往是用户通过平台以及钱包提供的更改功能,自行设定授权操作中他们所想要提供的代币数量
0x03. 举个栗子
为了更好地理解代币授权的流程以及授权的目的,在此我们会以用户在Uniswap上置换USDT为例进行解释说明。
如果一个用户想通过去中心化交易所Uniswap将80个USDT兑换成其他代币,那么用户和平台的在代币合约上的状态会如何变化呢?
首先,关于具体的操作,用户需要调用USDT合约中的approve
函数将一定数量的USDT授权于Uniswap。随后,Uniswap在执行用户兑换代币的请求时,通过调用USDT合约中的transferFrom
函数使用用户的代币。然而,这里的“一定数量”到底是多少呢?(事实如下)虽然用户只想兑换80个USDT,但是Uniswap平台却“堂而皇之”地将无限授权的approve交易作为他们的默认设置(如下图)。
由此,在用户完成了如上描述的操作兑换了80个USDT之后,Uniswap依旧会保留相当大数量的代币使用权(如下图所示)。对于用户而言,如若他们还想在Uniswap上执行兑换USDT的操作,那么他们只需要执行一个兑换交易即可。在如今交易费昂贵的前提,这无疑帮助用户们省下了一大笔钱。但是,事情真的只有这么简单吗?
0x1. 无限授权·之·骨感的现实
所谓,事出有因,有一利就必然有一弊。在现实中,就有这么几起安全事件为默认无限授权的平台们和无畏的用户们敲起了警钟。
0x11. UniCat 事件
UNICat作为Uniswap平台发布UNI代币后“闪现”的Farming平台,与其他Farming平台的操作相差无几。UniCat通过收集用户们的UNI代币并以承诺相应回报来吸引眼红但无畏的勇者们。
可能由于大多数用户的UNI代币是通过Uniswap平台免费发放得到的,他们并没有对UNI代币的投资太过上心(不得不说,UniCat的开发者确实有着敏锐的时事感知力)。很多用户可能并没有意识到,UniCat是一个完全没有经过任何审核的项目。更可怕的是,UniCat并不像其表面那样可可爱爱,相反,这恰恰是一只EVIL CAT。UniCat通过在其合约内提前安装了一个后门函数,为之后偷走用户们的UNI代币做了充足的准备。
如上图所示,只要用户授权了其代币,那么UniCat就有机会通过其提前设置的后门将其UNI代币偷走。那么,这个后门到底长啥样子呢?如下图所示,在UniCat的主要合约中,存在一个函数叫_setGovernance
。这是一个只能由合约拥有者(即,UniCat)调用的函数。UniCat通过对该函数参数的设置:
_governance
--> Uni Token Address
_setupData
--> transfer
或者 transferFrom
函数及相关参数
理论上,可以在_setGovernance
函数中调用transferFrom
函数转移任何已被授权给他们的代币,从而对用户造成损失。
在这个事件中,不难看出,将自己代币无限授权给未经审计的新兴平台去创造红利时,等待你的如若不是康庄大道,那便是黄泉长路。
0x12. Bancor 事件
相比较于UniCat事件,Bancor平台在上线没几天后,内部人员就发现了一个致命的bug。简单来说,该bug可以直接导致任何授权于Bancor相关合约的代币被任何人转移、偷走。
如上图所示,Bancor的transferFrom
函数被意外设置成了Public
。这一简单的失误,"完美"地将用户授权给Bancor合约的代币拱手让人。好在该漏洞被Bancor的开发人员及时发现,并通过白帽攻击将用户的资金转移到了安全的地方,这才逃过一劫。
同样的,在此次攻击事件中,我们不难发现,即使是不作恶的平台也有可能在开发智能合约的过程中出现导致用户的损失的纰漏。但是,值得一提的是,当用户把无限授权当作家常便饭之后,如果攻击真的发生,那么其损失也将被放大到极致。
0x13. 其他事件
除了UniCat和Bancor这两个事件外,至今为止,同样存在其他与代币授权相关的安全事件。这里我们也提出了一些相关的报道以供大家参考研究。
Furucombo
peckshield.medium.com/the-furucombo-incident-analysis-cascading-trust-c90d22c7dda7 (英文)
zhuanlan.zhihu.com/p/361012676 (中文)
DeFi Saver
medium.com/defi-saver/disclosing-a-recently-discovered-vulnerability-d88e3b5cb67 (英文)
www.chainnews.com/articles/790968196239.htm (中文)
Degen Money
twitter.com/nomos_paradox/status/1299215849018937345 (推特)
kalis.me/unlimited-erc20-allowances/ (英文)
Primitive Finance
https://primitivefinance.medium.com/postmortem-on-the-primitive-finance-whitehack-of-february-21st-2021-17446c0f3122 (英文)
https://medium.com/amber-group/exploiting-primitive-finances-approval-flaws-b86db031b4 (英文)
0x2. 无限授权·之·面具下的真相
在本节中,我们将对无限授权这一现象展开详尽的分析。为了揭开无限授权的面具,我们分别从链下与链上两个方面着手进行了分析。在进行展示我们的数据前,我们先来看看,在现实中作为一个前端用户,是如何一步一步完成代币的授权交易。
0x21. 现实世界中的授权操作
如上图所示,完成一个授权操作可以简单地分为6个步骤。在这六个步骤中,一共会有4个主体(用户、钱包、平台、代币合约)参与其中。
Step1,2: 首先,大多数的前端用户(手机端,网页端)需要将他们的虚拟钱包连接上提供服务的网站。
Step3: 而后,网站根据其自身的设置将授权交易的基本信息传达到用户的钱包上以供审核。
Step4,5: 收到平台关于授权交易的信息后,钱包会将相应的信息展示给用户并等待用户确认信息。
Step6: 在用户确认后,钱包会将该授权交易上传到链上等待进一步的审核。一旦该交易上链,代币合约上的相关数据(allowance)便会得到更新。
(在下文关于链上以及链下的分析中,我们首先会介绍我们(链上、链下)分析的动机,而后从不同的角度展示我们的分析结果。)
0x22. 基于链下钱包、平台的分析
0x221. 动机
在真实世界的授权流程中,我们不难发现,前端用户能够最直观接触到的主体为钱包、平台的界面。因此,我们分别选择了15个钱包以及24个DeFi平台,对其交互界面进行测试分析。
(15个钱包)
(24个平台)
为了更好地理解和体现钱包、平台页面的合理性,我们主要审查所有页面的两个方面(Explanation 和 Modification Feature):
对于授权行为的解释(Explanation):
钱包
是否展示授权交易的所有信息
是否通知用户当前的授权为无限授权
平台
(Criteria 1)是否介绍授权行为的意义
(Criteria 2)是否告知授权交易的存在
(Criteria 3)是否提醒用户需要两个交易完成服务
用户对于授权行为的可操作性(Modification Feature)
不管钱包或是平台,用户是否可以通过其交互界面更改(modify)授权代币的数量
由于调查的平台和钱包比较多,我们各挑选了几个有意思的例子为大家解读这些钱包以及平台在以上两个方面的表现。
0x222. 钱包: Metamask & Coinbase
在这一节,我们将对比展示Coinbase钱包和Metamask钱包。从两个钱包在Google Play Store中的下载量和用户反馈来看(如下图),Coinbase和Metamask都拥有超过一百万的安装量,但是在用户反馈上,Metamask要略逊一筹。同时,Coinbase也拥有更高的评分。
在下面对于两个钱包的调查中,我们将统一使用两个钱包在Compound平台进行操作。(Compound平台默认代币授权操作为无限授权。)
钱包1: Metamask
如下图所示,我们不难发现,用户在平台将授权交易传递到钱包上时可以看到完整的交易信息。并且,Metamask允许用户更改他们授权的数目(步骤二、三、四)。
钱包2: Coinbase
相较于Metamask,Coinbase钱包并没有展示任何关于授权交易的信息。用户们只能单纯地依靠平台提供的相关信息来判断并决定操作的可行性(步骤一)。而且,值得注意的是,下图中的步骤二、三、四是用户确认提交交易后才能看到的画面。因此,Coinbase钱包不管是在授权信息展示,还是在授权数量更改的可操作性上,都不如Metamask来得完备。
0x223. 平台: Bancor & Curve Finance
在这一节,我们将对比展示Bancor平台和Curve Finance平台。根据defipulse的最新统计,Curve Finance和Bancor分别为排名第一和第五的交易所平台。
在下面对于两个平台的调查中,我们将统一使用Metamask钱包来测试这两个平台的兑换操作(swap/exchange)。
平台1: Bancor
如下图所示,在我们测试Bancor的兑换操作时,其针对于授权(approval)操作进行了解释并且给用户提供了两种操作选项:无限授权(unlimited approval)以及有限授权(limited approval)。值得一提的是,有限授权在Bancor平台中只要求用户授予平台其所需要操作的代币数量。
平台2: Curve Finance
然而,在Curve Finance平台上,却出现了令人乍舌的一幕。如下图所示,当用户提交兑换申请的时候,Curve Finance界面的提示信息为“请给交易所授权10个USDT”。但是,我们在Metamask钱包界面却收到了Curve Finance平台发来的无限授权的交易请求。这样的神奇操作让我们着实为一些并不熟悉代币授权的小白用户们捏一把汗。
但是故事并没有结束,在我们反复测试Curve Finance的界面之后,我们给Curve Finance发去了关切的问候并指出了问题。在Curve Finance的回应中(如下图),他们承认了我们所指出的问题,并且回复称“用户不喜欢每次都进行授权操作”。但是,这样的说辞似乎也并不能帮其误导用户的做法站住脚跟。
同样地,在我们调查的24个平台中,Yearn Finance也存在着如此误导用户进行无限授权的问题。 如果你想进一步了解Yearn Finance误导用户进行授权操作的细节,我们同样在DEF CON 2021的主题演讲中进行了演示。
0x23. 基于链上平台、代币的分析
0x231. 动机
为了更进一步探索无限授权交易在链上的分布情况,我们收集了所有授权交易的数据(截至2021年4月30日),并展开调查。如下图所示,无限授权交易的数量在DeFi生态蓬勃发展的环境下,快速上升。尤其需要注意的是,这一飞速增长很有可能是由UniswapV2的发布造成的。关于以上的推论,我们将在本节下半段段为你详细解析。
同样,为了了解用户在各个代币以及平台上关于无限授权的情况,我们对其双方展开了详尽的链上数据分析。该分析主要围绕两个方面进行:
无限授权基于代币、平台的分布情况
对于授权代币的风险分析
0x232. 无限授权交易的分布
关于针对无限授权交易的分布状况的分析中,我们定义了三个值来帮助理解下面的两个分布图:
Y轴 (Max Approval Ratio)
无限授权交易对于全部授权交易的占比情况
Y值越大,无限授权交易占比越高
X轴 (Liveness)
代币和平台的活跃程度,该值由授权交易以及平台和代币第一个个以及最后一个授权交易产生的区块差值所决定
X值越大,代币、平台越活跃
点的大小
点越大表示该代币或平台所参与的授权交易越多
平台:如下图所示,我们可以明显感受到UniswapV2在各个方面都完全碾压了其他平台。这也是为什么我们在趋势授权交易趋势图中指出,无限授权的飞速增加很有可能是UniswapV2平台一手造成的。
(平台)
代币:至于代币,如下图所示,有颜色的10个(授权交易数量排名前10)代币在Y值上相差不是特别明显。但是,USDC、USDT、DAI在活跃度以及参与授权交易的数量上有着明显的优势。其实这并不难理解,同为稳定币的它们必然在交易数量和活跃度上占据相当的优势。
(代币)
0x233. 已授权代币的风险分析
在这一节中,我们将对已被授权的代币进行风险分析。我们分别选择了3个稳定币(USDC、USDT、DAI)以及两个平台(Bancor、UniCat)展开我们的调查。同时,我们同样定义了两个值来帮助理解已被授权代币所遭受的风险(如下图所示)。
Risk Amount
针对代币,该值等于所有该代币持有者可以被第三方平台通过transferFrom
函数转移的代币总量
针对平台,该值表示平台在某一代币上,所能通过transferFrom
函数转移的代币总量
Risk Rate
在锁定某一代币的情况下,该值表示Risk Amount所占该代币总量的比例
代币:如下图所示,USDC以及USDT在Risk Rate上的表现在将近一年半的时间里,相对稳定(都是在10%上下徘徊)。而DAI却是经历了一个2020年中段经历了一个较大的起伏才逐渐趋于稳定。
(在以上对于代币的风险分析中,我们只是简单地描绘出了头部代币在Risk Rate的一个趋势图,其中趋势的变化可能由一定的事件决定,但是,不可置否,越低的Risk Rate保证了代币遭受非法转移带来的伤害越低。)
平台:关于平台,我们将分别展示上文提到的两个事件的核心平台(Bancor、UniCat)的Risk Amount趋势图。我们同样也锁定了该平台拥有的头部代币(BNT、UNI)来进行分析。
Bancor的趋势图给我们展示了其BNT代币在短时间内从无到有,再从有到无的画面。这也很合理地解释了Bancor的开发者确实是在短时间内发现其合约漏洞并及时地发动白帽攻击将用户的资产转移到安全的地方。
至于图中右侧关于UniCat的趋势图,经过我们的验证,其中的几段较为明显的下降都为UniCat所执行后门攻击。
虽然我们在做风险分析的过程中,只对历史数据进行了回溯分析。但是,在证实了risky amount以及risk rate两个系数的有效性后,我们相信其将对今后的链上监控有一定的帮助。
0x3. 无限授权·之·异军突起的‘勇士们’
正如我们之前所提到的,无限授权是一个被长期关注的话题。在旷日持久的讨论中,我们不难发现无限授权存在的原因很大一部分与高昂的交易费有关。由于用户在使用各个平台服务时,必须先对其代币授权,再由平台转移使用被授权的代币。如此而言,如果用户每次都只授权所需执行数量的代币,那么用户每次在同一平台上的操作都将执行两个交易。也就是说,每次的操作都将付出两个交易的交易费(相对于执行无限授权的用户们)。
为了解决用户们对于授权行为的开销以及安全的考量,不乏一些亮眼的方案也已应用而生。下面,我们就针对无限授权问题谈谈各个方案的可行性。
0x31. ERC777
作为一个2017就提出的代币标准,ERC777标准中的operator机制(代理商机制)解决了用户执行操作时需要提交两个交易的问题。在operator机制下,用户只需要先添加其信任的平台为其代币的operator/代理商(这里的代理商可以是交易所,也可以是借贷平台),之后用户在所有其认证的平台中的操作都可以在一个交易中完成(Atomic Purchase)。但是,ERC777的弊端也很明显。由于该代币机制中穿插了较多的hooks,导致每个交易的费用相对较高。同时,用户需要选择其信任的代理商,并赋予其执行用户操作的权限。虽然,相较于无限授权,这样的机制在本质上要求了用户对于代理商选择要有安全性的考量。但是这无疑,又将问题抛给了用户(到底是一念天堂,还是一念地狱,this is a question)。
0x32. EIP2612
关于EIP2612,在该提案中,其作者指出可以通过计算签名的方式来提交无需交易费的交易。在此机制的作用下,用户可以免费地更改其授权代币的数量(allowance),以此来解决每次approve所产生的“额外费用”。至今为止,该方案已经被UniswapV3采纳并应用。相信这应该是现今针对无限授权问题较为合理的解决方法。但是,在这个ERC20‘横行’的时代,又有多少平台愿意为此大费周章呢?
0x4. 无限授权·之·总个结
无限授权固然可以降低用户在交易费用上的支出,但是通过我们的调查,一些平台以及钱包不仅没有通过交互界面帮助用户理解无限授权所存在的潜在风险,更有甚者,在用户使用其功能的同时误导用户的决策。所以,到底是在贯彻爱与真实,还是穿梭在虚拟世界里最迷人的反派角色?默许代币无限授权的DeFi平台们,是应该从现在开始正视无限授权的安全问题并为之付出,还是应该在这路上继续一往无前?我们将拭目以待。
0x5. 引用
CoinGecko:https://www.coingecko.com/en/coins/
Uniswap:https://uniswap.org/
UniCat的主要合约的:0xb246bcd5baac8e342941d0f803d528b6668e42cd
Bancor平台:https://bancor.network/
Curve Finance平台:https://curve.fi
defipulse:https://www.defipulse.com/
Yearn Finance:https://yearn.finance/
ERC777标准:eips.ethereum.org/EIPS/eip-777
EIP2612提案:eips.ethereum.org/EIPS/eip-2612
微信扫描关注公众号,及时掌握新动向
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场