一、事件背景
Balancer官网上对于其具体功能的描述为『EasilyswapERC20tokens.Exchangetokenswithoutdeposits,bids/asks,andordermanagement.Allon-chain.』。简单来说Balancer就是提供在链上进行tokens交换的区块链智能合约应用。
2020年6月29日凌晨,Balancer项目的两个资金池遭受攻击。攻击者在此次事件中获利约46万美元,资金池市商损失约50万美元。
根据此次安全事件的具体过程,可以将此次事件比喻为攻击者『偷梁换柱』。
二、抽丝剥茧还原攻击者『偷梁换柱』经过
2.1、安全事件概述
?根据链上交易数据显示:
1、攻击者利用自建合约
对存在通缩货币STA的资产池
进行了攻击;
2、攻击者利用自建合约
对存在通缩货币STONK的资产池
成都链安:whaleswap.finance项目遭受攻击,至少损失5,946 个BUSD和5964个USDT:6月21日消息,据成都链安“链必应-区块链安全态势感知平台”安全舆情监控数据显示,whaleswap.finance项目遭受攻击,成都链安技术团队分析发现原因可能是因为whaleswap.finance Pair合约的K值校验存在问题。每当用户在进行交换时,K值校验中传入的参数量级存在问题,造成K值校验失效。攻击者先通过闪电贷借一笔BSC-USD,之后归还闪电贷时K值校验参数量级为10000^4。而K值校验时采取的参数校验量级为10000^2,导致K校验失效。[2022/6/21 4:41:57]
进行了攻击。
2.2、攻击步骤简介
攻击者首先通过闪电贷借款大量WETH,而后使用借得的WETH将被攻击资金池中的通缩货币兑换出来,仅留下1e-18个通缩货币。完成上述准备工作后,攻击者开始发动攻击,不断使用1e-18个通缩货币兑换资金池内的其他代币,以达到『偷梁换柱』的目的。直到池内资金基本被转移完后,攻击者将获利存入如下地址:
巧克力COCO智能合约已通过Beosin(成都链安)安全审计:据官方消息,Beosin(成都链安)近日已完成巧克力coco智能合约项目的安全审计服务。据介绍,巧克力COCO是基于波场底层打造的一个去中心化开放金融底层基础设施。结合波场TICP跨链协议,订单簿DEX,智能挖矿等等功能的创新和聚合,进而打造全面去中心化金融平台。巧克力COCO无ICO、零预挖且零私募,社区高度自治。合约地址:THTpbtqfoGmL6HwqaGrWKd7aJAcUTbCnoC审计报告编号:202010042149[2020/10/5]
0xBF675C80540111A310B06e1482f9127eF4E7469A
攻击过程如下图所示:
△图1
此次事件发生后,Balancer团队表示已对资产池进行审计,正在进行第三次审计,并将在UI界面启用通缩货币黑名单,禁止用户建立存在通缩货币的资产池。
动态 | 成都链安获得前海母基金新一轮融资:金色财经报道,2020年2月,成都链安科技有限公司正式宣布,获得前海母基金新一轮融资,以推动区块链安全事业健康有序发展。此前,成都链安已在2019年12月获得由联想创投、复星高科领投,成创投、任子行战略投资的数千万元融资,以及在2018年3月获得分布式资本的种子轮投资,在2018年9月获得界石资本、盘古创富的天使轮投资。据了解,前海母基金是目前国内商业化募集母基金,截至目前已完成募集规模285亿元。[2020/2/25]
2.3、漏洞原理详细分析
在分析漏洞具体信息之前我们需要知道以下两点:
1、Balancer项目允许个人建立资金池。资金池本质上是一个智能合约,用户可以调用资金池的函数进行代币兑换。资金池中可以存在多种货币,用户可以使用资金池中存在的货币进行兑换,兑换的比例按照一种固定的算法,如图所示:
动态 | 任子行斥资1000万元增资成都链安 推动区块链行业安全监管:任子行(300311)11月28日晚公告,公司拟以自有资金 1000 万元向成都链安增资。增资完成后,公司将获得成都链安 5.39%股权。公司与成都链安创始人杨霞、郭文生、高子扬于 11 月 28 日签署了投资协议。
任子行称,公司聚焦网络空间数据治理,为工信部、等部门提供网络安全产品和服务。此次投资是基于公司网络安全行业整体战略规划以及自身发展需要,持续跟进前沿技术,在网络安全新兴领域的重要布局。双方合作有利于发挥各自优势,积极推动区块链行业的安全监管,促进公司整体战略长期、持续、高效发展。(中证网)[2019/11/29]
△图2
我们以用STA兑换WETH为例:
?TokenAmountOut表示可以兑换出的WETH的值
?TokenBalanceOut表示当前池内的WETH的值
?TokenBalanceIn表示当前池子内的STA的值
?TokenAmountIn表示用户输入的STA的值
声音 | 成都链安:用户安全意识不足、交易所安全体系不够完善等因素造成交易所安全事件频发:成都链安统计数据显示,近期交易所安全问题时有发生。通过总结近期各种交易所安全事件和用户丢币事件,成都链安分析认为,交易所安全事件的问题来源主要有三点:1、用户安全意识不足,导致误入钓鱼网站等进而私密信息被盗。2、交易所安全体系不够完善,平台自身存在安全漏洞。3.交易所外接数据服务或其他服务后,未针对不可控因素建立应急机制。[2019/8/26]
?TokenweightIn表示STA的权重,为一个固定值,只能由资金池的管理者更改
?TokenweightOut表示WETH的权重,为一个固定值,只能由资金池的管理者更改
?SwapFee表示手续费,为一个固定值,只能由资金池的管理者更改
综上所述,当一种货币STA在一个资金池中的存量较少时,也就是bI较小时,就可以使用STA兑换更多的WETH。
2、STA代币是一种通缩货币,当进行转账操作时,会自动销毁一定量的STA。如下图所示:
△图3
tokensToBurn即为每次交易销毁的值,其销毁数额是转账数额的1/100,如当数值为1e-18时,其销毁值也是1e-18。销毁值的计算源码如下图所示:
△图4
△图5
接下来我们对本次攻击事件进行分析,以存在STA的被攻击资金池为例。攻击者向自建合约
发起了一笔交易
。在此笔交易中,攻击者首先从闪电贷借出了104331个WETH,如下图所示:
△图6
而后使用借来的WETH兑换被攻击资产池中的STA,因为STA是通缩货币,每次transfer都会使得STA销毁转账金额的1/100。如下图为一次兑换:
△图7
这笔交易共进行了20余次兑换,使得被攻击资金池中的STA余量为一个极小值后开始使用STA兑换其他代币,如下图所示:
△图8
我们可以发现,在此笔交易中,攻击者转给被攻击合约的STA个数是『0』,但却扣除了1e-18个STA,这不符合正常兑换情况。于是我们对此进行深入分析,通过事件日志确定攻击者发送了1e-18个STA。如下图所示:
△图9
由此可得出结论,在发送过程中,因为STA的通缩机制,发送给资金池的STA会被销毁,导致被攻击资金池无法收到STA,但资金池合约仍然会认为收到了1e-18个STA,并更新STA的存量。如下图所示:
△图10
如果STA的存量增加,就会使得STA能够兑换其他代币的比例下降,因此攻击者又调用了gulp()方法来更新STA的余额,使得资金池的STA余额等于实际余额。如图所示:
△图11
每进行一次兑换,攻击者就会调用一次gulp()对STA的余额进行更新,这样使得STA的余额始终为1e-18个,因此每次攻击取出余额的比例都是不变的,如下图所示:
△图12
攻击者使用这种方式,将资金池中的所有代币以每次1/2的比例进行兑换,最终几乎将资金池中的所有代币全部提出。
2.4、攻击事件总结
根据我们日常智能合约安全审计经验来看,本次事件产生的原因,可能是资金池合约对流入资金的处理方式不够完善,并没有考虑到通缩性代币的情况,在计算应当输出的值tokenAmountOut和货币余额inRecord.balance的增减时,都是使用由用户控制的tokenAmountIn参数,而不是实际收到的代币数,导致实际池中的流入资金与记录资金不相符,如下图所示:
△图13
另外,用于更新代币余额的gulp函数的权限是external,这两点组合起来,导致了本次事件漏洞的产生,如下图所示:
△图14
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。