比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > Bitcoin > Info

以假亂真:DODO V2 眾籌池遭襲事件分析_USDT

Author:

Time:1900/1/1 0:00:00

北京時間2021年3月9日凌晨,以太坊(Ethereum)去中心化交易平臺 DODO 的 多個 V2 眾籌池遭到攻擊,攻擊者利用眾籌池的合約漏洞,用自己創建的 token 套出了池內的 token,上演了一出貍貓換太子的把戲。只不過,從之后的分析來看,事情的發展顯然偏離了攻擊者的預期軌道......

接下來,就讓大家跟我一起來看看攻擊者到底做了什么,而當時又到底發生了什么。為了便于后文的講述,就管這次的攻擊者(Attacker)叫做小A吧。

“攻擊成功了嗎?成功了,但沒完全成功。” 這可能就是小A當時的心理寫照

No code, no bug

有代碼的地方,就可能有漏洞。智能合約雖然被人們冠以“智能”二字,但歸根到底也是一段段的代碼,因而也總被別有用心的人揪住它的漏洞搞一波錢實現財富自由。我們這次故事中的智能合約,就是 DODO 的 V2 眾籌池合約。而我們的主角小A,就是那個發現了該合約漏洞并試圖趁機搞錢的人。

概念簡析

提了這么多次 DODO V2 眾籌池,那它到底是個啥玩意兒?簡單來說呢,它就是個資金池,只不過本文中的資金所指代的并非我們日常接觸到的法幣,而是以太坊上的代幣(ERC20 token)。這種資金池在初始化的時候會設定兩種鏈上有價值的 ERC20 token 作為這個池子的 token pair(記住這個點,之后要考的 ),然后用戶可以正常使用這些池子提供的服務。在這次小A針對 DODO V2 眾籌池的攻擊中,就是利用了該池子提供的閃電貸(flashloan)服務。

閃電貸相比于普通借貸,具有無需抵押即可借貸大量資金,加之還不上錢就狀態回滾的特點。簡單來說就是可以空手套白狼,要是最后借出的錢自己一通操作之后虧了還不上也不打緊,所有相關狀態會回滾到借貸之前,而對于借貸者來說唯一的損失除了手續費之外,可能就只有時間了。使用閃電貸的邏輯也很簡單,就是用戶從資金池借錢-->對借來的錢進行操作-->還錢,而這些需要在一筆交易中完成。

Ok,簡單了解完相關的概念之后,咱接著看小A的操作。

小A的騷操作

小A接下來做了兩件事兒。

第一件事兒就是創建了兩個 ERC20 token 的合約,說白了就是造了倆假幣 ( 因為沒價值 ),分別叫做 FDO 和 FUSDT. 創建完這倆假幣之后呢小A就把它們存入到之后將被攻擊的 DODO 池子里了。

小A做的第二件事兒就是使用了 DODO V2 眾籌池的閃電貸服務。上文提到閃電貸使用邏輯中的一環就是對借來的錢進行操作,而本文的主角小A就是在這一環節上玩兒出了花樣。

小A發現這個 DODO V2 眾籌池是可以被重新人為初始化的,而且沒什么限制。接著小A就在借出錢之后把這個池子重新初始化了,并且初始化時設定的 token pair 變成了小A自己造的倆假幣 FDO/FUSDT (這就是之前提到的考點,現在考到了吧 )。并且小A在借錢之前已經通過上文他做的第一件事兒把足量的兩種假幣都預先存入到了這個池子里,這就導致池子在檢查小A欠錢情況的時候,所檢查的token不再是之前的真幣,而是小A存入其中的假幣,加之數額也足夠。這樣一來小A就用假幣套出了真幣。

美聯儲FOMC聲明:進一步收緊政策可能是合適的:金色財經報道,美聯儲FOMC發表聲明,表示進一步收緊政策可能是合適的,最近的發展將導致信貸環境趨緊。將考慮累積政策收緊和滯后性的影響,目前通脹仍然高企。[2023/3/23 13:20:20]

