北京时间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%的安全。
安全并非是一次性的,它是一个持续的过程。
区块链技术日新月异,新的攻击方式同样层出不穷。