時間:2023-08-08|瀏覽:265
ERC20授權的必要性
有了以太坊上的原生代幣ETH,你就可以將ETH發送至該智能合約,同時調用智能合約功能。這是通過所謂的可支付函數(payablefuntion)實現的。但是,由于ERC20代幣本身就是智能合約,你無法通過直接將代幣發送到智能合約來調用其函數。
因此,ERC20標準讓智能合約使用transferFrom函數代表用戶轉移代幣。為此,用戶需要允許智能合約代表他們轉移代幣。
這樣一來,用戶就可以將代幣“存入”智能合約,同時智能合約會更新其狀態來顯示這筆存款。相反,如果你將ERC20代幣發送至該智能合約,則合約不會更新其狀態(例如,將這筆存款記入你的賬戶)。
例如,如果你將DAI“存入”Aave來賺取利息,你首先要允許Aave合約從你的錢包中取出一些DAI。然后你調用Aave合約里的函數,指定你想要存入的DAI的數量。然后,Aave合約使用transferFrom函數從你的錢包中取出相應數量的DAI,并將同等數量的aDAI代幣記入你的賬戶。
無限ERC20授權的危害
將特定數量的ERC20代幣(如100DAI)存入合約時,你就可以選擇將授權額設成這個數量。然而,許多應用會向用戶要求無限授權。
這會帶來極好的用戶體驗,因為用戶不需要在每次存款時重新授權。設置無限授權后,用戶只需要同意一次,之后存款時就不會再重復這一過程。
但是,該設置存在很大的弊端。眾所周知,即使是成熟的項目,也有可能存在漏洞。一旦你給了這些平臺無限授權,不只是你的存款會陷入風險之中,你的錢包中的代幣也是如此。
在Devcon5上,我第一次與PaulBerg談到了這個問題。在這次大會上,Paul就本文所討論的問題做了陳述。在開發Sablier時,Paul在他的智能合約中發現了一個漏洞(已經修復了!),不僅所有存入該智能合約的DAI(100美元)有風險,所有測試者的錢包中的DAI(1萬美元)也是如此!
實際風險
長期以來,無限授權的風險主要是理論上的。在Paul所開發的Sablier平臺正式上線之前,這個漏洞就被修復了。當時,還沒有出現利用ERC20授權的攻擊,但是只要平臺繼續要求無限授權,遲早會出狀況。
去年,我們已經看到了幾起利用ERC20授權的攻擊事件。
意外漏洞
今年早些時候,Bancor出現了一個漏洞,危及用戶資金。執行ERC20transferFrom函數的函數變成了public屬性(不再是private合約私有屬性),因此任何人都可以執行該函數,并取走用戶錢包中的資金。Bancor執行了一次白帽黑客攻擊,控制了損失,并將資金還給了用戶。
惡意利用漏洞
除了Bancor的意外漏洞之外,還有很多惡意利用漏洞的情況。在今年夏天的DeFi熱潮中,人們都在為各種以食物命名的DeFi