Sonne Finance攻擊分析

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

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攻擊分析

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

攻擊簡介

攻擊中涉及的關鍵位址

攻擊過程分析

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
理財體驗金獎勵!
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.