“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

BlockSec 作為長期關注 DeFi 安全的研究團隊 ,獨立發現了多起 DeFi 安全事件,研究成果發布在頂級安全會議中(包括 USENIX Security, CCS 和 Blackhat)。

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,60044,000種符合ERC20標準的代幣。

關於ERC-20代幣的授權操作,其中主要涉及到三個主體(用戶/User,代幣合約/Token Contract,平台/Spender)以及ERC20標準中的兩個變量(balanceOfallowance)和兩個函數(approvetransferFrom函數)。簡單來說,關於授權行為,如果用戶想要在相關平台上使用他/她們的代幣,用戶必須先完成一個授權交易(涉及到allowance變量和approve函數),然後再執行他/她們的動作交易(涉及到balanceOfallowance變量以及transferFrom函數)。也就是說,廣泛意義上講,用戶需要通過兩個交易來使用他/她們的代幣(類似 存幣,兌換,等等行為)。

0x02. 代幣授權分類

理論上,基於所授權代幣的數量,我們可以將代幣授權分為三類:零授權無限授權以及其他授權 。

  • 零授權
    • 授權代幣數量為零
    • 零授權同樣也可以理解為授權駁回(revoke),相當於取消平台對你相關代幣的轉賬權限
  • 無限授權
    • 授權代幣數量為數據類型uint256的最大值(0xffff..ffff)或相關代幣的總供應量
    • 無限授權作為提高用戶體驗的方案被廣泛應用於許多平台(例如,交易所、借貸平台等)
  • 其他授權
    • 該類型代幣授權,往往是用戶通過平台以及錢包提供的更改功能,自行設定授權操作中他們所想要提供的代幣數量

0x03. 舉個栗子

為了更好地理解代幣授權的流程以及授權的目的,在此我們會以用戶在Uniswap上置換USDT為例進行解釋說明。

如果一個用戶想通過去中心化交易所Uniswap將80個USDT兌換成其他代幣,那麼用戶和平台的在代幣合約上的狀態會如何變化呢?

首先,關於具體的操作,用戶需要調用USDT合約中的approve函數將一定數量的USDT授權於Uniswap。隨後,Uniswap在執行用戶兌換代幣的請求時,通過調用USDT合約中的transferFrom函數使用用戶的代幣。然而,這裡的“一定數量”到底是多少呢?(事實如下)雖然用戶只想兌換80個USDT,但是Uniswap平台卻“堂而皇之”地將無限授權的approve交易作為他們的默認設置(如下圖)。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

由此,在用戶完成了如上描述的操作兌換了80個USDT之後,Uniswap依舊會保留相當大數量的代幣使用權(如下圖所示)。對於用戶而言,如若他們還想在Uniswap上執行兌換USDT的操作,那麼他們只需要執行一個兌換交易即可。在如今交易費昂貴的前提,這無疑幫助用戶們省下了一大筆錢。但是,事情真的只有這麼簡單嗎?

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

0x1. 無限授權·之·骨感的現實

所謂,事出有因,有一利就必然有一弊。在現實中,就有這麼幾起安全事件為默認無限授權的平台們無畏的用戶們敲起了警鐘。

0x11. UniCat 事件

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

UniCat作為Uniswap平台發布UNI代幣后“閃現”的Farming平台,與其他Farming平台的操作相差無幾。UniCat通過收集用戶們的UNI代幣並以承諾相應回報來吸引眼紅但無畏的勇者們。

可能由於大多數用戶的UNI代幣是通過Uniswap平台免費發放得到的,他們並沒有對UNI代幣的投資太過上心(不得不說,UniCat的開發者確實有着敏銳的時事感知力)。很多用戶可能並沒有意識到,UniCat是一個完全沒有經過任何審核的項目。更可怕的是,UniCat並不像其表面那樣可可愛愛,相反,這恰恰是一隻EVIL CAT。UniCat通過在其合約內提前安裝了一個後門函數,為之後偷走用戶們的UNI代幣做了充足的準備。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

如上圖所示,只要用戶授權了其代幣,那麼UniCat就有機會通過其提前設置的後門將其UNI代幣偷走。那麼,這個後門到底長啥樣子呢?如下圖所示,在UniCat的主要合約中,存在一個函數叫_setGovernance。這是一個只能由合約擁有者(即,UniCat)調用的函數。UniCat通過對該函數參數的設置:

  • _governance –> Uni Token Address
  • _setupData –> transfer 或者 transferFrom 函數及相關參數

