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

買賣虛擬貨幣

BlockSec 作為長期關注 DeFi 安全的研究團隊 (https://blocksecteam.com),獨立發現了多起 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,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

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读