Sonne Finance攻擊分析

中級Jun 11, 2024
這種攻擊的本質在於市場(soToken)的創建,攻擊者使用少量基礎代幣執行了第一次抵押鑄造操作,導致soToken的“totalSupply”值非常小。
Sonne Finance攻擊分析

2024 年 5 月 15 日,Sonne Finance 遭受了樂觀鏈的攻擊,導致損失高達 2000 萬美元。攻擊發生后,Twitter使用者@tonyke_bot在推特上說,他們用大約100美元保護了Sonne Finance抵押品池(也稱為市場,類似於化合物中的cToken)中剩餘的650萬美元。

“”
https://twitter.com/tonyke_bot/status/1790547461611860182)

發現攻擊后,Sonne Finance團隊迅速暫停了Optimism上的所有市場,並表示Base上的市場是安全的。

“”

https://twitter.com/SonneFinance/status/1790535383005966554)

攻擊簡介

Sonne Finance是一個去中心化的借貸協議,在樂觀上分叉Compound V2,為個人,機構和協定提供金融服務。Sonne Finance協議聚合使用者的代幣資產,形成借貸流動性池,為使用者提供類似銀行的借貸業務。與Compound一樣,協議參與者可以將他們的代幣抵押給Sonne Finance的貸款流動性池,並獲得證書soToken(與cToken相同)。SoToken是一種生息資產證書,隨著區塊的進行會產生一定的收入,還將獲得SON代幣激勵。參與者還可以用手中的soToken從Sonne借貸資產池中借入其他代幣。例如,參與者可以抵押一定數量的USDC以獲得soUSDC證書,然後借出WETH以供進一步流通。Sonne Finance 協議中的抵押貸款可以是多對多資產關係。在抵押貸款過程中,協議將自動計算參與者位址的健康因素(Health Factor)。當健康係數低於1時,地址產品的抵押將支撐 強制平倉,清算人也可以獲得一定的強制平倉獎勵。

使用者存入的基礎代幣數量與鑄造的soTokens之間的關係主要與稱為匯率的變數有關。這個變數可以粗略地用來指示每個soToken值多少底層代幣。匯率的計算公式如下:

“”

在上式中,總現金是指soToken持有的標的代幣數量,總借款是指在某個市場借出的標的代幣數量,總儲備是指總儲備金額(包括借款人支付的利息),總供應是指鑄造的soToken數量。

贖回時,使用者可以指定要贖回的底層代幣數量,贖回金額,以計算需要銷毀的soToken數量,贖回Tokens。計算方法大致為「贖回代幣=贖回金額/交換鼠」。。請注意,此處沒有準確性損失。處理。

這次攻擊的本質是,當市場(soToken)創建時,攻擊者進行了第一次抵押鑄造操作,用少量的基礎代幣鑄造了很少的soToken,導致soToken的“總供應”價值太小。攻擊者隨後利用 Solidity 合約精度損失的漏洞,將底層代幣直接發送到 soToken 合約(soToken 不會鑄造,這意味著“totalSupply”保持不變,“totalCash”變大)而不是質押 + 鑄造方式來充值底層代幣。這樣的操作使合約中的“totalCash”變數變大,但“totalSupply”保持不變,導致匯率變大。最後,當攻擊者贖回底層代幣時,需要銷毀的soToken少於抵押期間鑄造的soToken。攻擊者利用賺來的soToken將底層代幣USDC WETH出借給其他soToken(如soWETH、soUSDC),最終獲得高達2000萬美元的利潤。

攻擊中涉及的關鍵位址

攻擊準備事務:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

攻擊有利可圖的交易:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

攻擊EOA相關位址:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

攻擊者(合約)相關位址:

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

