撿錢撿成千萬富翁: UniswapV2 Router02 實現缺陷

我們團隊在整理和復盤 三樹犬事件 時,發現通縮代幣(Deflation Token)或FoT 代幣(Fee-on-Transfer Tokens)是造成這次攻擊的罪魁禍首之一。

我們對通縮代幣可能造成的安全漏洞進行了進一步分析,發現UniswapV2 在對Router01 的升級修復版 路由器02 的實現中引入了漏洞,使得其中的代幣可以被任意用戶取出。我們初步統計發現,有幾個地址持續從中獲利,僅其中一個 地址 就從中獲利1000+ETH,價值超過1600 萬人民幣。

而且,該問題不僅局限於Uniswap,在所有採用類似UniswapV2 Router02 的代碼的平台都存在這個問題,其中包括以太坊上的SushiSwap,BSC 鏈上的PancakeSwap 等。為幫助相關項目方了解該問題,在聯繫了相關項目方後,我們對該缺陷進行公開。

問題揭露與利用方法

Uniswap 是DeFi 領域舉足輕重的去中心化交易所,對於每一對代幣,Uniswap 設置了對應的Pair (流動性池,下稱Pair 或池子)實現了自動做市機制。然而直接調用UniswapV2 的Pair 進行交互(如圖中的Choice 1)對普通用戶而言是有一定的難度的。因此UniswapV2 為用戶進行了一層封裝,即用戶可以通過UniswapV2 的Router 實現代幣的交換(Swap)及流動性的增減(Add/Remove Liquidity)操作,而不必操心Router 與Pair 具體如何實現交互(如圖中的Choice 2)。


(要點1) Router 在代替用戶與Pair 進行代幣交換(Swap)和增減流動性(Add/Remove Liquidity)的時候,要么會直接將錢在用戶和Pair 之間transfer,而不經過Router;或者Router 會用變量amount 記錄用戶和Pair 轉進來的代幣數量,再分別地轉給對應的Pair 或者用戶。也就是說,正常情況下,Router 在一筆交易執行之後,是不會留存有任何Token 的。 (要點2)問題出在Router02 新增的減少流動性的函數實現。 Router02 在實現函數removeLiquidityETHSupportingFeeOnTransferTokens() 的時候,並沒有記錄應當返還給用戶多少代幣,而是調用該種代幣的balanceOf(address(this))balanceOf(地址(這個))removeLiquidityETHWithPermit 操作的時候,就會由於轉手了Fei 代幣,而被發放獎勵。

獲利實現分析

下面我們以交易0x46a8a8eb2fcf75e0a4874d0049d833eaa6432d4b28cb558dc631806be431618b 為例,具體介紹獲利是怎麼實現的。

該用戶監測到該獲利機會,在隨後的幾個塊實現了該交易(部分執行截圖如下)。

