写在前面:北京时间6月29日,知名defi项目Balancer的两个资产池遭遇闪电贷攻击,价值50万美元的代币被攻击者抽走,对此,defi服务商1inch及Balancer项目方相继对攻击事件进行了复盘。此外,Balancer联合创始人兼CTO Mike McDonald还提醒称,任何恶意的ERC20代币都有可能被添加到Balancer合约层,因此需要注意这种未知的风险,根据此前的计划,Balancer很快将进行第三次安全审计。
今天,至少有两个Balancer多币资产池遭到闪电贷攻击,导致价值50万美元的资产被耗尽,原因是AMM(自动化做市商)和通缩代币模型环境造成的漏洞。
Balancer池是类似Uniswap的自动做市商(AMM),其包含了多种资产,并通过特殊数学公式形成价格,为交换任何资产创造套利机会。
据defi服务商1inch分析,攻击者向以太坊主网发送了一笔复杂的交易,导致对其中一个Balancer资产池发起攻击,几分钟后,其发起了第二笔交易,并耗尽了另一个Balancer资产池,以下是1inch编写的分析报告:
攻击者使用智能合约在单笔交易中自动执行多个操作。在第一步,攻击者通过闪电贷从dYdX获得10.4万 WETH,这些资金被用于将WETH与STA 代币来回交换24次,从而将STA余额从Balancer池中抽走,然后池中资产变成了1 weiSTA(0.000000000001 STA)。
造成这个问题的原因在于,Balancer资产池合约跟踪合约中的代币余额,而STA代币有一个通缩模型,从接收方收取1%的传输费,从而导致transfer()和 transferFrom() 的错误行为。因此,每当攻击者将WETH交换到STA时,Balancer池收到的STA就比预期的少1%。
然后下一步,攻击者多次将1 weiSTA换成WETH,由于STA代币传输费的实施,资产池中从未收到STA,但它却释放了WETH。重复相同的步骤,攻击者就从Balancer资产池中抽走了WBTC、SNX以及LINK代币余额。
而最后一步,攻击者向dYdX偿还了10.4万WETH,攻击者通过存入一些weiSTA迅速增加其在Balancer 池中的份额,然后,他通过Uniswap V2将收集的Balancer池代币交换成13.6万STA,然后再次将13.6万STA交换成109 WETH 。
所有被盗资金都被转移到以下地址:0xbf675c80540111a310b06e1482f9127ef4e7469a;
1inch总结称:这次攻击的幕后黑手,是一位非常老练的智能合约工程师,他对领先的DeFi协议有着广泛的知识和理解。 显然,这次攻击是有着充分计划的,此外,他还用Tornado Cash来获得初始资金,用于部署智能合约和执行攻击,从而隐藏了ETH的来源。
Balancer项目方的分析与反应
在攻击发生后,Balancer项目方也进行了分析:
通过闪电贷从dYdX借出ETH并转换为WETH;
不断交易 WETH & STA;
在每笔交易中,STA都有一笔转移费,而资产池希望它在没有这笔费用的情况下获得余额;
经过足够的调用后,攻击者调用gulp(),该函数将代币余额的内部池记帐同步到代币跟踪器合约中存储的实际余额;
由于STA的余额接近于零,因此它相对于其他代币的价格非常高,攻击者现在可以使用STA,以极低的成本交换池中的其他资产;
对此,Balancer联合创始人兼CTO Mike McDonald在博客中写道:
“尽管事先我们并不知道这种特定类型的攻击是可能的,但我们在文档、discord及其他渠道中始终警告ERC-20与传输费可能在协议中产生的意外影响。这就是为什么STA不包含在最近汇总的BAL 挖矿白名单中的原因。
该系统是为符合ERC20标准而设计的,当代币表现出意外的行为时,可能会发生不良情况。 Balancer是一种无需许可的协议,始终可以在合约层添加损坏或恶意的代币。
至于下一步,我们将开始向UI黑名单中添加传输费代币,类似于我们对无bool转移代币所做的一样。请注意,这些列表并不详尽,任何新代币都可以随时添加到Balancer。
我们将添加更多文档,说明这些资产池如何工作,以及存在漏洞或恶意设计的代币可能如何从资产池中耗尽资产的风险。
Balancer已经过2次全面审核,并且已经制定了第三次审核计划(在今天之前),这次审核很快将开始。我们将继续审核和审查Balancer协议。”