咱們可以對上述過程打個簡單的比方,細節按下不表。就是有一家銀行,這個銀行就可以類比上文提到的資金池。同時該銀行也有一個小本本拿來記賬,只不過在小本本的首頁有一條記錄[本行只處理人民幣,儲備量100]。至于其他的幣種,美元也好,越南盾也好。用戶也可以往里面存,但銀行不管你,它的小本本上雖然也會記賬,但核對時它只看涉及到人民幣的記錄。

為了類比眾籌池可以被重新初始化的問題,可以這么理解。就是這個小本本有個問題,問題出在首頁的這句[本行只處理人民幣]的規定是用鉛筆寫的,并且這個小本本就放在窗口,外人拿個橡皮擦+鉛筆就能改。然后這個問題被小A發現了,他先往這個銀行存了100越南盾,銀行會記賬[小A往本行存入100越南盾]。然后小A又去銀行借出100人民幣,銀行又記賬[小A從本行借出100人民幣]。注意銀行會檢查所有用戶對人民幣的借存情況并和儲備量比對,從而確認是否有用戶借了人民幣但沒還。

剛借完錢,小A就雞賊地掏出準備好的鉛筆+橡皮將小本本首頁的規定改為了[本行只處理越南盾,儲備量100]。然后銀行核對金額的時候,因為規定改為了只處理越南盾,而查驗的時候發現越南盾的儲備量和小A存入的越南盾數額是一樣的,說明沒人欠銀行錢。然后小A拿著借出來的人民幣瀟灑離去,不再回頭。

小A針對 DODO V2 眾籌池的攻擊思路就如上文所述,小A接下來要做的就是把想法付諸實際行動。本文從合約代碼層面要分析的攻擊也就是上述提到的攻擊,然而咱的故事還沒完。不想接著看故事的看官可以直接下滑到 0x2 的攻擊分析部分,剩下的看官,就請容我接著給您講故事。

攻擊過程:山路十八彎

第一回. 螳螂捕蟬黃雀在后

咱書接上文。

項目方也就是DODO采用相同的邏輯創建了多個池子,而這些池子都有同樣的漏洞。小A第一次瞄準的池子是 (WSZO/USDT) 池,WSZO 和 USDT 就是兩種有價值的代幣( ERC20 token)。他美滋滋的把自己的攻擊邏輯寫入一筆交易之后,就準備躺著收錢,可就在這時,出岔子了。

咱知道,以太坊上的交易存在交易費,這筆費用是用戶支付給礦工的。所以礦工為了自身利益最大化,當他們從pengding池打包交易準備上鏈時會查看各條交易的交易費并排個序,交易費高的優先上鏈。而由于以太坊的去中心化機制,黑暗森林法則在這也同樣適用。DeFi(去中心化金融) 項目的攻擊者們潛伏在世界各地,一旦發現目標,就會一擁而上,至于最后誰能成功,除了技術等因素,就得看誰出的交易費高了。

回到主角小A,他發現了漏洞準備趁機搞一波錢,可小A的舉動被另一個角色--搶跑機器人--發現了,咱稱這個搶跑者為小B吧。小B就在交易費上做了文章,他把交易的油費(gas price) 提高了,從而增加了這筆交易的交易費。這就使得礦工在打包交易的時候優先打包了小B的交易。一般把小B的這種操作叫做搶跑交易 (front running)。等輪到打包小A交易的時候,WSZO/USDT 池子里的WSZO和USDT已經空空如也,只剩下一堆沒啥價值的 (FDO/FUSDT)。

數據:本周解鎖金額超1000萬美元的代幣有AXS、RON和IMX:金色財經報道,Token Unlocks數據顯示,本周將有AXS、ACA、GAL、RON、YGG、IMX代幣解鎖。其中,AXS代幣1月23日21:10解鎖約489萬枚(約合6318 萬美元),占總供應量的1.812%;RON代幣將于1月27日08:00解鎖約 4293 萬枚(約合 2425 萬美元),約占總供應量的4.293%;IMX代幣將于1月28日18:00解鎖約1807萬枚(約合1217萬美元),約占總供應量的0.904%。[2023/1/23 11:27:01]

