編者注:原標題為《詳解Uniswap的ERC777重入風險》
前言
據媒體消息,4月18日,Tokenlon宣布暫停imBTC轉賬,因其發現有攻擊者通過ERC777在Uniswap流動性合約中的重入漏洞,對ETH-imBTC池循環套利。此次的攻擊手法是一個存在于Uniswapv1上的已知漏洞,該漏洞最早由Consensys于2019年4月發現,當時Consensys只是發現了該風險,還沒有發現可以利用這種手法進行攻擊的token。隨后,在imBTC上線Uniswap后,由于imBTC是基于ERC777實現的,通過組合ERC777的特性及Uniswap代碼上的問題,使攻擊者可以通過重入漏洞實現套利。下面,我們將來分析此次套利中的攻擊手法和具體的細節。
知識準備
ERC777協議是以太坊上的代幣標準協議,該協議是以太坊上ERC20協議的改進版,主要的改進點如下:
1、使用和發送以太相同的理念發送token,方法為:send(dest,value,data)
2、合約和普通地址都可以通過注冊tokensToSendhook函數來控制和拒絕發送哪些token
Boba基金會承諾為該網絡的Uniswap V3提供100萬美元的BOBA代幣激勵:金色財經報道,Boba基金會已承諾提供價值100萬美元的BOBA代幣,以促進Uniswap V3在Boba網絡上的采用。此前,將Uniswap V3將部署至Boba Network的鏈上投票以近95%的贊成率通過,目前該提案已完成執行。[2023/2/7 11:52:14]
3、合約和普通地址都可以通過注冊tokensReceivedhook函數來控制和拒絕接受哪些token
4、tokensReceived可以通過hook函數可以做到在一個交易里完成發送代幣和通知合約接受代幣,而不像ERC20必須通過兩次調用來完成
5、持有者可以"授權"和"撤銷"操作員?這些操作員通常是交易所、支票處理機或自動支付系統
6、每個代幣交易都包含data和operatorData字段,可以分別傳遞來自持有者和操作員的數據
7、可以通過部署實現tokensReceived的代理合約來兼容沒有實現tokensReceived函數的地址
Index Coop推出基于Uniswap V3的流動性挖礦計劃:加密貨幣指數協議Index Coop宣布推出基于Uniswap V3的DPI/ETH流動性挖礦計劃,活動持續至9月4日,獎勵為2000個INDEX代幣。用戶需要選擇0.3%這個級別手續費的資金池,但是未限定價格區間,用戶在Uniswap V3提供流動性后,需要在Index Coop協議中質押該提供流動性的NFT憑證才可參與該活動。[2021/8/21 22:28:13]
在這里,我們需要特別關注的點是第二點,即ERC777標準中的tokenToSend函數,根據ERC777協議的定義,遵循該標準的token代幣在每一次發生代幣轉賬的時候都會去嘗試調用代幣發送者tokensToSend函數,而代幣持有者可以通過在ERC1820注冊合約注冊自己的合約并通過在這個hook函數中定義一些操作來處理代幣轉賬的過程中的某些流程,如拒絕代幣發送或其他操作。
了解這些關鍵點,有助于我們理解這次攻擊的具體攻擊手法。現在開始,我們可以稍微加速,看看對于Uniswap而言,這次到底發生了什么?
細節分析
UniLend將于7月6日轉向無需許可:DeFi交易及借貸協議UniLend宣布將于7月6日轉向無需許可,允許無許可上線任何ERC20代幣用作貸款和閃電貸。
UniLend表示,該協議此前已上線17種代幣,并鎖定數百萬美元資產,因此將轉向無需許可,團隊和社區可以通過幾個簡單的步驟在UniLend上線代幣。UniLend是一種無許可的DeFi交易與借貸協議,旨在將交易服務、貨幣市場與通過智能合約提供的借貸服務結合在一起,此前已于3月底正式上線以太坊主網,6月初在Polygon上線。[2021/7/4 0:25:29]
通過Etherscan查詢攻擊者的其中一筆交易?0x32c83905db61047834f29385ff8ce8cb6f3d24f97e24e6101d8301619efee96e
可以發現,攻擊者兩度向Uniswap合約轉帳imBTC,金額同樣是0.00823084,然后從Uniswap收取了兩筆ETH,看上去似乎是十分正常的兩筆交易,實際上卻是暗流涌動,另有玄機。為了更好的了解整一筆交易的細節,我們需要通過bloxy.info來查看交易的具體細節。
UNI突破40美元關口 日內漲幅為1.99%:火幣全球站數據顯示,UNI短線上漲,突破40美元關口,現報40.03美元,日內漲幅達到1.99%,行情波動較大,請做好風險控制。[2021/5/10 21:42:33]
通過查詢交易的細節,我們發現,攻擊者首先是通過ethToTokenSwapInput函數向Uniswap兌換了一些imBTC,然后再通過tokenToEthSwapInput函數開始第一次用imBTC換取ETH,然后Uniswap先將ETH轉給了攻擊者,再調用imBTC的transferFrom函數,由于imBTC實現了ERC777標準,所以在調用imBTC的trasferFrom函數的時候,imBTC會對攻擊者的tokensToSend函數進行調用。隨后,在攻擊者的tokensToSend函數中,攻擊者會進行第二次用imBTC換取ETH,然后流程結束。
從交易細節上看,這里似乎還是沒有什么問題,我們繼續跟蹤UniSwap的代碼。
Uniswap頻現欺詐性代幣項目 源于其開放性上幣政策:由于開放性的上幣政策,去中心化交易平臺Uniswap上的欺詐性代幣問題愈發嚴重。只需要在github上提出請求,該平臺的下拉菜單中便可能出現申請幣種名稱。去中心化衍生品項目Opium于7月7日在Twitter上發出警告,警告用戶盡管該項目沒有自主令牌,但Uniswap上已列出了名為Opium的騙局令牌,其交易代碼為OPM。出現類似問題的項目還有DeFi protocol dYdX、 Tornado.Cash、 Curve Finance、1inch.Exchange、Balancer Labs。自5月份Uniswap發布“V2”變更后,它在DeFi系統中的重要性不斷增加。Dune Analytics發布的數據表明,Uniswap構成了DeFi的最大用戶群(總用戶數為92000)。(cointelegraph)[2020/7/8]
上面是代碼是Uniswap的ethToTokenSwapInput函數的代碼,根據代碼分析,Uniswap的ethToTokenSwapInput函數會調用ethToTokenInput函數,然后會先通過getInputPrice獲取代幣能換取的eth數量,之后通過send函數將eth發給用戶,最后再通過transferFrom把代幣轉進合約。我們繼續跟進getInputPrice函數。
通過分析getInputPrice函數,我們能知道,ETH獲取量計算的公式為
把該公式放到ethToTokenInput函數的上下文中,該公式就變成了
在該公式下,一次正常的imBTC兌換ETH的過程中,作為分母的imBTC儲備量在兌換過后應該要上升,對應的ETH儲備量會變小。
但是回顧攻擊者的操作方式,在攻擊者第一次發送imBTC兌換ETH的過程中,Uniswap會先發送ETH給攻擊者,這時候Uniswap中ETH儲備量減少,然后Uniswap調用transferFrom函數,(注意此時還未將攻擊者的imBTC扣除),緊接著在transferFrom函數中攻擊者調用的第二次的ethToTokenSwapInput時,通過getInputPrice獲取兌換的ETH數量的公式會變成這樣:
注意看,在第二次的兌換計算中,只有ETH的儲備量變少了,而imBTC的儲備量并未增加,這導致相比與單獨的調用ethToTokenSwapInput函數,攻擊者可以通過重入的方式,在第二次使用imBTC兌換ETH的過程中,使計算公式的分子發生了變化,而公式的分母不會發生變化。相比正常的兌換,攻擊者通過重入方式進行的第二次兌換會獲取微小的利潤,導致有利可圖。重復這樣的過程,就能通過等量的imBTC獲取更多的ETH,導致Uniswap做事商的損失。
防御方法
在Uniswap的tokenToEthSwapInput函數中加入OpenZeppelin的ReentrancyGuard函數,防止重入問題。
在進行代幣交換的時候,先扣除用戶的代幣,再將ETH發送給用戶。
同時,針對本次攻擊事件慢霧安全團隊建議:
在關鍵的業務操作方法中加入鎖機制,如:OpenZeppelin的ReentrancyGuard
開發合約的時候采用先更改本合約的變量,再進行外部調用的編寫風格
項目上線前請優秀的第三方安全團隊進行全面的安全審計,盡可能的發現潛在的安全問題
多個合約進行對接的時候也需要對多方合約進行代碼安全和業務安全的把關,全面考慮各種業務場景相結合下的安全問題
合約盡可能的設置暫停開關,在出現“黑天鵝”事件的時候能夠及時發現并止損
安全是動態的,各個項目方也需要及時捕獲可能與自身項目相關的威脅情報,及時排查潛在的安全風險
最后的思考
這兩天的DeFi世界被鬧得沸沸揚揚,imBTC作為ERC777代幣首當其沖,ERC777協議也飽受詬病,但是看完分析,造成此次的攻擊事件原因,真的是imBTC或者是ERC777協議的問題嗎?
如果Uniswap做好了ERC777的兼容,使用ReentrancyGuard,并在代幣交換的時候先扣除用戶的代幣,再將ETH發送給用戶,這樣的問題是不是就不會發生?
imBTC作為以太坊上token化的比特幣代幣協議,其安全性在自身單獨運行的時候并不存在問題,第三方DeFi平臺在接入的時候,應需要充分考慮平臺本身的業務邏輯與接入代幣之間的兼容性,才能避免因兼容性發生不必要的安全問題。而不是簡單的將問題歸咎于協議和代幣提供方。
Tags:SWAPUNIETHUniswapBabySwapuni幣最新消息及前景etha幣價格uniswapwallet教程
作者|哈希派分析團隊 BTC突破18800美元關口 日內漲幅為0.77%:火幣全球站數據顯示,BTC短線上漲,突破18800美元關口,現報18800.24美元,日內漲幅達到0.77%.
1900/1/1 0:00:00本文原發“人民數字Fintech”作者:蔡維德,現任國家特聘專家,北京航空航天大學博導、北航數字社會與區塊鏈實驗室主任 前言 關于區塊鏈運用的探討如今已頻繁出現在大眾視野中.
1900/1/1 0:00:00本文來源:金融1號院 作者:蘇蘇 央行數字貨幣DCEP的持續火熱帶動數字貨幣概念股大漲。截至4月20日收盤,滬指漲0.50%,報2852.55點;深證成指漲0.89%,報10621.50點;創業.
1900/1/1 0:00:00文|互鏈脈搏·元尚 4月21日,群興玩具公告稱,自查中發現存在實際控制人及其關聯方占用上市公司資金的情形,截至本公告披露日資金占用余額合計為2.887億元.
1900/1/1 0:00:00本周全球金融資產較為穩定,原油表現較差,黃金及美股都有較為亮眼的市場表現,BTC和ETH重新站穩7000點位.
1900/1/1 0:00:00電氣和電子工程師協會根據美國聯邦政府的安全要求對以太坊、Fabric、Corda和Multichain四個區塊鏈平臺進行了評估,結果顯示只有Corda通過了測試.
1900/1/1 0:00:00