2020年6月28日下午6:03:11 + UTC开始,DeFi平台Balancer被利用对ERC20通缩代币的有缺陷的操作而受到攻击。从技术上讲,此事件背后的主要逻辑是Balancer与通货紧缩代币之间的不兼容,然后攻击者滥用该不兼容代币来创建损坏的STA / STONK池状态,并从中获利。
平衡器池是类似Uniswap的多维自动做市商(AMM)。它们包含多种资产,并通过创建套利机会以通过特殊公式形成价格来交换任何资产,从而使它们在一定比例之间保持平衡。
黑客向以太坊主网发送了一个复杂的交易,导致对其中一个平衡器池的攻击。几分钟后,第二笔交易发生,并且耗尽了另一个平衡池。攻击者使用智能合约在单个交易中自动执行多个动作。
具体来说,该黑客操作包含四个不同的步骤:
1. 闪电借:黑客从dYdX借了一笔闪电贷款(104,331 WETH)。2. STA耗尽:利用借入的WETH,不良行为者进行了一系列交换,以耗尽平衡器池拥有的几乎所有STA代币。请注意,STA是通货紧缩代币,每次代币转移将收取1%的费用。 STA耗尽的结果是池中仅剩1e-18 STA。
3.牟取暴利者利用平衡器中STA的错误处理方式,偷走了约523,616.52美元的资产池。4.最终黑客偿还了dYdX的闪电贷款,并带走了被盗的资产。
接下来,我们将分解交易中黑客的行为。
图1:黑客行动分解
步骤1:借入贷款
该步骤基本上利用了dYdX闪电贷功能借入104331 ETH。
步骤1:从dYdX借用WETH的闪电贷
步骤2:STA耗尽
在此步骤中,不良行为者在同一事务中执行了多个swapExactAmountIn()调用,以耗尽受攻击的平衡器池中的STA余额。我们注意到swapExactAmountIn()设置了掉期金额的限制,即inRecord.balance * MAX_IN_RATIO。黑客通过一系列操作计算出了该限制,并将最大允许的WETH交换为STA,如下所示:
步骤2:即时STA耗尽(第一部分)
执行上述交换的结果是将1e-18故意留在了平衡器池中:步骤2:即时STA耗尽(第二部分)
因此,我们现在具有_records [STA]和STA._balance [BPool]如下:由于BPool中STA的数量几乎为零,因此它相对于其他资产的价格非常高。目前,任何人都可以将1个STA交换为大量其他资产。
第三步:利用牟利
经过前两个步骤,此步骤实质上利用了该漏洞来窃取池资产。
第三步:利用牟利(第一部分)
具体来说,通过swapExactAmountIn()将1e-18 STA发送到BPool中,不良参与者在第一次运行中换出了30,347个WETH。在用于簿记的内部记录中,在BPool合约实际上从msg.sender收集相应的STA代币之前,_records [STA]由tokenAmountIn(即1)增加。步骤3:以营利为目的(第一部分-继续)
在swapExactAmountIn()的底部,_pullUnderlying()函数收集了STA代币。但是,如前所述,STA是通货紧缩代币,每次代币传输收费显示为1%。由于减少了转账费用,因此平衡器池实际上得到了0个STA代币。因此,BPool的实际STA余额与其内部记录(即_records [STA])之间不匹配。步骤3:利用牟利(第二部分:gulp重置STA余额的内部记录)
为了解决不匹配问题,利用gulp()重置_records [STA],这有助于不良行为者维持BPool只有1e-18 STA的状态。因此,不良行为者可以继续与极有价值的1e-18 STA交换所有池资产。第4步:偿还Flashloan
最后一步将贷款偿还给dYdX。
步骤4:偿还dYdX贷款
直击问题
此事件强调了DeFi可组合性带来的挑战,这些挑战可能会导致通缩代币产生不太明显的不兼容性问题。它还提醒人们,先前发生的事件表明ERC777代币不兼容。我们预计不兼容的情况可能会继续存在,并且没有简单的解决方案。对于此特定事件,一方面,当transfer()或transferFrom()的_value小于所收取的费用时,通缩代币(例如STA / STONK)应还原或返回false。另一方面,在每次transferFrom()调用之后,平衡器可能需要始终检查BPool的余额。尽管如此,始终需要找出所有具有更好编码实践和改进测试覆盖率的极端情况,而无需对ERC20,ERC777和其他DeFi组件的预期行为进行任何不必要的假设。
事件后果
Balancer黑客事件可能不是最后一次攻击事件。攻击的幕后推手是非常老练的“智能合约工程师”,对领先的DeFi协议具有广泛的认识和了解。这次袭击是有组织的,事先已做好充分准备。
最后,我们汇总了此事件中各种资产的损失金额和占比,请见下图:
损失了近50万美元,而黑客获得了近42.5万美元的代币:
455 WETH(价值10万美元)240万个STA(价值10万美元)并将其转换为109 WETH(价值25,000美元)11.36 WBTC(价值10万美元)60.9k SNX(价值10万美元)22.6k LINK(价值10万美元)
原文链接:
https://medium.com/@1inch.exchange/balancer-hack-2020-a8f7131c980e
https://medium.com/@peckshield/balancer-hacks-root-cause-and-loss-analysis-4916f7f0fff5
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。