底層代幣(VELO 代幣 V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

漏洞合約(soVELO,類似於Compound的cToken):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot X 上的使用者救援事務:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

攻擊進程分析

回顧

Sonne Finance項目團隊最近通過了一項提案,將VELO市場添加到Sonne Finance(https://twitter.com/SonneFinance/status/1786871066075206044),並通過多重簽名錢包安排了五筆交易,兩天后執行(https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7),這五筆交易用於創建VELO市場(soVELO 合約)並設置市場的一些關鍵配置,例如設置利率模型、設置價格預言機和設置抵押因素等。創建VELO市場后,使用者可以將代幣充值 VELO鑄造 soVELO 代幣,而這些代幣又可用於借入其他 soToken。

攻擊準備

攻擊準備階段主要是讓攻擊者在兩天的提案鎖定期到期后,根據Sonne Finance專案提案中的資訊創建一個VELO市場(soVELO合約),設置關鍵配置,並通過抵押的方式將代幣鑄造 VELO到soVELO合約中。 soVELO 代幣,並將持有VELO代幣直接發送到 soVELO 合約,以提高匯率並準備從隨後的攻擊中獲利。

具體步驟如下:

  1. 兩天的鎖定期結束后,攻擊者首先將提案中排列的前四筆交易的操作打包成一筆交易(交易0x45c0cc),用於創建VELO市場(soVELO合約)並設置密鑰配置。初始化VELO市場時,匯率設置為“200,000,000,000,000,000,000,000,000”。

  2. 攻擊者調用 soVELO 合約的「鑄造」函數來充值 VELO代幣並鑄造 soVELO 代幣。攻擊者將“mintAmount”指定為“400,000,001”(VELO令牌的數量)。從函數“exchangeRateStoredInternal”可以看出,由於此時soVELO令牌的“_totalSuppl”為0,因此exchangeRate是步驟1中設置的值。根據公式「 mintTokens = 實際MintAmount / T匯率 」,此時應該鑄造的soVELO代幣的計算數量為2。空,在此步驟中,攻擊者將價值為“400,000,001”的VELO代幣存入soVELO合約,攻擊者獲得價值為2的soVELO代幣。

soVELO.鑄造:

“”

  1. 攻擊者通過直接向soVELO合約發送VELO代幣,向soVELO合約發送了價值為“2,552,964,259,704,265,837,526”的VELO代幣。此時,soVELO合約持有的VELO代幣數量有所增加,但由於沒有新的soVELO代幣鑄造幣,因此totalSupply保持不變,這意味著根據匯率計算公式計算的匯率此時會變大。

  2. 攻擊者多次轉移持有的soVELO令牌,最後將它們轉移到另一個攻擊EOA 0xae4a。

攻擊牟利

攻擊盈利階段主要涉及攻擊者執行提案的第五筆交易,並通過閃貸直接向soVELO合約借出VELO代幣,以進一步提高匯率。然後攻擊者使用手中價值為 2 的 soVELO 代幣,從其他 soToken(如 soWETH、soUSDC 等)合約借入 WETH、USDC 等底層代幣,這些部分成為攻擊者的利潤。然後攻擊者去贖回他在 soVELO 合約中的底層代幣。由於匯率的增加以及計算需要銷毀以進行贖回的 soVELO 代幣的準確性下降,攻擊者最終只使用了價值為 1 的 soVELO 代幣。之前存入的VELO代幣幾乎全部贖回,可以理解為攻擊者利用價值為1的額外soVELO代幣,通過借用其他soTokens賺取WETH、USDC等底層代幣。攻擊者使用相同的技術多次重複攻擊,最終獲得了巨額利潤。

具體步驟如下:

  1. 攻擊者執行提案中的第五筆交易,並設置提案中指定的貸款因數。

  2. 攻擊者從 VolatileV2 自動做市商 - USDC/VELO池中閃借VELO價值為“35,469,150,965,253,049,864,450,449”的代幣,從而觸發攻擊者的鉤子功能。在鉤子函數中,攻擊者繼續執行攻擊操作。

  3. 攻擊者將他持有的VELO代幣發送到soVELO合約,以進一步提高匯率。目前,soVELO合約中共有VELO個代幣,價值為“35,471,703,929,512,754,530,287,976”(攻擊者轉移的VELO代幣的總和)。

  4. 攻擊者創建新的合約0xa16388a6210545b27f669d5189648c1722300b8b。在構造函數中,他將持有的 2 個 soVELO 代幣轉移到新創建的合約0xa163(以下簡稱攻擊者0xa163)。

  5. 攻擊者0xa163使用他持有的soVELO代幣從soWETH借用價值為“265,842,857,910,985,546,929”的WETH。

  6. 攻擊者0xa163調用soVELO的“贖回底層”函數,將贖回的VELO代幣的價值指定為“35,471,603,929,512,754,530,287,976”(幾乎是攻擊者之前轉讓或抵押到soVELO合約中的VELO代幣的數量)。此時,有必要使用公式「贖回代幣=贖回金額/匯率」來計算需要銷毀才能贖回的soVELO代幣數量。

從「匯率存儲內部」函數可以看出,由於_totalSupply是 2 而不是 0,因此需要計算匯率的值。根據公式“匯率=(總現金+總借款-總儲備)/總供應量”,當前匯率為“17,735,851,964,756,377,265,143,988,000,000,000”,這個值遠大於初始匯率集“200,000,000,000,000,000,000,000,000,000,000,000,000”。

根據新匯率計算的“贖回代幣”的價值為“1.99”。由於Solidity的向下四捨五入特性,“贖回代幣”的值最終為1。這意味著攻擊者0xa163使用價值為 1 的 soVELO 代幣來贖回之前存入的幾乎所有VELO代幣。同時,攻擊者還0xa163從soWETH借來的價值為“265,842,857,910,985,546,929”的WETH。

soVELO.贖回底層證券:

“”

soVELO.exchangeRateStorageInternal:

“”

  1. 攻擊者0xa163將借來的所有WETH和贖回VELO代幣轉移給上層攻擊者,然後自毀。

  2. 攻擊者調用soWETH的“liquidateBorrow”函數來清算從單子新創建的合約0xa163借入的部分資產,以取回價值為1的鎖定soVELO代幣。目前,攻擊者僅持有值為 1 的 soVELO 令牌。

  3. 攻擊者調用 soVELO 的“鑄造”函數,並再次抵押和鑄造 soVELO 代幣,目的是收集足夠的價值為 2 的 soVELO 代幣,然後再次執行上述步驟 3-8 以從其他未識別的代幣中獲利。

  4. 攻擊者多次執行步驟9中的操作,償還閃電貸款,並獲利離開市場。

100 美元如何利用 650 萬美元

攻擊發生后,X 上的使用者 @tonyke_bot通過在交易0x0a284cd中將 1144 個VELO代幣質押到 soVELO 合約中,鑄造了 0.00000011 soVELO。此操作之所以能阻止攻擊者進一步攻擊,是因為本次交易改變了soVELO中totalSupply的大小和totalCash持有的VELO代幣數量,而totalSupply增長對匯率計算的影響大於totalCash增長的影響。因此,匯率變小,導致攻擊者在進行攻擊時無法多方利用準確性的損失來獲得soVELO,使攻擊無法多方。

“”

資金跟蹤

攻擊者在搶奪非法收益后不久就轉移了資金。大部分資金轉移到以下四個位址。有些是為了改變位址以繼續攻擊,有些是為了洗錢:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

攻擊者將198 WETH轉移到該位址,然後該位址使用相同的攻擊方式在以下交易中獲取非法收益:

“”

襲擊發生后,該位址將上述違法所得轉0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb。

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

攻擊者將724277 USDC和2353 VELO轉移到該位址,並將USDC換成以太。然後一些資金立即轉移到星際之門跨鏈 橋接。大多數非法資金仍保留在此位址:

“”

3、0xbd18100a168321701955e348f03d0df4f517c13b

攻擊者將33 WETH轉移到該位址,並使用剝離鏈試圖洗錢。洗錢環節如下:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

攻擊者將563 WETH轉移到該位址,隨後轉移到0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68,到目前為止沒有進一步的行動。

攻擊者這次的洗錢手段比較專業,手段呈現出多樣化的趨勢。因此,對於我們 Web3 參與者來說,我們必須在安全性方面不斷提升我們的反洗錢能力,通過 KYT、反洗錢 等相關區塊鏈交易安全產品來提升 Defi 專案的安全性。

安全建議

1、及時瞭解合同審計和測試。在智慧合約部署前進行全面審計,特別注意涉及財務計算的所有部分。首先,使用自動化測試,利用漏洞庫的即時更新進行高效的合約安全掃描(業界也逐漸開源了一些成熟的安全審計工具,包括ZAN AI SCAN),同時結合人工審計來排查需要深入行業知識的問題。

2、精度的損失需要認真對待。精度損失帶來的安全問題層出不窮,尤其是在 Defi 專案中,精度損失往往會導致嚴重的經濟損失。建議專案方和安全審核員仔細審查專案中存在準確性損失的代碼,並進行測試以盡可能避免此漏洞。

  1. 建議在 Compound 中創建類似於 cToken 的市場和第一次抵押鑄造操作由特權用戶執行,以避免被攻擊者操縱從而操縱交易所利率。

  2. 當合約中存在依賴於“this.balance”或“token.balanceOf()”值的關鍵變數時,需要仔細考慮鍵變數變更的條件,比如是否允許將本國貨幣或代幣直接轉移到合約中。更改變數值的方法,或者只能通過調用特定函數來更改變數的值。

免責聲明:

  1. 本文轉載自 [ZAN]。所有版權歸原作者所有[ZAN]。如果對此轉載有異議,請聯繫Gate Learn團隊,他們會及時處理。
  2. 免責聲明:本文中表達的觀點和意見僅代表作者的觀點和意見,不構成任何投資建議。
  3. 文章到其他語言的翻譯由Gate Learn團隊完成。除非另有說明,否則禁止複製、分發或抄襲翻譯后的文章。

攻擊簡介

攻擊中涉及的關鍵位址

攻擊過程分析

100 美元如何利用 650 萬美元

資金追蹤

安全建議

Sonne Finance攻擊分析

中級Jun 11, 2024
這種攻擊的本質在於市場(soToken)的創建,攻擊者使用少量基礎代幣執行了第一次抵押鑄造操作,導致soToken的“totalSupply”值非常小。
Sonne Finance攻擊分析

攻擊簡介

攻擊中涉及的關鍵位址

攻擊過程分析

100 美元如何利用 650 萬美元

資金追蹤

安全建議

2024 年 5 月 15 日,Sonne Finance 遭受了樂觀鏈的攻擊,導致損失高達 2000 萬美元。攻擊發生后,Twitter使用者@tonyke_bot在推特上說,他們用大約100美元保護了Sonne Finance抵押品池(也稱為市場,類似於化合物中的cToken)中剩餘的650萬美元。

“”
https://twitter.com/tonyke_bot/status/1790547461611860182)

發現攻擊后,Sonne Finance團隊迅速暫停了Optimism上的所有市場,並表示Base上的市場是安全的。

“”

https://twitter.com/SonneFinance/status/1790535383005966554)

攻擊簡介

Sonne Finance是一個去中心化的借貸協議,在樂觀上分叉Compound V2,為個人,機構和協定提供金融服務。Sonne Finance協議聚合使用者的代幣資產,形成借貸流動性池,為使用者提供類似銀行的借貸業務。與Compound一樣,協議參與者可以將他們的代幣抵押給Sonne Finance的貸款流動性池,並獲得證書soToken(與cToken相同)。SoToken是一種生息資產證書,隨著區塊的進行會產生一定的收入,還將獲得SON代幣激勵。參與者還可以用手中的soToken從Sonne借貸資產池中借入其他代幣。例如,參與者可以抵押一定數量的USDC以獲得soUSDC證書,然後借出WETH以供進一步流通。Sonne Finance 協議中的抵押貸款可以是多對多資產關係。在抵押貸款過程中,協議將自動計算參與者位址的健康因素(Health Factor)。當健康係數低於1時,地址產品的抵押將支撐 強制平倉,清算人也可以獲得一定的強制平倉獎勵。

使用者存入的基礎代幣數量與鑄造的soTokens之間的關係主要與稱為匯率的變數有關。這個變數可以粗略地用來指示每個soToken值多少底層代幣。匯率的計算公式如下:

“”

在上式中,總現金是指soToken持有的標的代幣數量,總借款是指在某個市場借出的標的代幣數量,總儲備是指總儲備金額(包括借款人支付的利息),總供應是指鑄造的soToken數量。

贖回時,使用者可以指定要贖回的底層代幣數量,贖回金額,以計算需要銷毀的soToken數量,贖回Tokens。計算方法大致為「贖回代幣=贖回金額/交換鼠」。。請注意,此處沒有準確性損失。處理。

這次攻擊的本質是,當市場(soToken)創建時,攻擊者進行了第一次抵押鑄造操作,用少量的基礎代幣鑄造了很少的soToken,導致soToken的“總供應”價值太小。攻擊者隨後利用 Solidity 合約精度損失的漏洞,將底層代幣直接發送到 soToken 合約(soToken 不會鑄造,這意味著“totalSupply”保持不變,“totalCash”變大)而不是質押 + 鑄造方式來充值底層代幣。這樣的操作使合約中的“totalCash”變數變大,但“totalSupply”保持不變,導致匯率變大。最後,當攻擊者贖回底層代幣時,需要銷毀的soToken少於抵押期間鑄造的soToken。攻擊者利用賺來的soToken將底層代幣USDC WETH出借給其他soToken(如soWETH、soUSDC),最終獲得高達2000萬美元的利潤。

攻擊中涉及的關鍵位址

攻擊準備事務:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

攻擊有利可圖的交易:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

攻擊EOA相關位址:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

攻擊者(合約)相關位址:

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

底層代幣(VELO 代幣 V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

漏洞合約(soVELO,類似於Compound的cToken):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot X 上的使用者救援事務:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

攻擊進程分析

回顧

Sonne Finance項目團隊最近通過了一項提案,將VELO市場添加到Sonne Finance(https://twitter.com/SonneFinance/status/1786871066075206044),並通過多重簽名錢包安排了五筆交易,兩天后執行(https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7),這五筆交易用於創建VELO市場(soVELO 合約)並設置市場的一些關鍵配置,例如設置利率模型、設置價格預言機和設置抵押因素等。創建VELO市場后,使用者可以將代幣充值 VELO鑄造 soVELO 代幣,而這些代幣又可用於借入其他 soToken。

攻擊準備

攻擊準備階段主要是讓攻擊者在兩天的提案鎖定期到期后,根據Sonne Finance專案提案中的資訊創建一個VELO市場(soVELO合約),設置關鍵配置,並通過抵押的方式將代幣鑄造 VELO到soVELO合約中。 soVELO 代幣,並將持有VELO代幣直接發送到 soVELO 合約,以提高匯率並準備從隨後的攻擊中獲利。

具體步驟如下:

  1. 兩天的鎖定期結束后,攻擊者首先將提案中排列的前四筆交易的操作打包成一筆交易(交易0x45c0cc),用於創建VELO市場(soVELO合約)並設置密鑰配置。初始化VELO市場時,匯率設置為“200,000,000,000,000,000,000,000,000”。

  2. 攻擊者調用 soVELO 合約的「鑄造」函數來充值 VELO代幣並鑄造 soVELO 代幣。攻擊者將“mintAmount”指定為“400,000,001”(VELO令牌的數量)。從函數“exchangeRateStoredInternal”可以看出,由於此時soVELO令牌的“_totalSuppl”為0,因此exchangeRate是步驟1中設置的值。根據公式「 mintTokens = 實際MintAmount / T匯率 」,此時應該鑄造的soVELO代幣的計算數量為2。空,在此步驟中,攻擊者將價值為“400,000,001”的VELO代幣存入soVELO合約,攻擊者獲得價值為2的soVELO代幣。

soVELO.鑄造:

“”

  1. 攻擊者通過直接向soVELO合約發送VELO代幣,向soVELO合約發送了價值為“2,552,964,259,704,265,837,526”的VELO代幣。此時,soVELO合約持有的VELO代幣數量有所增加,但由於沒有新的soVELO代幣鑄造幣,因此totalSupply保持不變,這意味著根據匯率計算公式計算的匯率此時會變大。

  2. 攻擊者多次轉移持有的soVELO令牌,最後將它們轉移到另一個攻擊EOA 0xae4a。

攻擊牟利

攻擊盈利階段主要涉及攻擊者執行提案的第五筆交易,並通過閃貸直接向soVELO合約借出VELO代幣,以進一步提高匯率。然後攻擊者使用手中價值為 2 的 soVELO 代幣,從其他 soToken(如 soWETH、soUSDC 等)合約借入 WETH、USDC 等底層代幣,這些部分成為攻擊者的利潤。然後攻擊者去贖回他在 soVELO 合約中的底層代幣。由於匯率的增加以及計算需要銷毀以進行贖回的 soVELO 代幣的準確性下降,攻擊者最終只使用了價值為 1 的 soVELO 代幣。之前存入的VELO代幣幾乎全部贖回,可以理解為攻擊者利用價值為1的額外soVELO代幣,通過借用其他soTokens賺取WETH、USDC等底層代幣。攻擊者使用相同的技術多次重複攻擊,最終獲得了巨額利潤。

具體步驟如下:

  1. 攻擊者執行提案中的第五筆交易,並設置提案中指定的貸款因數。

  2. 攻擊者從 VolatileV2 自動做市商 - USDC/VELO池中閃借VELO價值為“35,469,150,965,253,049,864,450,449”的代幣,從而觸發攻擊者的鉤子功能。在鉤子函數中,攻擊者繼續執行攻擊操作。

  3. 攻擊者將他持有的VELO代幣發送到soVELO合約,以進一步提高匯率。目前,soVELO合約中共有VELO個代幣,價值為“35,471,703,929,512,754,530,287,976”(攻擊者轉移的VELO代幣的總和)。

  4. 攻擊者創建新的合約0xa16388a6210545b27f669d5189648c1722300b8b。在構造函數中,他將持有的 2 個 soVELO 代幣轉移到新創建的合約0xa163(以下簡稱攻擊者0xa163)。

  5. 攻擊者0xa163使用他持有的soVELO代幣從soWETH借用價值為“265,842,857,910,985,546,929”的WETH。

  6. 攻擊者0xa163調用soVELO的“贖回底層”函數,將贖回的VELO代幣的價值指定為“35,471,603,929,512,754,530,287,976”(幾乎是攻擊者之前轉讓或抵押到soVELO合約中的VELO代幣的數量)。此時,有必要使用公式「贖回代幣=贖回金額/匯率」來計算需要銷毀才能贖回的soVELO代幣數量。

從「匯率存儲內部」函數可以看出,由於_totalSupply是 2 而不是 0,因此需要計算匯率的值。根據公式“匯率=(總現金+總借款-總儲備)/總供應量”,當前匯率為“17,735,851,964,756,377,265,143,988,000,000,000”,這個值遠大於初始匯率集“200,000,000,000,000,000,000,000,000,000,000,000,000”。

根據新匯率計算的“贖回代幣”的價值為“1.99”。由於Solidity的向下四捨五入特性,“贖回代幣”的值最終為1。這意味著攻擊者0xa163使用價值為 1 的 soVELO 代幣來贖回之前存入的幾乎所有VELO代幣。同時,攻擊者還0xa163從soWETH借來的價值為“265,842,857,910,985,546,929”的WETH。

soVELO.贖回底層證券:

“”

soVELO.exchangeRateStorageInternal:

“”

  1. 攻擊者0xa163將借來的所有WETH和贖回VELO代幣轉移給上層攻擊者,然後自毀。

  2. 攻擊者調用soWETH的“liquidateBorrow”函數來清算從單子新創建的合約0xa163借入的部分資產,以取回價值為1的鎖定soVELO代幣。目前,攻擊者僅持有值為 1 的 soVELO 令牌。

  3. 攻擊者調用 soVELO 的“鑄造”函數,並再次抵押和鑄造 soVELO 代幣,目的是收集足夠的價值為 2 的 soVELO 代幣,然後再次執行上述步驟 3-8 以從其他未識別的代幣中獲利。

  4. 攻擊者多次執行步驟9中的操作,償還閃電貸款,並獲利離開市場。

100 美元如何利用 650 萬美元

攻擊發生后,X 上的使用者 @tonyke_bot通過在交易0x0a284cd中將 1144 個VELO代幣質押到 soVELO 合約中,鑄造了 0.00000011 soVELO。此操作之所以能阻止攻擊者進一步攻擊,是因為本次交易改變了soVELO中totalSupply的大小和totalCash持有的VELO代幣數量,而totalSupply增長對匯率計算的影響大於totalCash增長的影響。因此,匯率變小,導致攻擊者在進行攻擊時無法多方利用準確性的損失來獲得soVELO,使攻擊無法多方。

“”

資金跟蹤

攻擊者在搶奪非法收益后不久就轉移了資金。大部分資金轉移到以下四個位址。有些是為了改變位址以繼續攻擊,有些是為了洗錢:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

攻擊者將198 WETH轉移到該位址,然後該位址使用相同的攻擊方式在以下交易中獲取非法收益:

“”

襲擊發生后,該位址將上述違法所得轉0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb。

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

攻擊者將724277 USDC和2353 VELO轉移到該位址,並將USDC換成以太。然後一些資金立即轉移到星際之門跨鏈 橋接。大多數非法資金仍保留在此位址:

“”

3、0xbd18100a168321701955e348f03d0df4f517c13b

攻擊者將33 WETH轉移到該位址,並使用剝離鏈試圖洗錢。洗錢環節如下:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

攻擊者將563 WETH轉移到該位址,隨後轉移到0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68,到目前為止沒有進一步的行動。

攻擊者這次的洗錢手段比較專業,手段呈現出多樣化的趨勢。因此,對於我們 Web3 參與者來說,我們必須在安全性方面不斷提升我們的反洗錢能力,通過 KYT、反洗錢 等相關區塊鏈交易安全產品來提升 Defi 專案的安全性。

安全建議

1、及時瞭解合同審計和測試。在智慧合約部署前進行全面審計,特別注意涉及財務計算的所有部分。首先,使用自動化測試,利用漏洞庫的即時更新進行高效的合約安全掃描(業界也逐漸開源了一些成熟的安全審計工具,包括ZAN AI SCAN),同時結合人工審計來排查需要深入行業知識的問題。

2、精度的損失需要認真對待。精度損失帶來的安全問題層出不窮,尤其是在 Defi 專案中,精度損失往往會導致嚴重的經濟損失。建議專案方和安全審核員仔細審查專案中存在準確性損失的代碼,並進行測試以盡可能避免此漏洞。

  1. 建議在 Compound 中創建類似於 cToken 的市場和第一次抵押鑄造操作由特權用戶執行,以避免被攻擊者操縱從而操縱交易所利率。

  2. 當合約中存在依賴於“this.balance”或“token.balanceOf()”值的關鍵變數時,需要仔細考慮鍵變數變更的條件,比如是否允許將本國貨幣或代幣直接轉移到合約中。更改變數值的方法,或者只能通過調用特定函數來更改變數的值。

免責聲明:

  1. 本文轉載自 [ZAN]。所有版權歸原作者所有[ZAN]。如果對此轉載有異議,請聯繫Gate Learn團隊,他們會及時處理。
  2. 免責聲明:本文中表達的觀點和意見僅代表作者的觀點和意見,不構成任何投資建議。
  3. 文章到其他語言的翻譯由Gate Learn團隊完成。除非另有說明,否則禁止複製、分發或抄襲翻譯后的文章。
即刻開始交易
註冊並交易即可獲得
$100
和價值
$5500
理財體驗金獎勵!