Jarvis Network閃電貸重入攻擊事件分析

2023-01-17 05:01:56

根據NUMEN鏈上監控顯示,Jan-15-2023 05:43:37 PM +UTC時間,Jarvis_Network項目遭到攻擊,損失663101個MATIC。具體tx如下:https://polygonscan.com/tx/0x0053490215baf541362fc78be0de98e3147f40223238d5b12512b3e26c0a2c2f


      Jarvis Network閃電貸重入攻擊事件分析

根據調用棧分析,交易中涉及到很多代幣轉账,所以調用棧很長,我們分析發現在調用過程中存在重入的邏輯。在重入的過程中發現重入前和重入後,對同一個合約的同一個函數調用,傳入參數也一樣,但是返回值差別很大。 重入前:1002157321772769944重入後:10091002696492234934 


      Jarvis Network閃電貸重入攻擊事件分析

重入發生在remove_liquidity,這個函數在(https://polygonscan.com/address/0xfb6fe7802ba9290ef8b00ca16af4bc26eb663a28#code)這個合約中。remove_liquidity這個函數在移除流動性的時候會把用戶添加的代幣返回給用戶,由於polygon和evm是同構鏈,所以在matic轉账給合約的時候會進入到合約的重入。詳細分析調用棧中重入的部分。


      Jarvis Network閃電貸重入攻擊事件分析

首先看getUnderlyingPrice(https://polygonscan.com/address/0xcc6aa628516bb46391b05b16e5058c877461cc76#code)上面是邏輯合約,但是不开源。


      Jarvis Network閃電貸重入攻擊事件分析


      Jarvis Network閃電貸重入攻擊事件分析

根據插槽得到v1=0xe7cea2f6d7b120174bf3a9bc98efaf1ff72c997d,wtoken=0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270。所以進入if分支,然後通過插槽查到_oracles[v1]=0xacf3e1c6f2d6ff12b8aee44413d6834774b3f7a3,繼續進入裏面的else分支後調用0xacf3e1c6f2d6ff12b8aee44413d6834774b3f7a3合約的getUnderlyingPrice函數。0xacf3e1c6f2d6ff12b8aee44413d6834774b3f7a3對應的邏輯合約是0x3803527dcd92ac3e72a0a164db82734daba47fac,這個合約也沒有开源。


      Jarvis Network閃電貸重入攻擊事件分析


      Jarvis Network閃電貸重入攻擊事件分析

這個是一些內置的計算,因為攻擊涉及到重入,考慮到一定是重入前和重入後的一些變量是轉账發生之後計算的,這部分代碼不涉及到外部變量,所以問題應該不在這。除此之外還調用了0x9de。


      Jarvis Network閃電貸重入攻擊事件分析

varg0是傳入的代幣地址,也就是0xe7cea2f6d7b120174bf3a9bc98efaf1ff72c997d。對應的_poolOf[v0]是0xfb6fe7802ba9290ef8b00ca16af4bc26eb663a28。進入這個合約分析get_virtual_price函數。對應代碼如下:


      Jarvis Network閃電貸重入攻擊事件分析

self.token還是0xe7cea2f6d7b120174bf3a9bc98efaf1ff72c997d,除數是這個代幣的總發行量。


      Jarvis Network閃電貸重入攻擊事件分析

看到D會影響get_xcp的返回。因為重入發生在remove_liquidity,所以分析remove_liquidity函數。詳細代碼如下:


      Jarvis Network閃電貸重入攻擊事件分析

調用前後get_virtual_price返回值變化。


      Jarvis Network閃電貸重入攻擊事件分析

self.D的更改在轉账之後。攻擊者在移除流動性的時候,matic轉移到攻擊者合約,回調fallback時候先查了一下0xe7cea2f6d7b120174bf3a9bc98efaf1ff72c997d價格,由於self.D更新在轉账之後,所以導致之前的價格獲取錯誤。

移除流動性方法流程:1)銷毀用戶LP;2)發送給用戶質押資金;3)更新self.D。 

self.D用於價格計算,添加流動性時也對self.D更新,並且攻擊者此次流動性資金較大。根據self.D計算公式self.D = D - D * amount / total_supply,amount和total_supply近乎相等,正常計算時,self.D值會小很多。 

但由於攻擊者在2)進行了重入,並且比原始價格增高了10倍進行借貸,正是因為self.D值在添加流動性時增大,而移除流動性時未及時更新。 

這裏remove_liquidity 移除流動性方法雖然添加了@nonreentrant('lock')來防止重入該方法,但由於攻擊者重入進入其他合約借貸資金,這裏重入鎖並不能奏效。

總結: 

本次攻擊主要是因為變量修改邏輯在外部調用之後,導致價格獲取出現異常,並且跨合約重入使得重入鎖不能奏效,NUMEN實驗室提醒項目方代碼要經過嚴格的安全審計,變量修改要放在外部調用之前並且價格獲取採用多數據源的方式,代碼邏輯遵循先判斷,後寫入變量,再進行外部調用的編碼規範(Checks-Effects-Interactions)會使項目更加安全穩定。NUMEN擁有專業的安全團隊,為WEB3生態保駕護航。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

Layer2 格局劇變:Base 生態有哪些關鍵亮點?

在激烈競爭的 L2 賽道中,原本穩坐釣魚臺的 Arbitrum 和 Optimism 似乎面臨着前...

加密泡泡啊
120 3個月前

XRP 漲至 7.5 美元?分析師告訴 XRP 大軍為純粹的煙火做好准備!

加密貨幣分析師 EGRAG 表示,XRP 即將迎來關鍵時刻,價格可能大幅上漲,這取決於能否突破關鍵...

加密泡泡啊
128 3個月前

以太坊ETF通過後 將推動山寨幣和整個加密生態大爆發

比特幣ETF通過後市場動蕩,以太坊ETF交易前景分析 比特幣ETF通過後,市場出現了先跌後漲的走勢...

加密泡泡啊
144 3個月前

ZRO為啥這么能漲?

ZRO概述 ZRO代幣,全稱為LayerZero,是LayerZero協議的本地代幣,旨在作為治理...

加密泡泡啊
105 3個月前

今晚ETH迎來暴漲時代 op、arb、metis等以太坊二層項目能否跑出百倍幣?

北京時間7月23日晚上美股开盤後 ETH 的ETF开始交易。ETH的裏程碑啊,新的時代开啓。突破前...

BNBCCC
125 3個月前

Mt Gox 轉移 28 億美元比特幣 加密貨幣下跌 ETH ETF 提前發行

2014 年倒閉的臭名昭著的比特幣交易所 Mt Gox 已向債權人轉移了大量比特幣 (BTC),作...

加密圈探長
113 3個月前