北京時間5月13日,CertiK安全技術團隊發現DeFi質押和流動性策略平臺xToken遭到攻擊,xBNTaBancor池以及xSNXaBalancer池立即被耗盡,造成近2500萬美元損失。
5月還未過去一半的時間,這次的攻擊事件加上5月已發生的其他攻擊事件,竟已有大約8500萬美元被盜了。
攻擊是如何發生的?
CertiK安全團隊在2020年發現的關鍵bug分為三類:邏輯錯誤,閃電貸和專案方欺詐。
本次事件部分可以算的上是一次並非“典型”的閃電貸攻擊。
閃電貸可以在無需提供任何抵押的情況下進行貸款,當然所有操作必須在一個交易區塊內完成。
開發人員可以從Aave或dYdX等協議中借貸,條件是在交易結束之前將流動資金返還到資金池中。
如果資金未能及時返回,則交易將被撤回,從而確保儲備池的安全。
閃電貸具備多種功能和用例,但我們目前看到的多數閃電貸都被用於套利交易。
而惡意使用方式則是攻擊其他一些DeFi協議或操縱價格預言機的價格——這也正是此次xToken發生的情況。
弗蘭克研究員在推特上解釋攻擊是如何發生的
細節分析
針對xSNXa的攻擊
1. 駭客在dYdX上利用閃電貸借出大約61800個ETH。
2. 在Aave上存入10000個ETH借出56.4萬個SNX,然後透過SushiSwap將5500個ETH換成約70萬個SNX。
之後在Uniswap v2上賣出120萬SNX,獲得818ETH,藉此大大降低了SNX的價格。
3. 在價格降低後,攻擊者只用了0.12個ETH就鑄造了12億xSNXa。
這是因為該協議透過Kyber價格預言機購買SNX並鑄造xSNXa,而Kyber價格預言機參照了Uniswap v2的價格。
4. 然而在Balancer協議中,xSNXa的價格還是原來的價格,這使得攻擊者可以將1.05億 xSNX換成414個 ETH。
5. 之後,攻擊者在Uniswap和Sushiswap上用ETH購買SNX來償還Aave上的借貸, 將現有的xSNXa賣給Balancer的SNX/ETH/xSNXa(25/25/50)池子, 獲利的同時償還了dYdX的閃電貸。
針對xBNTa的攻擊
xBNTa的合約透過ETH來鑄造xBNTa。
其原理是在智慧合約中在Bancor協議中將ETH換成BNT,並利用換來的BNT數量來計算鑄造的xBNTa數量。
然而合約中的"mint"方法並未驗證用ETH換來的幣是否為BNT,攻擊者使用了一個總量極大的代幣SPD替換了BNT,偽造了BNT的數量,使其可以無限增發xBNTa。
攻擊者呼叫了“mint”方法四次,每次使用0.03ETH鑄造大量的xBNTa,最終獲得了39億xBNTa,並將獲得的一半的xBNTa換成了大約78萬BNT。
但為什麼說這次駭客攻擊和以往的閃電貸攻擊不同呢?
因為攻擊者的這筆交易使用了Flashbots MEV來實施,保證了交易的私密性, 防止這筆交易在和AMM互動時被別的使用者進行了“三明治攻擊”。
■ 術語詳解
①Flashbots是一個研究和開發組織,成立的初衷是緩解由 "礦工可抽取價值(miner-extractable value, MEV)" 給智慧合約平臺型區塊鏈帶來的負面影響和生存風險。
他們提議為 MEV設計一種無需許可、透明且公平的生態系統,來保衛以太坊的理念。
②礦工可抽取價值(MEV)是一種設計用來研究共識安全的標準,它模擬了礦工(或節點驗證者)透過任意包含、去除或重新排序他們產生的區塊中的交易的能力而獲得的利潤。
例如,攻擊者可以看到一個有利可圖的交易,並試圖透過支付更高的交易費用來提前進行交易,從而獲得利潤。或者透過對AMM交易進行三明治攻擊。
③三明治攻擊:當攻擊者在交易池中觀察到一筆資產X換取資產Y的交易後,攻擊者可以提前買入資產Y,隨後讓受害者執行交易來提升Y資產的價格,然後在Y資產價格上升後出售先前購入的資產Y來獲取利潤。
因此,即使是攻擊者也需要警惕黑暗森林中所有潛伏的掠奪者。
Flashbots需要使用者使用個人的API金鑰,攻擊者極有可能在使用Flashbots的時候留下自己的蹤跡。
因此查詢該API金鑰的使用歷史也可作為追回損失的手段之一。
寫在結尾
xToken作為一個已經過大型安全公司審計的優秀DeFi專案遭受這樣的攻擊其實是並不常見的。
這也再次向我們揭露了一個事實:靜態安全審計並無法保障100%的安全。
安全並非是一次性的,它是一個持續的過程。
區塊鏈技術日新月異,新的攻擊方式同樣層出不窮。