小A可能以為這一次的失敗只是一次普通的搶跑交易,于是他又故技重施。只不過這次的目標換成了 (ETHA/USDT) 池,而且為了防止被搶跑,在這一次的交易中小A提高了交易的油費。可小A不知道的是,他已經被小B盯上了。

同樣的套路,同樣的手法,小A又一次被小B搶跑了交易。

第二回. 半路殺出個程咬金

到目前為止,小A兩次攻擊都是給小B做了嫁衣,甚至自己還虧了交易費!小A那個氣啊,于是痛定思痛,把目標瞄向了下一個池子(wCRES/USDT)。并且這一次小A成功的繞過了小B的監控。事情發展到現在似乎小A就要成功了,可現實就是喜歡和小A開玩笑。

第三次攻擊雖然繞過了小B,但小A把錢成功取出來之后并沒有直接轉移到自己的地址,而是創建了一個新合約來接收這筆錢。小A的想法是先把錢暫存在這個新合約內,之后再轉移到自己的賬戶中。然而,小A的這個用來暫存贓款的合約又有個漏洞,就是任何人都能從這個合約中取出(withdraw)合約內的資金。

However, this contract had a loophole that allowed anyone to withdraw assets from it.

而恰巧這個漏洞,被另一個角色 (小C) 發現了。于是,在小A發出一筆交易準備從這個合約中取回贓款的時候,又雙叒被搶跑了,這不過這一次搶跑者變成了小C。

看到這,小A既是攻擊者,又是搶跑交易的受害者。這波啊,小A算是偷雞不成蝕把米。

第三回. 倔強的小A

前文提到,具有同樣邏輯漏洞的池子有多個。小A又雙叒叕準備發起他的第四次攻擊了,這一次,目標換成了 (DODO/USDT) 池。這一次小A學聰明了,一方面他將暫存贓款的合約替換為了新合約,另一方面小A也將代幣轉移的過程合并在了一筆交易中,以免出現像第三次攻擊中被小C搶跑的情況。而這一次,不撞南墻不回頭的小A終于成功用假幣 (FDO/FUSDT) 搞到了真錢 (DODO/USDT)。

安全團隊:SuperNormal項目Discord服務器遭到攻擊:金色財經報道,據CertiK監測,SuperNormal項目Discord服務器遭到攻擊。請社區用戶不要點擊該Discord服務器發送的任何鏈接。[2022/12/8 21:31:08]

第四回. 瘋起來連自己都咬

四次攻擊終獲成功之后小A滿足了嗎?事實告訴我們答案是否定的。

不知道小A是怎么想的,可能是歷經曲折終于成功讓其興奮過頭。這第五次攻擊,他的目標瞄向了 (wCRES/USDT) 池。是不是有點眼熟?沒錯!這個池子正是小A在第三次攻擊中的目標池子。而經過第三次攻擊的洗劫之后,這個池子已經從(wCRES/USDT)池變為了(FDO/FUSDT)池,即真幣池成了假幣池。因而在這一輪攻擊中,小A用同樣的攻擊套路得到的結果無非就是拿著新假幣去換舊假幣......

而這倆假幣還都是小A自己造的。可能,小A還是個懷舊的人吧......

咱們關于小A的故事,也走向了尾聲。或許以太坊對于攻擊者而言就是一片黑暗森林,獵手與獵物的身份在這個特殊的競技場也并非一成不變。終要記得,當你在凝視深淵的時候,深淵也在凝視著你。

ok,接下來就是正兒八經的攻擊分析環節了。

準備好了嗎?坐穩扶好,發車了。

為便于理解,下文將以第三次攻擊為例子來進行分析,涉及到的池子為(wCRES/USDT)池

代碼分析

以下提到的函數都來源于資金池(wCRES/USDT)的合約代碼,并且在本次攻擊事件中均被涉及。

