前言
據慢霧區情報,以太坊 DeFi 平臺 Lendf.Me 遭受重入漏洞攻擊。慢霧安全團隊在收到情報后隨即對此次攻擊事件展開分析,并快速定位了問題所在。
據慢霧科技反洗錢(AML)系統初步統計分析,Lendf.Me 被攻擊累計的損失約 24,696,616 美元,具體盜取的幣種及數額為:
之后攻擊者不斷通過 1inch.exchange、ParaSwap、Tokenlon 等 DEX 平臺將盜取的幣兌換成 ETH 及其他代幣。
以下是詳細分析過程。
攻擊細節
本次對 Lendf.Me 實施攻擊的攻擊者地址為 0xa9bf70a420d364e923c74448d9d817d3f2a77822,攻擊者通過部署合約 0x538359785a8d5ab1a741a0ba94f26a800759d91d 對 Lendf.Me 進行攻擊。
DeFi借貸協議Euler部署至BNB Chain的提案已投票通過:2月8日消息,DeFi借貸協議Euler Finance社區已投票通過將項目部署至BNB Chain的提案。該提案由AdamBNB代表BNB Chain基金會提交,83.05%的投票者支持該提案。[2023/2/8 11:54:26]
通過在 Etherscan 上查看攻擊者的其中一筆交易:https://etherscan.io/tx/0xae7d664bdfcc54220df4f18d339005c6faf6e62c9ca79c56387bc0389274363b
我們發現,攻擊者首先是存入了 0.00021593 枚 imBTC,但是卻從 Lendf.Me 中成功提現了 0.00043188 枚 imBTC,提現的數量幾乎是存入數量的翻倍。那么攻擊者是如何從短短的一筆交易中拿到翻倍的余額的呢?這需要我們深入分析交易中的每一個動作,看看究竟發生了什么。
數據:全網DeFi協議TVL跌破400億美元,創2021年2月11日以來新低:金色財經報道,據DefiLlama數據顯示,全網DeFi協議TVL于昨日再度跌破400億美元,創2021年2月11日以來新低。此前該數據于11月23日短時跌破400億美元后迅速反彈至420億美元附近。[2022/12/18 21:52:33]
通過把該筆交易放到 bloxy.info 上查看,我們能知道完整的交易流程
通過分析交易流程,我們不難發現攻擊者對 Lendf.Me 進行了兩次 supply() 函數的調用,但是這兩次調用都是獨立的,并不是在前一筆 supply() 函數中再次調用 supply() 函數。
緊接著,在第二次 supply() 函數的調用過程中,攻擊者在他自己的合約中對 Lendf.Me 的 withdraw() 函數發起調用,最終提現
數據:DeFi鎖倉量跌至700億美元區間,創自2021年3月以來最低水平:金色財經報道,據DappRader加密采用報告顯示,DeFi鎖倉量已經從今年四月中旬的1600億美元跌至700億美元區間,創下自2021年3月以來的最低水平,跌幅打打工66%。不過,數據顯示二季度DeFi鎖倉量較上一季下降15%,唯一活躍錢包數量減少12%,下跌趨勢開始放緩,同時過去30天DeFi應用活躍地址數量也抱持相對穩定。(cointelegraph)[2022/8/10 12:14:37]
在這里,我們不難分析出,攻擊者的 withdraw() 調用是發生在 transferFrom 函數中,也就是在 Lendf.Me 通過 transferFrom 調用用戶的 tokensToSend() 鉤子函數的時候調用的。很明顯,攻擊者通過 supply() 函數重入了 Lendf.Me 合約,造成了重入攻擊,那么具體的攻擊細節是怎樣的呢?我們接下來跟進 Lendf.Me 的合約代碼。
DeFi協議總鎖倉量達754.2億美元,24小時內跌超4%:金色財經報道,據DefiLlama數據顯示,DeFi協議總鎖倉量(TVL)達到754.2億美元,24小時跌幅為4.47%。TVL排名前五分別為MakerDAO(76億美元)、Curve(54.6億美元)、AAVE(49.4億美元)、Lido(47.2億美元)、Uniswap(46.7億美元)。[2022/6/16 4:33:03]
代碼分析
Lendf.Me 的 supply() 函數在進行了一系列的處理后,會調用一個 doTransferIn 函數,用于把用戶提供的幣存進合約,然后接下來會對 market 變量的一些信息進行賦值。回顧剛才說的攻擊流程,攻擊者是在第二次 supply() 函數中通過重入的方式調用了 withdraw() 函數提現,也就是說在第二次的 supply() 函數中,1590 行后的操作在 withdraw() 之前并不會執行,在 withdraw() 執行完之后,1590 行后的代碼才會繼續執行。這里的操作導致了攻擊者可提現余額變多。
波卡DeFi平臺Acala已完成平行鏈ID 2000的注冊,預計4個小時后開啟Crowdloan:11月5日消息,據Polkadot.js顯示,波卡DeFi平臺Acala已經完成平行鏈ID 2000的注冊(平行鏈ID1000-1999為公益平行鏈),并預計在4個小時后開啟Crowdloan,屆時DOT持有者可開始為Acala Crowdloan貢獻DOT。
據悉,Acala團隊此前宣布本次將拿出ACA代幣總量的17%(1.7億ACA)競拍波卡主網平行鏈插槽,并且在Acala官網與Polkawallet參與的用戶還能1:1獲得lcDOT,lcDOT是釋放DOT競拍流動性的產品,能讓用戶無需等待DOT兩年鎖定時間,在Acala上線后即可釋放流動性。[2021/11/5 6:33:26]
我們深入分析下 supply() 函數
根據上圖,可以看到,在 supply() 函數的末尾,會對 market 和用戶的余額進行更新,在這之前,用戶的余額會在函數的開頭預先獲取好并保存在 localResults.userSupplyCurrent,如下:
通過賦值給 localResults 變量的方式,用戶的轉入信息會先暫時保存在這個變量內,然后此時攻擊者執行 withdraw() 函數,我們看下 withdraw() 函數的代碼:
這里有兩個關鍵的地方:
1、在函數的開頭,合約首先獲取了 storage 的 market 及 supplyBalance 變量。
2、在 withdraw() 函數的末尾,存在同樣的邏輯對 market 用戶的余額信息 (supplyBalance) 進行了更新,更新值為扣除用戶的提現金額后的余額。
按正常的提現邏輯而言,在 withdraw() 單獨執行的時候,用戶的余額會被扣除并正常更新,但是由于攻擊者將 withdraw() 嵌入在 supply() 中,在 withdraw() 函數更新了用戶余額 (supplyBalance) 后,接下來在 supply() 函數要執行的代碼,也就是 1590 行之后,用戶的余額會再被更新一次,而用于更新的值會是先前 supply() 函數開頭的保存在localResults 中的用戶原先的存款加上攻擊者第一次調用 supply() 函數存款的值。
在這樣的操作下,用戶的余額雖然在提現后雖然已經扣除了,但是接下來的 supply() 函數的邏輯會再次將用戶未扣除提現金額時的值覆蓋回去,導致攻擊者雖然執行了提現操作,但是余額不但沒有扣除,反而導致余額增加了。通過這樣的方式,攻擊者能以指數級別的數量提現,直至把 Lendf.Me 提空。
防御建議
針對本次攻擊事件慢霧安全團隊建議:
1、在關鍵的業務操作方法中加入鎖機制,如:OpenZeppelin 的 ReentrancyGuard
2、開發合約的時候采用先更改本合約的變量,再進行外部調用的編寫風格
3、項目上線前請優秀的第三方安全團隊進行全面的安全審計,盡可能的發現潛在的安全問題
4、多個合約進行對接的時候也需要對多方合約進行代碼安全和業務安全的把關,全面考慮各種業務場景相結合下的安全問題
5、合約盡可能的設置暫停開關,在出現“黑天鵝”事件的時候能夠及時發現并止損
6、安全是動態的,各個項目方也需要及時捕獲可能與自身項目相關的威脅情報,及時排查潛在的安全風險
附OpenZeppelin ReentrancyGuard:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol
Tags:UPPSUPPLYPPLSupplyConSuperFluidDynamic Supply TrackerKepple
4月16日,自媒體“駱駝君有話說”發布聲明,稱有人利用其“誤引用失實信息”文章,及冒用其名義抹黑MXC抹茶,經和MXC抹茶相關負責人溝通,愿意協助MXC抹茶追查幕后黑手.
1900/1/1 0:00:00文章系金色財經專欄作者牛七的區塊鏈分析記供稿,發表言論僅代表其個人觀點,僅供學習交流!金色盤面不會主動提供任何交易指導,亦不會收取任何費用指導交易,請讀者仔細甄別,謹防上當.
1900/1/1 0:00:00區塊鏈數據博客Flipside最近發布了今年第一季度的三大穩定幣熱力圖,信息量非常巨大(建議打開鏈接,點擊圖片,放大仔細觀看),我通過對比觀察,欣喜的發現,DeFi世界已經超越了“臨界質量”.
1900/1/1 0:00:00上圖為BTC17年-20年目前日線走勢圖,研究可以發現,斐波那契0.618回撤位在一輪趨勢行情的頂部構造中扮演者關鍵的壓制作用,首先19年BTC小牛行情,一路漲至最高13900美金.
1900/1/1 0:00:00新加坡數字資產金融服務提供商Matrixport宣布已與歐洲領先的合規支付公司Simplex達成合作,今后,用戶可以可以便捷、安全地使用維薩卡(Visa)或萬事達卡(Mastercard).
1900/1/1 0:00:00大盤在突破7800-8000美金強壓區間后,強力上漲,昨天單日上漲超過1000美金,一度觸及9500美金,隨后又沖高回落1000美金,下探至8400美金,短時幣價波動幅度較大,對于合約市場來說.
1900/1/1 0:00:00