昨天晚間19時50分,DeFi 協議 Akropolis 遭到了黑客攻擊,
區塊鏈安全公司 PeckShield(派盾)安全人員迅速定位到問題在于,Akropolis 專案的 SavingsModule 合約在處理用戶存盤資產時存在某種缺陷,黑客利用此缺陷連續實施了17次重入攻擊,導致其 YCurve 和 sUSD 資金池損失了203萬枚 DAI,
技術概要:
本次攻擊的原因如下:
1)合約沒有對用戶存盤的 Token 進行白名單校驗
2)關鍵的 deposit 函式沒有對重入攻擊的保護
簡單而言:黑客利用 Akropolis 專案存在的存盤資產校驗缺陷,向合約發起連續多次的重入攻擊,致使 Akropolis 合約在沒有新資產注入的情況下,憑空增發了大量的 pooltokens,進而再利用這些 pooltokens 從 YCurve 和 sUSD 池子中提取 DAI,最終導致專案合約損失了203萬枚 DAI,
攻擊程序詳解:
攻擊流程復現:
我們通過分析黑客實施攻擊的交易哈希(0xe1f375a47172b5612d96496a4599247049f07c9a7d518929fbe296b0c281e04d)發現,攻擊來自于一個惡意的 ERC20 合約地址(0xe2307837524Db8961C4541f943598654240bd62f)
這個惡意合約實作了一個鉤子函式,使得函式在 transferFrom() (function signature: 0x23b872dd)被呼叫的時候會被執行,
攻擊者先是呼叫 SavingsModule.sol (https://github.com/akropolisio/delphi/blob/release-1.0/contracts/modules/savings/SavingsModule.sol#L217-L277) 中的 deposit() 函式,并將自己撰寫的位于 0xe230 開頭的惡意合約作為要存盤的代幣地址傳入,當其惡意代幣的 transferFrom() 函式被呼叫時,其鉤子函式會再次呼叫 deposit() 函式并存入真實的 DAI 資產,
由于 pooltokens 增發的量通過代幣 deposit 前后余額的差值得出,所以第二次 deposit 的真實的 DAI 資產會被計算兩次用于鑄造 pooltokens,第一次是在惡意合約 0xe230 存盤的時候,第二次是在 DAI 存盤的時候,也就是說,如果第二次存盤的時候存入了 25K DAI, 那么由于重入攻擊,總的鑄造的 pooltokens 將會是雙倍,也就是 50K DAI ,
以此類推,黑客總共發起 17次重入攻擊并獲得了總共 2,030,841.0177個DAI 資產,
值得注意的是,在攻擊的最開始,攻擊者還使用了 dYdX 的閃貸功能(https://etherscan.io/tx/0xddf8c15880a20efa0f3964207d345ff71fbb9400032b5d33b9346876bd131dc2),
核心漏洞詳解:
接下來,我們分析下存在漏洞的代幣存盤邏輯,Akropolis 的用戶可以將代幣存盤入Delphi Savings Pools,而資金池會鑄造相應的 pooltokens 給用戶,核心邏輯在SavingsModule::deposit()(1,944行),
第一步:攻擊者呼叫 deposit() 函式并提供 _tokens 引數,這個函式在進一步呼叫 depositToProtocol(_protocol, _tokens, _dnAmounts) 前后會計算代幣的余額,并通過代幣余額的變化來決定將要鑄造的 poolTokens 數目(第1,970行),而 depositToProtocol() 函式會呼叫目標代幣的 safeTransferFrom()函式來進行代幣的轉賬(第2,004行),然而 deposit() 函式沒有對重入攻擊進行檢測,也沒有檢查存入的代幣是否為惡意代幣;
第二步:在惡意代幣的 transferFrom() 函式被呼叫的時候,觸發鉤子函式,從而再次呼叫 deposit() 函式;
第三步:因為第二次呼叫 deposit() 函式的時候攻擊者存入了真正的 DAI 代幣使得池子的代幣余額發生變化,所以攻擊者可以獲得資金池鑄造的 poolTokens;
第四步:當第二次 deposit() 函式呼叫結束的時候,代碼執行流程將回傳第一次存盤代幣呼叫 depositToProtocol() 函式的背景關系,這個時候,代幣余額變化將被再次計算,此時代幣余額的變化和第二次呼叫 deposit() 函式代幣余額變化一樣,因此攻擊者可以再次獲得相應數目的 poolTokens,
被盜資產情況:
這次攻擊的被盜資產目前被存盤在錢包[0x9f26](https://etherscan.io/address/0x9f26ae5cd245bfeeb5926d61497550f79d9c6c1c)中,PeckShield 旗下數字資產追蹤平臺 CoinHolmes 正在對該地址做全方位監控,并對其資金流向做進一步的鎖定分析和追蹤,以便協助專案方挽回被盜資產,為業內領先的區塊鏈安
推薦閱讀:
PeckShield:硬核技術決議,bZx協議遭黑客漏洞攻擊始末
PeckShield:DeFi平臺Opyn智能合約漏洞詳解——攻擊者空手套白狼!
PeckShield:DeFi平臺Balancer遭黑客攻擊全程序技術拆解
PeckShield:bZx協議再遭黑客“二連擊”背后的技術命門
0x協議漏洞原理剖析:惡意掛單可擾亂正常交易秩序
Uniswap和Lendf.Me遭攻擊始末:DeFi樂高組合下的“多米諾”式崩塌
AirSwap智能合約漏洞詳解:用戶資產可被攻擊者惡意吃單?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218637.html
標籤:其他
下一篇:單向哈希函式與MAC實驗
