北京時間2022年3月17日,我們的系統監控到涉及APE Coin的可疑交易,根據twitter用戶Will Sheehan的報告,套利機器人通過閃電貸薅羊毛,拿到6W多APE Coin(每個價值8美元)。
我們經過分析後,發現這和APE Coin的空投機制存在漏洞有關。具體來說,APE Coin決定能否空投取決於某一個用戶是否持有BYAC NFT的瞬時狀態,而這個瞬時狀態攻擊者是可以通過借入閃電貸然後redeem獲得BYAC NFT來操縱的。攻擊者首先通過閃電貸借入BYAC Token,然後redeem獲得BYAC NFT。然後使用這一些NFT來claim空投的APE,最後將BYAC NFT mint獲得BYAC Token用來返還閃電貸。我們認為這個模式同基於閃電貸的價格操縱攻擊非常類似(合約通過一個資產的瞬時價格來對另外一個資產進行定價,而這個瞬時價格可以被操控)。
接下來,我們使用一個攻擊交易(https://versatile.blocksecteam.com/tx/eth/0xeb8c3bebed11e2e4fcd30cbfc2fb3c55c4ca166003c7f7d319e78eaab9747098)來簡述整個過程。
Step I: 攻擊準備
攻擊者購買了編號1060的BYAC NFT並且轉移給攻擊合約。這個NFT是攻擊者花了106 ETH在公開市場購買的。
Step II: 借入閃電貸並且redeem成BYAC NFT
攻擊者通過閃電貸借入大量的BYAC Token。在這個過程中,攻擊者通過redeem BYAC token獲得了5個BYAC NFT(編號7594,8214,9915,8167,4755)。
Step III:通過BYAC NFT領取空投獎勵
在這個過程中,攻擊者使用了6個NFT來領取空投。 1060是其購買,其餘5個是在上一步獲得。通過空投,攻擊者共計獲得60,564 APE tokens獎勵。
Step IV: mint BYAC NFT獲得BYAC Token
攻擊者需要歸還借出的BYAC Token。因此它將獲得BYAC NFT mint獲得BYAC Token。這個過程中,他還將其自己的編號為1060 NFT也進行了mint。這是因為需要額外的BYAC Token來支付閃電貸的手續費。然後將還完手續費後的BYAC Token賣出獲得14 ETH。
獲利
攻擊者獲得60,564 APE token,價值50W美金。其攻擊成本為1060 NFT(106ETH)減去售賣BYAC Token得到的14ETH。
Lessons
我們認為問題根源在於APE的空投只考慮瞬時狀態(NFT是否在某一個時刻被某一個用戶持有)。而這個假定是非常脆弱的,很容易被攻擊者操控。如果攻擊者操控狀態的成本小於獲得的APE空投的獎勵,那麼就會創造一個實際的攻擊機會。