從圖中的第2、3 個紅框可以看到,用戶調用該特殊的移除流動性的函數後,Pair 轉給Router02 的錢僅約為2.6e16 wei (不到1 美元),而Router02 轉給用戶的錢卻約有6.9e23 wei,即純獲利Fei 約69 萬個。而產生差距如此巨大的原因就在於Router02 中本來就有將近這麼多錢(見第1 個紅框)。 (圖中可以看到Fei 在transfer 的時候調用了對應的Incentive 函數,感興趣的朋友可以自行查看交易。圖源https://tx.blocksecteam.com/)

用戶在獲得這些大量的Fei Token 之後在同一個交易內直接通過Uniswap 將其轉成WETH (超過297 個)後轉給獲利地址0x4d1d758f0966c6e6de873958e62788300c13f60e。

後續

Fei 項目已經在2021 年7 月4 號移除了該交易對的Incentive 合約,即Fei 項目不會再向Router02 發放獎勵,交易0xfa6e50b964f57a7fd9451af694d18b851a30e58649d878d21b10c20f810723d1。

漏洞分析及建議

漏洞來源

Router02 是UniswapV2 中引入的第二版Router,為了解決Router01 無法處理FoT 代幣(Fee-on-Transfer Tokens)的問題(如圖,來源 Uniswap 官方文檔)。

FoT 代幣會在transfer 過程中收取手續費,導致調用transfer()、transferFrom() 時,接收方實際獲得代幣數量小於發送方發出的代幣數量,致使Router01 無法根據Pair 傳給Router 的數量原封不動地轉給用戶。所以Router02 實現了removeLiquidityETHSupportingFeeOnTransferTokens() 用於解決該問題,將該轉給用戶的,都轉給用戶。

但是該實現沒有對該函數的假設(即處理的FoT 代幣)進行檢驗,而是粗暴地使用了balanceOf(address(this)),導致用戶(包括項目方)受害,大量財產暴露甚至散落在公眾場合,吸引了惡意用戶來不當獲利。

受害者分析

我們根據Router02 出現代幣的主要幾種情況進行分析,可以看到受害者如下:

  1. Token 的機制設置導致Router02 中存在部分Token:直接受害者是Uniswap 的用戶,用戶在Uniswap 交換的時候本來應該得到的Token 部分被Router02 截獲,導致用戶損失。而這進一步導致Token 項目方設計的機制無法將利益分發給其用戶,使得其相關機制失效,導致項目可用性受損,因此間接受害者是項目方。
  2. 用戶誤轉導致Router02 中出現Token:受害者是相關用戶,不可否認用戶有其一定的責任,但是Uniswap 由於缺乏必要的校驗,導致其將不屬於Uniswap 的幣轉給第三方。

建議

defi 項目之間的可組合性導致了defi 領域的繁榮,也帶來大量安全風險。因此項目方在項目開發的過程中需要特別注意與其他項目之間的交互,是否會由於適配性等問題導致安全風險,比如與通縮代幣的交互等。

影響分析

由於Uniswap 的流動性大,且其分叉項目廣泛,該漏洞的影響的項目除了UniswapV2 之外,還包括SushiSwap,BSC 鏈上的PancakeSwap 等。

非法獲利交易數量

平台交易數量鏈UniswapV21823ethereumSushiSwap35ethereumPancakeSwap2344BSC

根據我們初步統計,僅在以太坊上惡意地址,總共獲利就超出1000ETH。下面附上部分地址及相關不當獲利情況統計(以ETH 計價,粗略統計,當前ETH 價格約為2600 美元(2021)。

獲利地址獲利(以ETH 計價)主要涉及平台0x4d1d758f0966c6e6de873958e62788300c13f60e1018Uniswap0x34927d8bebe7e83e479d8999c988b4f5c13bb7a915.9Uniswap0x991e498d4285ea71641a18ff3f1a417a8964afe013.2Uniswap0x09507D71685A9Abfa753949eF9bC318f40dc686f5.9SushiSwap0xf8b567789e0d5896e0a7f53d030720f42aae79f315.1Uniswap、SushiSwap

附錄及引用

上文提到的UniswapV2 中採用balanceOf(address(this))實現的移除流動性的函數,除了removeLiquidityETHSupportingFeeOnTransferTokens(),還有另一種函數內部調用了前面所說函數的實現——removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(),即在特定情況下,這兩個函數的調用都可以實現不當得利。詳見UniswapV2Router02 合約代碼。

各平台合約地址及不當獲利交易舉例

平台合約地址交易舉例UniswapV2Router020x7a250d5630B4cF539739dF2C5dAcb4c659F2488D0x46a8a8eb2fcf75e0a4874d0049d833eaa6432d4b28cb558dc631806be431618bSushiSwap Router0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f0xc532ffae82d662d6bf5a2b73dc441289a357c46d0f5bb775401190b5b6d3d323PancakeSwap: Router v20x10ED43C718714eb63d5aA57B78B54704E256024E0x36765df5911549b0b3302966eeabecb0b09ed7e3a928a3582558c3158abe7441

Fei 代幣地址:0x956F47F50A910163D8BF957Cf5846D573E7f87CA

Fei Incentive 合約:0xfe5b6c2a87A976dCe20130c423C679f4d6044cD7

UniswapV2 的FEI/WETH 交易池地址:0x94B0A3d511b6EcDb17eBF877278Ab030acb0A878

本文所用價格及TVL 數據來源為coingecko 及etherscan。

通縮代幣的介紹及可能給項目方帶來的安全風險詳見我們之前的攻擊報告——三樹犬事故報告

Total
0
Shares
Related Posts