北京时间5月13日,CertiK安全技术团队发现DeFi质押和流动性策略平台xToken遭到攻击,xBNTaBancor池以及xSNXaBalancer池立即被耗尽,造成近2500万美元损失。
5月还未过去一半的时间,这次的攻击事件加上5月已发生的其他攻击事件,竟已有大约8500万美元被盗了。
CertiK安全团队在2020年发现的关键bug分为三类:逻辑错误,闪电贷和项目方欺诈。
本次事件部分可以算的上是一次并非“典型”的闪电贷攻击。
闪电贷可以在无需提供任何抵押的情况下进行贷款,当然所有操作必须在一个交易区块内完成。
开发人员可以从Aave或dYdX等协议中借贷,条件是在交易结束之前将流动资金返还到资金池中。
如果资金未能及时返回,则交易将被撤回,从而确保储备池的安全。
闪电贷具备多种功能和用例,但我们目前看到的多数闪电贷都被用于套利交易。
而恶意使用方式则是攻击其他一些DeFi协议或操纵价格预言机的价格——这也正是此次xToken发生的情况。
弗兰克研究员在推特上解释攻击是如何发生的
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的合约通过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%的安全。
安全并非是一次性的,它是一个持续的过程。
区块链技术日新月异,新的攻击方式同样层出不穷。
我们无法知道和预判将要面临的下一次攻击,作为业内领先的区块链安全公司,CertiK开发的一系列安全工具及完备的安全服务将为项目方和投资者提供安全保障,一旦加密资产出现意外失窃情况,损失将因此降至最低。