理論上,可以在_setGovernance函數中調用transferFrom函數轉移任何已被授權給他們的代幣,從而對用戶造成損失。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

在這個事件中,不難看出,將自己代幣無限授權給未經審計的新興平台去創造紅利時,等待你的如若不是康庄大道,那便是黃泉長路。

0x12. Bancor 事件

相比較於UniCat事件,Bancor平台在上線沒幾天後,內部人員就發現了一個致命的bug。簡單來說,該bug可以直接導致任何授權於Bancor相關合約的代幣被任何人轉移、偷走

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

如上圖所示,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. 現實世界中的授權操作

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

如上圖所示,完成一個授權操作可以簡單地分為6個步驟。在這六個步驟中,一共會有4個主體(用戶、錢包、平台、代幣合約)參與其中。

Step1,2: 首先,大多數的前端用戶(手機端,網頁端)需要將他們的虛擬錢包連接上提供服務的網站。

Step3: 而後,網站根據其自身的設置將授權交易的基本信息傳達到用戶的錢包上以供審核。

Step4,5: 收到平台關於授權交易的信息后,錢包會將相應的信息展示給用戶並等待用戶確認信息。

Step6: 在用戶確認后,錢包會將該授權交易上傳到鏈上等待進一步的審核。一旦該交易上鏈,代幣合約上的相關數據(allowance)便會得到更新。

(在下文關於鏈上以及鏈下的分析中,我們首先會介紹我們(鏈上、鏈下)分析的動機,而後從不同的角度展示我們的分析結果。)

0x22. 基於鏈下錢包、平台的分析

0x221. 動機

在真實世界的授權流程中,我們不難發現,前端用戶能夠最直觀接觸到的主體為錢包、平台的界面。因此,我們分別選擇了15個錢包以及24個DeFi平台,對其交互界面進行測試分析。

(15個錢包)

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

(24個平台)

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

