1、 背景
平衡器网站(HTtps://balancer.finance/)其具体功能描述为“易交换ERC20代币”交换没有头寸、出价/任务和订单管理的代币。都在链条上。”简而言之,balancer是一个区块链智能合约应用程序,在链上提供代币交换。
北京时间2020年6月29日凌晨,均衡器项目的两个基金池遭到攻击。攻击者在资本池市场获利约46万美元,损失约50万美元。
根据安全事件的具体过程,可以将该事件比作攻击者“偷梁换柱”
2、 恢复攻击者的“偷梁换柱”过程
2.1安全事件概述
▷根据链上的交易数据:
1 ;攻击者利用自建合同进行攻击
(0x81d73c55458f024cdc82bbf27468a2deaa631407)
(0x0e511aa137aad267dfe3a6bfca0b856c1a3682);
2 ;攻击者利用自建合同进行攻击
(0xab9a95521107bc40dfa2e7905059319f8b1302866)
(0xb9eaf49d9f913bc1314e37bb5482891840c8e3c1)。
2.2攻击步骤介绍
攻击者首先通过闪贷借入大量wHT5,然后利用借入的wHT5兑换被攻击资金池中的通缩货币(STA或stonk),只剩下1e-18通缩货币。在完成上述准备工作后,攻击者开始发动攻击,不断使用1e-18通缩货币(STA或stonk)交换资金池中的其他代币,以达到“偷梁换柱”的目的。在池中资金基本转移之前,攻击者将利润存入以下地址:
0xBF675C80540111A310B06e1482f9127eF4E7469A
攻击过程如下图所示:
事件发生后,平衡器团队表示已对资产池进行了审计,并正在进行第三次审计。它将在用户界面中启用通货紧缩货币黑名单,并禁止用户用通货紧缩货币建立资产池。
2.3脆弱性原理详细分析
在分析漏洞的具体信息之前,我们需要知道以下两点:
1平衡项目允许个人建立资金池。基金池本质上是一个智能合约。用户可以调用资金池的功能来兑换代币。资金池中可以有多种货币。用户可以使用资金池中的货币进行兑换。转换率遵循固定的算法,如图所示
例如,我们将sta换成w60115
▷tokenamount out代表可赎回的wHT5的价值
▷tokenbalanceout代表当前池中wHT5的值
▷tokenbalancein表示当前池中sta的值
▷tokenamount in代表用户输入的sta值
▷tokenweig HT in表示STA的权重,为固定值,只能由基金池管理人更改
▷tokenweig HT out代表w60115的权重,为固定值,只能由基金池经理更改
▷掉期费是指服务费是固定值,只能由基金池的经理更改
综上所述,当基金池中sta的存量较小时,即Bi较小时,sta可用于兑换更多的wHT5。
2Sta代币是一种通货紧缩货币,在进行转账操作时,会自动销毁一定数量的Sta。如下图所示:
Tokenstoburn是每个事务的销毁值。销毁金额为转让金额的1/100(四舍五入)。例如,当值为1e-18时,销毁值也为1e-18。销毁值计算源代码如下图所示:
其次,以sta的基金池为例,对攻击进行了分析。攻击者与自己签订合同
(0x81d73c55458f024cdc82bbf27468a2deaa631407)已启动事务
(0x013be97768b702fe8eccef1a40544d5ecb3c1961ad5f87fee4d16fdc08c78106),在此事务中,攻击者首先从闪贷中借出104331 wHT5,如下图所示:
然后,借用的wHT5用于交换被攻击资产池中的sta。因为sta是通货紧缩货币,每次转账都会使sta销毁转账金额的1/100(四舍五入)。下图显示了一个交换机:
该笔交易已经进行了20次以上的交易,使得被攻击资金池中的sta余额最小(10-18),然后sta被用来兑换其他代币(wHT5),如下图所示:
我们可以发现,在该交易中,攻击者向被攻击合约转移的sta数量为“0”,但扣除了1e-18sta,这与正常的交换情况不符。因此,我们对此进行了深入分析,确定攻击者通过事件日志发送了1e-18 sta。如下图所示:
因此,STA-1池收到的资金仍然可以被STA池销毁,并且由于通货紧缩(记录余额)。如下图所示:
如果sta的存量增加,sta可以兑换成其他代币的比例会降低。因此,攻击者调用gulp()方法更新sta余额,使资金池中的sta余额等于实际余额。如图所示:
每次进行交换时,攻击者都会调用gulp()来更新STA的余额,这样STA的余额总是1e-18。因此,每次攻击所占余额的比例是恒定的(1/2),如下图所示:
攻击者利用这种方法每次以1/2的比例交换资金池中的所有代币,最终将资金池中几乎所有的代币提出来。
2.4攻击事件总结
根据我们日常的智能合约安全审计经验,这起事件的原因可能是资金池合约没有很好地处理资金的流入,没有考虑通货紧缩的代币。在计算中,应输出tokenamount out和currency balance的值记录余额增加或减少时,使用由用户控制的tokenamount参数,而不是实际收到的代币数量,导致实际池中流入资金与记录资金不符,如下图:
此外,用于更新代币余额的gulp()函数的权限是外部的。这两点的结合导致了此事件漏洞的发生,如下图所示:
文章标题:成都联安:均衡器项目脆弱性分析
文章链接:https://www.btchangqing.cn/48265.html
更新时间:2020年07月07日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。