getVaultReserve 函數

首先來看getVaultReserve函數,這個函數的功能很簡單,就是當用戶調用它的時候會返回當前池子里token pair的儲量。

flashloan 函數

上圖就是本次攻擊中資金池合約的flashloan函數。可以看到當用戶調用這個函數時,會先根據用戶傳入的baseAmount 和 quoteAmount 這兩個參數將相應數量的token 轉入參數assetTo 所代表的地址。到此,就算是完成了閃電貸(flashloan)的借錢環節。順著代碼往下看,只要data不為空,就會觸發外部邏輯。而這個外部邏輯,就是調用者自己實現的,本次攻擊的實現,也正是在這個外部邏輯執行時做了手腳。

init 函數

Aave:只認以太坊 PoS 鏈為主鏈,用戶在其他分叉鏈上使用Aave后果自負:金色財經消息,Aave 社區發文分析以太坊的 PoS 合并與Aave技術適應,分析為何以太坊合并不干擾到 Aave 的正常系統運作。從技術/運營角度來看,Aave只在鏈上治理機制的持續時間和Aave用戶界面上受到輕微影響。由于缺少預言機以及相關流動性問題,Aave 也無法正常運行在任何 PoW 鏈上,Aave 只認 PoS 鏈為主鏈,如果任何用戶決定在任何分叉上直接與 Aave 智能合約交互,應由他們自己負責。[2022/8/9 12:10:53]

上圖就是本次攻擊中最為關鍵的初始化函數init. 可以注意到該函數是外部調用的,而且最關鍵的是,這個函數有以下兩個特點:

[沒有權限要求]這就意味著任何人都可以從外部調用這個函數。

[可被重復調用]則意味著這個init函數除了在該池子建池時被必要的調用一次后,仍然可以在任何時候被調用來重新初始化這個池子。

調用者調用這個函數時,所傳入的兩個參數baseTokenAddress 和 quoteTokenAddress 會被用來給變量_BASE_TOKEN_ 和 _QUOTE_TOKEN_ 分別的重新賦值。而這兩個變量的改變就意味著這個池子的 token pair 也會發生改變。而這,便是 wCRES/USDT 池變 FDO/FUSDT 的原因。

攻擊過程

攻擊交易的流程如下圖所示

交易流分析可以使用我們團隊的交易分析工具:https://tx.blocksecteam.com/

Step 0

攻擊者首先創建了兩個 ERC20 代幣的合約 (FDO 和 FUSDT),可以簡單理解為造了倆假幣(沒價值)。并向自己的地址(0x368a6)分別轉入了大量的這兩種 token,為之后的攻擊做鋪墊。

Step 1

攻擊者調用資金池合約的 getVaultReserve 函數,獲取到 wCRES 和 USDT 當前在池子里的儲量,為下一步攻擊做準備。

Step 2

慢霧:Moonbirds的Nesting Contract相關漏洞在特定場景下才能產生危害:據慢霧區情報反饋,Moonbirds 發布安全公告,Nesting Contract 存在安全問題。當用戶在 OpenSea 或者 LooksRare等NFT交易市場進行掛單售賣時。賣家不能僅通過執行 nesting(筑巢) 來禁止NFT售賣,而是要在交易市場中下架相關的 NFT 售賣訂單。否則在某個特定場景下買家將會繞過 Moonbirds 在nesting(筑巢)時不能交易的限制。慢霧安全團隊經過研究發現該漏洞需要在特定場景才能產生危害屬于低風險。建議 Moonbirds 用戶自行排查已 nesting(筑巢)的 NFT 是否還在 NTF 市場中上架,如果已上架要及時進行下架。更多的漏洞細節請等待 Moonbirds 官方的披露。[2022/5/30 3:50:23]

攻擊者根據 Step 1 得到的儲量,分別調用兩個假幣合約的 transferFrom 函數給資金池合約(DLP) 轉入略多于該儲量的假幣 (FDO 和 FUSDT),從而保證能通過flashloan函數的余額檢查。

