洞徹“一鍵式指導”DeFi流動性專案騙局
- 洞徹“一鍵式指導”DeFi流動性專案騙局
- 摘要
- 事件起因
- 首先,什么是后門?
- 什么是payable
- 隱患1:用戶存在誤操作可能轉入ETH至合約內
- 隱患2:Uniswap資金池被惡意兌換
- 總結
洞徹“一鍵式指導”DeFi流動性專案騙局
預計閱讀時間:10min
摘要
近來市場上存在一些因“一鍵式指導”部署而受騙的專案,文中對其中出現的安全漏洞進行復現,旨在避免更多因類似漏洞而遭受損失的專案出現,
事件起因
查看整個教程指導書后發現,其給出代碼中存在不少程式開發人員留下的“后門”漏洞,該問題可導致整個專案代幣在對應的Uniswap資金池中產生例外的兌換,下面跟著筆者一探究竟,這種“一鍵式指導”如何一步步誘導相對技術小白的專案運營管理人員以及其用戶落入陷阱,
附上“指導書”鏈接:https://note.youdao.com/ynoteshare1/index.html?id=7c0336d0208b438802e920efa5396d5e&type=note
首先,什么是后門?
后門,本意是指一座建筑背面開設的門,通常比較隱蔽,為進出建筑的人提供方便和隱蔽,在資訊安全領域,后門是指繞過安全控制而獲取對程式或系統訪問權的方法,后門的最主要目的就是方便以后再次秘密進入或者控制系統,
后門在區塊鏈智能合約中最典型的實作方法就是在某些限定權限的函式中較為隱蔽的寫入指定代碼能夠使指定地址具有對應函式操作權限,從而實作一些數字貨幣操作,例如轉賬,鑄幣,銷毀等,
開門見山,指導書上來就顯示了其“及其專業”的部署教學,以及給出了對應的原始碼(這里筆者提醒大家切勿相信或使用任何不可信人員提供的智能合約代碼進行專案運營或個人投資),根據“指導書”順利進行部署發行專案代幣,

在專案部署成功后開始引誘專案方通過Uniswap添加流動性資金池,到這里為止,一切看起來都很正常,在專案管理人員添加完流動性后,我們回到這份原始碼本身來分析這份指導書中充滿的重重陷阱,

如下圖所示,整個原始碼框架其實很簡單,主要包含ERC20、ERC20Detailed和UniswapExchange三個合約(對應下圖示識1-3),其中而前兩個合約功能未完全實作且第三個合約與前兩個并無繼承關系,所以該合約檔案中實際功能全部來自于UniswapExchange合約,

UniswapExchange合約中實作了與普通ERC20代幣介面完全一致的函式功能,但是與普通代幣轉賬功能不同的是,主要功能函式transfer、transferFrom以及approve函式均添加了修飾符payable來修飾函式,
什么是payable
payable 方法是讓 Solidity 和以太坊變得如此酷的一部分,它是一種可以接收以太的特殊函式,即payable修飾符可以使得該函式在交易的時候傳入ETH,這就給后面的第一個陷阱埋下了隱患,

隱患1:用戶存在誤操作可能轉入ETH至合約內
該陷進主要針對該合約發行代幣用戶,其在轉賬程序中容易發生誤操作將除去gas費用外的ETH轉入合約中,該部分ETH在用戶看來是無法恢復的,但是合約中存在一個delegate函式(如下圖所示),通過delegatecall函式可將合約中ETH轉入指定地址,
復現測驗合約地址:https://ropsten.etherscan.io/address/0x4358f98d9d74b2b6538bdf1e3665ad9a35f21521#code

如下圖所示,用戶在進行普通代幣轉賬或者授權的時候可以將ETH轉入合約,尤其是授權操作,在去中心化交易所中均會涉及授權操作,一旦該去中心化交易所前端作惡且用戶粗心確認交易就會落入該陷進,

如下圖所示,該合約中已轉入1 ETH,

現在我們來復現如何將合約中ETH轉入任意指定地址:
首先部署一個攻擊(復現)合約,原始碼如下所示,附鏈接:https://ropsten.etherscan.io/address/0x69edeca1b716be189c4e1749e838bf2333223fc3#code

由于在該合約案例中,合約owner權限無法變更且此處并沒有留“后門”,所以該函式僅可由owner地址呼叫,此案例合約中轉入的ETH受益方為專案部署人員,
回顧圖4中該后門原始碼,其關鍵點在于使用了低級呼叫函式delegatecall,通俗來講,即在本合約中執行外部合約代碼,其它資訊則使用當前合約環境變數(如存盤,余額等等)
,
接下來進行復現呼叫,將BDR合約中的ETH轉入復現合約中指定地址,根據圖示內容改進型如下呼叫:

