CertiK:Warp Finance閃電貸攻擊事件分析

一張100元紙幣,可以做的事情非常多,買早餐,買菜,炒股,旅遊,摺紙飛機甚至是當桌布貼到牆上。
功能太多,反而衍生出了各種各樣的不同形式的錢。
比如說存放在銀行卡里的數字,存放在諸如支付寶一類應用中的數字,存放在股票基金裡的數字,或是借條上的一句話。
閃電貸作為新型金融產品,被認為是金融領域區塊鏈應用的一大跳躍式進步。
閃電貸將借貸部分屬於錢的形式功能“剝離”而出,資金可以幾乎不受阻礙的從一個協議流向另一個協議,從一類資產流向另一類資產,這大大提高了單一功能的效率。
然而對於使用者的便利也使得它往往有空可鑽,駭客使用起來簡直可以稱得上是“一本萬利”甚至是“無本萬利”。
2020年,閃電貸攻擊頻發,成為安全事故中的“新常態”。
北京時間12月17日上午,certik安全技術團隊收到閃電貸攻擊預警,發現一筆針對warp finance專案的閃電貸攻擊。
certik安全技術團隊立即展開分析,現將技術細節分析如下:
1. 透過閃電貸,攻擊者從uniswap和dydx處共借得5筆貸款,每筆借出的weth和dai數目如下:
表一: 攻擊流程中閃電貸借出的代幣種類和數目

2. 攻擊者將借貸所得代幣放入uniswap的weth-dai流動性池中,鑄造得到約94349個流動性證明lp代幣,然後將所有的這些lp代幣透過呼叫圖一中位於0x13db1cb418573f4c3a2ea36486f0e421bc0d2427地址warpvaultlp智慧合約中providecollateral()函式存入到warp finance的vault中。
圖一:warpvaultlp智慧合約中providecollateral()函式

3. 當攻擊者在warpvaultlp合約中存入lp作為collateral之後,呼叫位於0xba539b9a5c2d412cb10e5770435f362094f9541c地址處的warpcontrol智慧合約中的borrowsc函式來從warp專案中借出usdc,如圖二所示。
圖二:warpcontrol智慧合約中的borrowsc()函式
圖二中1582行中的getborrowlimit()函式會透過呼叫同一合約中的gettotalavailablecollateralvalue(),來間接呼叫oracle的getunderlyingprice()函式來獲得當前攻擊者存入的collateral的價格,

圖三:warpcontrol智慧合約中呼叫的價格預言機地址
透過檢視價格預言機oracle地址的值, 可以發現warpcontrol智慧合約呼叫了位於0x4a224cd0517f08b26608a2f73bf390b01a6618c8地址的uniswaplporaclefactory智慧合約作為計算質押資產的價格預言機oracle。
透過呼叫oracle其中的getunderlyingprice()函式來計算價格,getunderlyingprice()函式如圖三所示。
 圖四:uniswaplporaclefactory智慧合約中getunderlyingprice()函式
getunderlyingprice()函式在1390和1394行執行了圖5中的consult()函式並在1404行執行了圖6中的_calculatepriceoflp函式來計算價格。
其中輸入_calculatepriceoflp函式的引數priceasset1和priceasset2來自consult函式。
圖五:uniswaplporaclefactory智慧合約中consult()函式
圖六:uniswaplporaclefactory智慧合約中_calculatepriceoflp()函式
從以上兩圖中可以看出,攻擊者質押的collateral可以借出的usdc數目或者價格的計算公式為:

(token0的價格 * token0的數目 + token1的價格 * token1的數目) / 當前合同中lp代幣的供給量

但是由於(token0的價格 * token0的數目 + token1的價格 * token1的數目) 這一部分無法正確計算出當前uniswap中對於token0-token1代幣對lp的總共鎖定價格,因此計算出的攻擊者存入的collateral可以借得的usdc的數目比正常情況多。
利用warp finance專案使用的oracle計算質押的lp代幣資產價格錯誤的漏洞,最終攻擊者從warp finance專案中獲利約1462枚eth代幣,總價值約95萬美元。
此外,攻擊者還mint了價值大約600萬美元的dai-eth lp share,還有約100萬美元的獲利流入了uniswap和sushiswap的lp中。
總體來看,在本次攻擊中,warp finance 遭受的損失大約為770萬美元。
值得一提的是,warp finance 提到他們能夠recover大約550萬美元的損失,並將recover的資金用於補償使用者。
來源:https://twitter.com/warpfinance/status/1339751977836789767

certik安全技術團隊認為這一次攻擊特點在於攻擊者採用了多種多次閃電貸來提供攻擊所用啟動資金,並利用了當前熱門的預言機價格計算漏洞來進行攻擊。
針對此類攻擊,certik安全驗證團隊建議如下:
1. 接入chainlink等完善的第三方價格預言機對所有代幣價格提供實時價格資料
2. 在智慧合約內部建立細緻的價格監控程式,對任何可能產生巨大波動的交易進行管制或者阻止。
歡迎搜尋微信【certikchina】關注certik官方微信公眾號,點選公眾號底部對話方塊,留言免費獲取諮詢及報價!


免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读