北京時間11月22日凌晨2點37分,CertiK安全研究團隊透過Skynet發現Pickle Finance專案遭到攻擊,共損失約1975萬枚價值近一億三千萬人民幣的DAI。
自9月10日Pickle Finance開始挖礦起,一直沒有什麼存在感。
有了食物大軍的大幅漲跌經驗在前,投資者本身對於異軍突起的Pickle專案保持著一定程度的警惕。
但自從9月14日獲得V神親自站臺,酸黃瓜在洶湧的DeFi浪潮中憑藉其DeFi新玩法及各種背書,可謂是“平地起高樓”,PICKLE瞬間完成了10倍的漲幅。
“剛用5美元的價格把手裡價值1萬美元的PICKLE賣掉,睡了一覺它的價格就變成了60美元???這???”
正當各投資者摩拳擦掌預備好入手這一新型食物代幣或是已經深陷其中,11月23日傳來的訊息卻令投資者們大驚失色。
據Messari資料顯示,自Pickle Finance被駭客攻擊後,其原生代幣PICKLE暴跌50.12%,直至10.17美元,此後稍有回升,截止當前其市值為11.41美元。
下文將為你帶來本次攻擊事件詳情分析。
攻擊始末
整個攻擊流程如下:
第一步:攻擊者透過StrategyCmpdDaiV2.getSuppliedUnleveraged()的函式獲得當前在位於地址0xcd892a97951d46615484359355e3ed88131f829d的StrategyCmpdDAIV2合約中有多少可以被取出的DAI數目,這裡記為Amount_A。
第二步:攻擊者呼叫位於0x6847259b2b3a4c17e7c43c54409810af48ba5210地址處的ControllerV4智慧合約中的swapExactJarForJar()函式,並在呼叫時傳入1號和2號髒jar,Amount_A以及0,[],[]作為引數。
swapExactJarForJar()函式
其中1號髒jar和2號髒jar由於是攻擊者自己部署的,符合IJar介面的智慧合約,因此其中的token()函式的邏輯實現以及其他函式都是由攻擊者自己決定的。
因為Pickle Finance swapExactJarForJar()函式沒有對傳入的jar是否為官方的智慧合約地址進行驗證,因此該步驟得以成立。
swapExactJarForJar()函式中傳入的jar可以定義代幣的型別
呼叫withdrawForSwap()函式
隨著swapExactJarForJar()函式的執行,當執行到上圖289行的位於swapExactJarForJar()函式中的withdrawForSwap()函式時,經過一系列函式呼叫,最終執行位於0xcd892a97951d46615484359355e3ed88131f829d的deleverageToMin()函式以及deleverageUntil()函式,將當前StrategyCmpdDAIV2中可以被取出的代幣(Amount_A)轉移到位於0x6949bb624e8e8a90f87cd2058139fcd77d2f3f87地址的PickleJar智慧合約中。
deleverageToMin()函式以及deleverageUntil()函式
StrategyCmpdDAIV2智慧合約向PickleJar智慧合約轉移代幣的內部交易截圖
PickleJar智慧合約中的earn()函式
第三步:呼叫位於0x6949bb624e8e8a90f87cd2058139fcd77d2f3f87地址的PickleJar智慧合約中的earn()函式(如上圖所示)。
總共呼叫三次,目的是將位於當前PickleJar中的pDAI數目的DAI,從0x6b175474e89094c44da98b954eedeac495271d0f地址轉移到位於0x6847259b2b3a4c17e7c43c54409810af48ba5210地址處的ControllerV4智慧合約中,並在887行透過呼叫ControllerV4合約中的earn()函式(如下圖所示),在下圖152行中透過deposit()函式。
從而實現呼叫0xcd892a97951d46615484359355e3ed88131f829d的StrategyCmpdDAIV2合約中的deposit()函式,將PickleJar中的pDAI數目的cDAI鑄造給StrategyCmpdDAIV2。
ControllerV4智慧合約中的earn()函式
StrategyCmpdDAIV2合約中的deposit()函式
第四步:再次呼叫位於0x6847259b2b3a4c17e7c43c54409810af48ba5210地址處的ControllerV4智慧合約中的swapExactJarForJar()函式,並在呼叫時傳入3號和4號髒jar,以及0,0, CurveProxyLogic智慧合約地址,0x20作為引數。
此處0x20是一個注入引數,目的是為了與CurveProxyLogic智慧合約地址配合,執行位於0x6186e99d9cfb05e1fdf1b442178806e81da21dd8地址的CurveProxyLogic智慧合約中的add_liquiditya()函式。
3號髒jar:
0xa2da08093a083c78c21aeca77d6fc89f3d545aed
4號髒jar:
0xa445e12d69e8bd60290f6935d49ff39ba31c6115
CurveProxyLogic智慧合約地址: 0x6186e99d9cfb05e1fdf1b442178806e81da21dd8
swapExactJarForJar()函式使用CurveProxyLogic智慧合約地址和注入引數來執行指定函式
CurveProxyLogic智慧合約中的add_liquiditya()函式
在此步驟之後,在第三步中儲存在StrategyCmpDAIV2被從StrategyCmpDAIV2智慧合約中轉移到ControllerV4智慧合約處。
至此所有可以被取出的代幣被以cDai的形式儲存在ControllerV4智慧合約中,並且攻擊者擁有取出cDAI的資格。
第五步,攻擊者呼叫位於地址0x5d3a536e4d6dbd6114cc1ead35777bab948e3643的CErc20Delegator智慧合約中的redeemUnderlying()函式,內部呼叫了位於0xbb8be4772faa655c255309afc3c5207aa7b896fd地址處的CErc20中的redeemUnderlying(),redeemUnderlyingInternal()以及redeemFresh()函式。
最終將所有獲得的cDAI轉換成DAI,提出所有DAI並完成攻擊。
CErc20Delegator中的redeemUnderlying()函式
CErc20中的redeemUnderlying()函式
CErc20中redeemUnderlyingInternal()函式
安全建議
多次的DeFi攻擊事件,表明了一個事實:“已審計”並不意味著其擁有了安全保證。
Pickle Finance在10月或更早透過的安全審計,並不代表其新增的智慧合約均得到了實時的安全檢測。
高收益伴隨著高風險,此次漏洞的爆發同樣也是一個警示。