為了更好地理解和體現錢包、平台頁面的合理性,我們主要審查所有頁面的兩個方面(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也擁有更高的評分。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

在下面對於兩個錢包的調查中,我們將統一使用兩個錢包在Compound平台進行操作。(Compound平台默認代幣授權操作為無限授權。)

錢包1: Metamask

如下圖所示,我們不難發現,用戶在平台將授權交易傳遞到錢包上時可以看到完整的交易信息。並且,Metamask允許用戶更改他們授權的數目(步驟二、三、四)。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

錢包2: Coinbase

相較於Metamask,Coinbase錢包並沒有展示任何關於授權交易的信息。用戶們只能單純地依靠平台提供的相關信息來判斷並決定操作的可行性(步驟一)。而且,值得注意的是,下圖中的步驟二、三、四是用戶確認提交交易后才能看到的畫面。因此,Coinbase錢包不管是在授權信息展示,還是在授權數量更改的可操作性上,都不如Metamask來得完備。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

0x223. 平台: Bancor & Curve Finance

在這一節,我們將對比展示Bancor平台和Curve Finance平台。根據defipulse的最新統計,Curve Finance和Bancor分別為排名第一和第五的交易所平台。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

在下面對於兩個平台的調查中,我們將統一使用Metamask錢包來測試這兩個平台的兌換操作(swap/exchange)。

平台1: Bancor

如下圖所示,在我們測試Bancor的兌換操作時,其針對於授權(approval)操作進行了解釋並且給用戶提供了兩種操作選項:無限授權(unlimited approval)以及有限授權(limited approval)。值得一提的是,有限授權在Bancor平台中只要求用戶授予平台其所需要操作的代幣數量。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

平台2: Curve Finance

然而,在Curve Finance平台上,卻出現了令人乍舌的一幕。如下圖所示,當用戶提交兌換申請的時候,Curve Finance界面的提示信息為“請給交易所授權10個USDT”。但是,我們在Metamask錢包界面卻收到了Curve Finance平台發來的無限授權的交易請求。這樣的神奇操作讓我們着實為一些並不熟悉代幣授權的小白用戶們捏一把汗。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

但是故事並沒有結束,在我們反覆測試Curve Finance的界面之後,我們給Curve Finance發去了關切的問候並指出了問題。在Curve Finance的回應中(如下圖),他們承認了我們所指出的問題,並且回復稱“用戶不喜歡每次都進行授權操作”。但是,這樣的說辭似乎也並不能幫其誤導用戶的做法站住腳跟。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

同樣地,在我們調查的24個平台中,Yearn Finance也存在着如此誤導用戶進行無限授權的問題。 如果你想進一步了解Yearn Finance誤導用戶進行授權操作的細節,我們同樣在DEF CON 2021的主題演講中進行了演示。

0x23. 基於鏈上平台、代幣的分析

0x231. 動機

為了更進一步探索無限授權交易在鏈上的分佈情況,我們收集了所有授權交易的數據(截至2021年4月30日),並展開調查。如下圖所示,無限授權交易的數量在DeFi生態蓬勃發展的環境下,快速上升。尤其需要注意的是,這一飛速增長很有可能是由UniswapV2的發布造成的。關於以上的推論,我們將在本節下半段段為你詳細解析。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

同樣,為了了解用戶在各個代幣以及平台上關於無限授權的情況,我們對其雙方展開了詳盡的鏈上數據分析。該分析主要圍繞兩個方面進行:

  • 無限授權基於代幣、平台的分佈情況
  • 對於授權代幣的風險分析

0x232. 無限授權交易的分佈

關於針對無限授權交易的分佈狀況的分析中,我們定義了三個值來幫助理解下面的兩個分布圖:

  • Y軸 (Max Approval Ratio)
    • 無限授權交易對於全部授權交易的佔比情況
    • Y值越大,無限授權交易佔比越高
  • X軸 (Liveness)
    • 代幣和平台的活躍程度,該值由授權交易以及平台和代幣第一個個以及最後一個授權交易產生的區塊差值所決定
    • X值越大,代幣、平台越活躍
  • 點的大小
    • 點越大表示該代幣或平台所參與的授權交易越多

平台:如下圖所示,我們可以明顯感受到UniswapV2在各個方面都完全碾壓了其他平台。這也是為什麼我們在趨勢授權交易趨勢圖中指出,無限授權的飛速增加很有可能是UniswapV2平台一手造成的。

(平台)

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

代幣:至於代幣,如下圖所示,有顏色的10個(授權交易數量排名前10)代幣在Y值上相差不是特別明顯。但是,USDC、USDT、DAI在活躍度以及參與授權交易的數量上有着明顯的優勢。其實這並不難理解,同為穩定幣的它們必然在交易數量和活躍度上佔據相當的優勢。

(代幣)

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

0x233. 已授權代幣的風險分析

在這一節中,我們將對已被授權的代幣進行風險分析。我們分別選擇了3個穩定幣(USDC、USDT、DAI)以及兩個平台(Bancor、UniCat)展開我們的調查。同時,我們同樣定義了兩個值來幫助理解已被授權代幣所遭受的風險(如下圖所示)。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?
  • Risk Amount
    • 針對代幣,該值等於所有該代幣持有者可以被第三方平台通過transferFrom函數轉移的代幣總量
    • 針對平台,該值表示平台在某一代幣上,所能通過transferFrom函數轉移的代幣總量
  • Risk Rate
    • 在鎖定某一代幣的情況下,該值表示Risk Amount所佔該代幣總量的比例

代幣:如下圖所示,USDC以及USDT在Risk Rate上的表現在將近一年半的時間裡,相對穩定(都是在10%上下徘徊)。而DAI卻是經歷了一個2020年中段經歷了一個較大的起伏才逐漸趨於穩定。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

(在以上對於代幣的風險分析中,我們只是簡單地描繪出了頭部代幣在Risk Rate的一個趨勢圖,其中趨勢的變化可能由一定的事件決定,但是,不可置否,越低的Risk Rate保證了代幣遭受非法轉移帶來的傷害越低。)

平台:關於平台,我們將分別展示上文提到的兩個事件的核心平台(Bancor、UniCat)的Risk Amount趨勢圖。我們同樣也鎖定了該平台擁有的頭部代幣(BNT、UNI)來進行分析。

“是便利還是陰謀”:以太坊ERC20代幣的無限授權該何去何從?

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

本文鏈接:https://www.8btc.com/article/6675123

轉載請註明文章出處

(0)
上一篇 2021-08-17 14:57
下一篇 2021-08-17 15:07

相关推荐