呼叫前指定接受ETH地址的余額為0

交易成功,附上交易鏈接:https://ropsten.etherscan.io/tx/0xffc5b988cac94f5fb7ea81d62ce42e044ddb0b2944cc52a44ae2a56dbcff5116

查看原合約,其合約ETH余額被清空:

隱患2:Uniswap資金池被惡意兌換
該陷阱主要由后門鑄幣產生,對應本案例,核心問題在如下幾點,
- 第一,通過隱性編碼將后門權限地址寫入代碼;
- 第二,后門權限地址可修改任意地址代幣余額;
- 第三,通過部署即全部授權UniswapV2Router02地址實作惡意兌換,下面逐步分析復現該惡意兌換實作方式,
首先,如下圖所示,從函式命名開始迷惑,一般來說函式命名規則里“_functionName”形式一般為internal/private型別的函式,注意,此處函式修飾符為public,這不符合我們審計程序中對函式訪問權限的要求;雖然該函式有函式呼叫權限,可是通過隱性編碼的方式額外將一個指定地址賦予了呼叫權限,

該隱性編碼實際原理即將普通的用戶地址轉換為Hex(十六進制數值)格式,再在合約代碼中通過address型別強轉為地址,這樣在代碼層面看起來像是不存在任何外部地址的,附上隱性編碼復現合約,其中地址為本案例中實際后門權限所有地址:https://ropsten.etherscan.io/address/0xb5a7d858656c32da3036433f1249be4dd8e8eff0#code

在合約頁面查詢相應的原先地址以及轉換出的地址,結果一致,

其次通過后門權限地址為自己進行“鑄幣”,可以超過原先代幣總量進行鑄幣,這一步操作是在Uniswap資金池中惡意兌換的關鍵,關于本案,其實槽點多多,本身鑄幣邏輯不合理,其次專案方部署者(owner)其實也是可以通過該操作進行“內部作案”的,筆者還是推薦各位使用安全的代碼,多多注意,
將后門權限修改為筆者地址后重新部署“指導書”合約,附上地址:https://ropsten.etherscan.io/address/0x48082341fcc7dea23b1ef63a45099ad0cc43b7c8#code

鑄幣操作結束后,代幣余額查詢如下,該筆交易鏈接如下:https://ropsten.etherscan.io/tx/0xc8f82de418b8730e9e9dfe2d25be2e4e9602a6ef80c83c2bc5aa952115a611e4
根據“指導書”進行一系列在Uniswap上的“送錢”操作:
-
A. 創建交易對并添加流動性

-
B.查詢流動性代幣合約https://ropsten.etherscan.io/address/0xf62e032648b743fae6a6b285f8e906fcbc33bf82

-
C. 按照“指導書”中合約對應的“功能設定(其中描述與代碼功能并不匹配)”對合約兌換進行初始化結束后在Uniswap使用后門地址進行惡意兌換,將資金池中的價值貨幣兌換至自己的地址

嘗試通過瀏覽器通過合約直接呼叫兌換功能(UniswapV2Router02合約中swapExactTokensForETH函式)來實作一次性轉出,

通過查詢函式計算兌換數值

輸入兌換引數,分別代表兌換數量,提取數量,pair地址(BDR2/WETH),后門獲利地址,大于呼叫時間的時間戳,進行呼叫,

呼叫前,后門地址余額如下

進行授權

呼叫成功,交易鏈接:https://ropsten.etherscan.io/tx/0xdfa6cef1352117c4a0afbe677e9948c333169818d6d4a7ce04ac8b0be78b5055

查詢后門地址余額,該筆非法兌換交易到賬,專案方投入資金池的ETH最終因為“指導書”中的代碼以及一步步的“教學”,落入了后門地址的腰包,

到此可以看到,本案例中“一鍵式指導”專案因為代碼安全漏洞以及專案運營方技術缺陷,導致使用該代碼進行專案運營的相關人員遭受了損失,
總結
智能合約撰寫正確性以及權限控制尤為重要,稍有不慎,隱藏在合約中的后門漏洞就會造成一定的損失,警惕一切外來智能合約代碼,不輕易在安全性未知的智能合約代碼專案進行專案運營及個人投資,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/271434.html
標籤:區塊鏈
