北京时间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空投的奖励,那么就会创造一个实际的攻击机会。