Pickle Finance遭攻击损失近2000万美元DAI,未经严格审计的DeFi路在何方?
這一周,“科學(xué)家”們(利用技術(shù)實(shí)力和知識(shí)門檻專薅 DeFi 的羊毛的黑客)很忙。
11月14日,黑客攻擊 Value DeFi 的 MultiStablesVault 池子,獲得近 740?萬(wàn)美金的 DAI;11月17日,黑客攻擊Origin Protocol 憑空鑄造 2050萬(wàn) 枚OUSD。
今天凌晨 2 時(shí) 37 分,當(dāng)人們還在熟睡之時(shí),黑客攻擊 DeFi 協(xié)議 Pickle Finance(酸黃瓜),撈得近 2000 萬(wàn)美元的 DAI。
加密貨幣再次登上央視?DeFi淪為“科學(xué)家”的提款機(jī)?
11月18日,比特幣沖擊 18,000 美元,加密貨幣再次登上央視,此前,加密貨幣被譽(yù)為去中心化的金融工具首次登上央視。
據(jù)央視報(bào)道,從投資回報(bào)率的角度來(lái)看,加密貨幣是今年真正的“頭號(hào)”投資產(chǎn)品。“彭博銀河加密貨幣指數(shù)”上漲約65%,超過(guò)金價(jià)逾20%的漲幅,也超過(guò)全球股市、債市和大宗商品市場(chǎng)的收益率。漲幅較高的一個(gè)關(guān)鍵原因是以太坊幣價(jià)暴漲,漲幅達(dá)到169.40%。
央視解釋道:“以太坊幣價(jià)格攀升得益于去中心化金融工具(DeFi)的使用增加,以及疫情肆虐后各國(guó)出臺(tái)的巨額刺激措施,讓投資者選擇了比特幣、以太坊等加密貨幣進(jìn)行保值。”
一方面,加密貨幣市場(chǎng)頻頻發(fā)出利好消息;另一方面,DeFi 項(xiàng)目因未經(jīng)嚴(yán)格審計(jì)頻遭攻擊。
據(jù)悉,今年 9 月 10?日 酸黃瓜 Pickle Finance 啟動(dòng)流動(dòng)性挖礦,9 月 14 日 V神發(fā)推文贊賞該項(xiàng)目,使其代幣價(jià)格暴漲 10 倍。而遭到此次攻擊后,酸黃瓜損失近價(jià)值 2000 萬(wàn)的 DAI,同時(shí) 24 小時(shí)內(nèi)其代幣腰斬。
CoinmarketCap 數(shù)據(jù)顯示, Pickle Finance 代幣(Pickle)的價(jià)格在24小時(shí)內(nèi),從 22.7 美元跌到 10.2 美元,它的市值在未銷毀的情況下, 24小時(shí)內(nèi)蒸發(fā)了 1220 萬(wàn)美元。
發(fā)生了什么?
PeckShield 通過(guò)追蹤和分析發(fā)現(xiàn),攻擊者通過(guò)StrategyCmpdDaiV2.getSuppliedUnleveraged() 函數(shù)查詢資產(chǎn)余額 1972萬(wàn) 美元;
隨后,攻擊者利用輸入驗(yàn)證漏洞將 StrategyCmpdDaiV2 中的所有 DAI 提取到 Pickle Jar:這個(gè)漏洞位于 ControllerV4.swapExactJarForJar() 函數(shù)中,其中包含兩個(gè)既定的偽 Jar。在未驗(yàn)證既定 Jar 的情況下,此步驟會(huì)將存入的所有 DAI 提取到 Pickle Jar,并進(jìn)行下一輪部署。
接下來(lái),攻擊者調(diào)用 earn()?函數(shù)將提取的 DAI 部署到 StrategyCmpdDaiV2 中。在內(nèi)部緩沖區(qū)管理中,黑客調(diào)用了三次 earn() 函數(shù),在 StrategyCmpdDaiV2 中生成共計(jì) 950,818,864.8211968 枚 cDAI;
第一次調(diào)用 earn() 函數(shù)存入 1976萬(wàn) 枚DAI,鑄造 903,390,845.43581639 枚 cDAI;
第二次調(diào)用 earn() 函數(shù)存入 98.8萬(wàn) 枚DAI,鑄造 45,169,542.27179081 枚 cDAI;
第3次調(diào)用 earn() 函數(shù)存入4.9萬(wàn) 枚DAI,鑄造 2,258,477.11358954 枚cDAI;
隨后,攻擊者調(diào)用?ControllerV4.swapExactJarForJar()?函數(shù),利用任意代碼執(zhí)行將?StrategyCmpdDaiV2?中的所有?cDAI?提取出來(lái),這一步中,_execute()?函數(shù)有兩個(gè)參數(shù):_target和?_data,_target?指的是目標(biāo)地址,即圖中橘色所示部分;_target?是一個(gè)加白的地址,攻擊者沒(méi)辦法任意控制此地址,此處他們利用的是?CurveProxyLogic,該加白的合約(能通過(guò)?262?行?approvedJarConverter[_targets[i]?的檢查。也就是說(shuō),能被完全控制的是參數(shù)? _data,即圖中紫色所示部分,_data?中包含?_execute()?函數(shù)可調(diào)用的add_liquidity()?函數(shù),以及傳給?add_liquidity()?的所有參數(shù)。
此時(shí),咱們回到橘色框里的 curve、curveFunctionSig、curvePoolSize、curveUnderlyingIndex、underlying,其中 curve 是一個(gè)地址,它表示橘色框里倒數(shù)第二行中的 curve.call()?函數(shù)可以執(zhí)行任意一個(gè)合約,因此,攻擊者把 curve 設(shè)置成 StrategyCmpdDaiV2,curveFunctionSig 表示除了剛剛指定合約外,還可以指定要調(diào)用此合約的函數(shù),通過(guò)此操作攻擊者成功調(diào)用 StrategyCmpdDaiV2.withdraw()?函數(shù)。
接下來(lái)就是組織藍(lán)色框中的函數(shù) StrategyCmpdDaiV2.withdraw()?的參數(shù)?_asset,藍(lán)色框中的?_asset 實(shí)際上是橘色框框里的 liquidity,liquidity 由傳入函數(shù) add_liquidity()?的 underlying 得來(lái),underlying 是另一個(gè)偽造的合約地址,它的 balanceOf()?函數(shù)會(huì)返回 cDAI 的地址。攻擊者將 cDAI 的地址設(shè)置成 liquidity[0]?(此處的?0?也是 add_liquidity()?函數(shù)的參數(shù) curveUnderlyingIndex),然后,liquidity 被打包到 callData 里再傳給 withdraw()?函數(shù),使得 withdraw()?函數(shù)取出的?_asset 就是 cDAI 的地址。值得注意的是,如果 want == _asset ,藍(lán)色框里的函數(shù)就不執(zhí)行,此設(shè)計(jì)的目的在于 want (也就是 DAI)是不允許被取出的,所以攻擊者刻意取出對(duì)應(yīng)的 cDAI。
最后,執(zhí)行回 ControllerV4.swapExactJarForJar() 函數(shù), 所提取的cDAI 被存入惡意的?_toJar . 在 _toJar.deposit() 函數(shù)里, 所有 950,818,864.8211968 枚 cDAI 立即轉(zhuǎn)入黑客地址。
未經(jīng)嚴(yán)格審計(jì)的DeFi能走多遠(yuǎn)?
針對(duì)此次 Pickle Finance(酸黃瓜)被攻擊事件,其審計(jì)公司 Haechi 發(fā)推文稱,今年 10 月對(duì)其代碼進(jìn)行了一次審計(jì),但是攻擊者利用的漏洞發(fā)生在新創(chuàng)建的智能合約中,而不是接受安全審計(jì)的智能合約中。與此次漏洞攻擊相關(guān)的代碼存在于 controller-v4.sol 中的 swapExactJarForJar,而非此前審計(jì)的 controller-v3.sol 中,該智能合約不包含 swapExactJarForJar。
對(duì)此,PeckShield 相關(guān)負(fù)責(zé)人表示:“有一些 DeFi 項(xiàng)目在做過(guò)第一次智能合約安全審計(jì)后,可能會(huì)為了快速上線主網(wǎng),省略審計(jì)新增的智能合約,這種省略或能爭(zhēng)取短時(shí)的利益,但就像此次攻擊一樣最終因小失大。DeFi 們?cè)谏暇€之前一定要確保代碼進(jìn)行徹底地審計(jì)和研究,防范各種可能發(fā)生的風(fēng)險(xiǎn)。”
未經(jīng)嚴(yán)格審計(jì)即上線的 DeFi 項(xiàng)目能走多遠(yuǎn)?
總結(jié)
以上是生活随笔為你收集整理的Pickle Finance遭攻击损失近2000万美元DAI,未经严格审计的DeFi路在何方?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ICC2:限制LVT比例
- 下一篇: HTML在黑色框中加白色文字,文字一部分