Step 3

攻擊者接著調用資金池合約(DLP)的 flashloan 函數,借出了略少于資金池儲量的真幣(wCRES 和 USDT)。

Step 4

flashloan 函數在將 wCRES 和 USDT 轉入到攻擊者預先設置好的合約地址之后,會自動調用攻擊者的外部邏輯。而攻擊者就是在外部邏輯的實現中調用了 wCRES/USDT 這個池子的初始化函數 init ,將該池子的 token pair 替換為了 FDO/FUSDT。

Step 5

如下圖,flashloan 函數在執行完外部邏輯之后,會對當前池子的代幣(token) 余額進行檢查。但需要注意的是,由于池子的 token pair 被替換為了 FDO/FUSDT,所以baseBalance  和 quoteBalance 的所代表的余額也是 FDO 和 FUSDT 的余額。

同時,由于攻擊者在 Step 2 的時候已經往池子中存入了足量的 FDO 和 FUSDT,所以此時baseBalance  和 quoteBalance 的值足夠大,繞過了兩個if判斷,直接進入了最后的同步函數_sync。至此, 攻擊者成功通過了 flashloan 的余額檢查,實現了以假亂真。

本次攻擊之所以發生,最主要的問題出在 DODO V2 眾籌池的 init 函數上。查看該函數的調用情況可以發現,正常的邏輯應該是該函數只能在剛建池的時候被調用一次,之后就應該設置訪問權限,同時也不能被重復調用。攻擊者就是利用了init函數可以被重復調用來重新初始化池子的這一漏洞,結合閃電貸將池子中的真幣用假幣套取了出來,從而完成了攻擊。

因此,我們給相關項目方的建議有:

對項目合約的關鍵功能做好權限審核工作,以免核心函數由于權限要求過低被濫用引發不可預料的后果從而造成損失。

提高項目代碼審計意識,項目上線前需咨詢相關的區塊鏈安全公司進行充分的安全審計,最大程度的保證項目安全。

參考

慢霧:貍貓換太子 —— DODO 被黑分析

DODO Pool Incident Postmortem: With a Little Help from Our Friends

https://medium.com/dodoex/dodo-pool-incident-postmortem-with-a-little-help-from-our-friends-327e66872d42

Important update regarding recent events on DODO

https://dodoexhelp.zendesk.com/hc/en-us/articles/900004851126-Important-update-regarding-recent-events-on-DODO

DODO - REKT

https://www.rekt.news/au-dodo-rekt/

附錄

文中涉及的外部地址和合約地址

攻擊者A

https://etherscan.io/address/0x368a6558255bccac517da5106647d8182c571b23

搶跑者B

https://etherscan.io/address/0x3554187576ec863af63eea81d25fbf6d3f3f13fc

搶跑者C

https://etherscan.io/address/0x8a14ce0fecbefdcc612f340be3324655718ce1c1

資金池DLP (WSZO/USDT)

https://etherscan.io/address/0xfb609b68d694617e0100c7182f21e536760d438d#code

資金池DLP (ETHA/USDT)

https://etherscan.io/address/0xfd87ab87f384458a8f6f4b3c3eb222a223869f73#code

資金池DLP (wCRES/USDT)

https://etherscan.io/address/0x051ebd717311350f1684f89335bed4abd083a2b6#code

資金池DLP (DODO/USDT)

https://etherscan.io/address/0x509ef8c68e7d246aab686b6d9929998282a941fb#code

文中涉及的交易

第一次攻擊

A 的攻擊交易 (fail)

https://etherscan.io/tx/0x4bc4ace313f2f5a411a5a560255ba0bba4f4913edb55ed882feaee84a3b1292e

B 對 A 的 搶跑交易

https://etherscan.io/tx/0xff9b3b2cb09d149762fcffc56ef71362bec1ef6a7d68727155c2d68f395ac1e8

第二次攻擊

