6 月 29 日北京时间凌晨 2 点 03 分,CertiK 天网系统 (Skynet) 检查到在区块 10355807 处 Balancer DeFi 合约异常,安全研究员迅速介入调查,攻击过程浮出水面。
6 月 29 日凌晨 2 点 03 分,攻击者利用从 dYdX 闪电贷中借到的 WETH,大量买进 STA 代币,使得 STA 与其他代币的兑换价格急剧上升。然后使用最小量的 STA (数值为 1e-18)不断回购 WETH,并在每次回购后,利用 Balancer 的合约漏洞重置其内部 STA 的数量(数值为 1e-18),以此稳住 STA 的高价位。
攻击者不断利用漏洞,用高价的 STA 将某一种代币完全买空(WETH,WBTC, LINK 和 SNX),最终用 WETH 偿还闪电贷,并剩余大量 STA,WETH,WBTC, LINK 和 SNX,并通过 uniswap 将非法所得转移到自己账户中。此次攻击约获利 90 万人民币。
CertiK 分析的此次事件攻击者心理画像:
攻击者在调取 STA 余额后,快速调用 swapExactAmountIn 函数购买 STA,并在第 24 次交易使用了另一个函数 swapExactAmountOut 精准的将 STA 的数目买到了最小值(1e-18),从而最大化后续攻击的效率。最开始的 6 笔交易,在没有必要的情况下,3 次买入后卖出,损失了 4 个 WETH,故布疑云。并且能够做到隐匿自己的闪电贷阶段痕迹来看,有黑客特性。
CertiK 判断攻击者是有经验的黑客团队在充分准备后的一次攻击尝试,有很大可能还会继续攻击其他 DeFi 合约。
阶段 0:攻击者从 dYdX 闪电贷处借款,获得初始 WETH 资金。
阶段 1:攻击者使用 WETH 将 Balancer 中的 STA 尽可能买空,最大程度提高 STA 价格。
阶段 2:攻击者用获得的 STA 多次买回 WETH。每一次都用最小量的 STA (数值为 1e-18)进行购买,并利用 Balancer 内部漏洞函数 gulp(),锁定 STA 的数目,控制 STA 对 WETH 的价格。重复多次该种买回操作,直到将 Balancer 中的 WETH 取空。
阶段 3:换一种代币,用 STA 重复阶段 2 直到取空该种代币。阶段三重复了三次,一共有 4 种代币受到了损失 WETH,WBTC, LINK 和 SNX。
阶段 4:偿还 dYdX 闪电贷,离场。
攻击者获利
攻击者攻击地址:
0x81D73c55458f024CDC82BbF27468A2dEAA631407
攻击者最终收款地址:
0xbf675c80540111a310b06e1482f9127ef4e7469a
攻击者最终获利:565.5326240837032 ETH, 约合 90 万人民币(北京时间 20200630 早 9 点 30 分价格)
Balancer 合约的 gulp() 函数作用为将某一种代币的内部记录数值覆盖到当前该种代币的真实数目,但是错误的把他设置成没有限制的 external 函数。gulp() 函数不应该为 external,或者应该加入对于特定使用者或者智能合约拥有者的验证或者防护限制条件。STA 的通缩模型应改为发送者支付手续费。
参考资料:
1. Balancer Github:
2. 攻击交易历史记录:
https://ethtx.info/mainnet/0x013be97768b702fe8eccef1a40544d5ecb3c1961ad5f87fee4d16fdc08c78106
3. 官方攻击报告:
声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。
简介:分享区块链领域专业、前沿、有趣的内容
评论0条