https://etherscan.io/tx/0x0430d5a2dcfb0f9530fe1699e0e86a9526825da5e2072a15c4be734710f56cdb

https://etherscan.io/tx/0x0b062361e16a2ea0942cc1b4462b6584208c8c864609ff73aaa640aaa2d92428

第三次攻擊

A 的攻擊交易

https://etherscan.io/tx/0x395675b56370a9f5fe8b32badfa80043f5291443bd6c8273900476880fb5221e

C的搶跑交易 (搶跑了A對代幣USDT的轉移)

https://etherscan.io/tx/0x75d4765dd704d82f0bf539da88aff2568da38697f153b14d285abc8749da683f

A 被 C 搶跑的代幣 (USDT) 轉移交易

https://etherscan.io/tx/0x14084fba94df75cf8ebfbb62188aa06a29ec0e38181f73eab7b79eba750e4840

C的搶跑交易 (搶跑了A對代幣wCRES的轉移)

https://etherscan.io/tx/0xa8d030494607e16b06dd0c7e97da2b78ebc5a072a8176b19ca57f17044c1a211)

A 被 C 搶跑的代幣 (wCRES) 轉移交易

https://etherscan.io/tx/0x021a2bd6ea7b502290be4c67be33be33c5b5582676d1c00ab59f1ed53a1b576b

第四次攻擊

https://etherscan.io/tx/0xc79dbe0aa48e0ba9f72bd74240cf50b653196ff00979bf367f11f8fa3d9b45ec

第五次攻擊

https://etherscan.io/tx/0xe59fdc5b83deaf29f9f45fd53f6aa54f893fe8504f070bce9995eb535bed4996

Tags:SDTUSDTUSDRESUSDT幣提現微信USDT幣提現5萬涉嫌洗錢嗎usda穩定幣是傳銷嗎BlockXpress

Bitcoin
異構跨鏈公鏈 aelf 主網換幣啟動:邁出多鏈生態建設第一步_ELF

撰文:Zoe Zhang2021 年 9 月 9 日, 區塊鏈開放網絡 aelf 宣布品牌升級:由單一的底層公鏈拓展升級為一個擁有包括 aelf 公鏈、aelf 預言機及各類 DeFi 協議在內.

1900/1/1 0:00:00
ZED RUN:NFT賽馬游戲_RUN

區塊鏈游戲原本就要即將消逝遠去,神奇的區塊鏈世界總有無數的熱情感染這個世界。Axie Infinity、SAND、YGG等重要代表游戲不僅僅重新點燃了區塊鏈游戲的熱情,還帶動了NFT板塊.

1900/1/1 0:00:00
5 分鐘了解參與 Polkadot 平行鏈插槽拍賣的頂級項目_DOT

Polkadot 是以交互性為側重點的網絡,旨在打造下一代的互聯網體系, Polkadot 將于接下來的幾個月內不斷進行平行鏈插槽拍賣.

1900/1/1 0:00:00
麥芽Malt:在公平性和資本效率上展示了可能性的算法穩定幣_Aptos

去年涌現了一系列的算法穩定幣,他們要么與某個名義價值掛鉤(比如與1美元掛鉤的ESD、FEI),要么不與名義價值掛鉤但相對穩定(比如RAI和OHM).

1900/1/1 0:00:00
了解Polygon新產品Avail 一種可擴展數據可用性層_區塊鏈

我們非常高興地宣布 Avail——未來區塊鏈如何運作的全新方式的重要組成部分。 Avail 是一個通用的、可擴展的、以數據可用性為中心的區塊鏈,適用于獨立鏈、側鏈和鏈外擴展解決方案.

1900/1/1 0:00:00
聽說存文件可以賺獎勵 怎么操作哇?_Crust

最近最閃耀的就是波卡生態卡槽拍賣了,其中一匹黑馬就是我們之前寫到的Crust,作為能參與第一批Kusama卡槽拍賣的項目,從最初不被大眾看好到如今吸引了不少CRU Token質押.

1900/1/1 0:00:00
ads