事件背景
xWin是采用币安智能链区块链技术建立的DeFi平台。它提供行业指数、耕种金库以及其他多种金库,以实现收益最大化。
北京时间2021年6月25日,xWin.FINANCE官方推文称xWin平台上经历了一次闪贷,xWin部分功能已暂停使用,零时科技安全团队对该安全事件进行复盘分析。
事件分析
攻击信息
通过初步追踪分析,攻击者创建了一个合约,进行了两笔攻击交易,共盗取资金超过29万美元,攻击信息如下:
推荐人地址
- https://bscscan.com/address/0x2Df8DD8880010A28b1539d9aEfF9bcEec39E2040
攻击者钱包地址
- https://bscscan.com/address/0xb63f0d8b9aa0c4e68d5630f54bfefc6cf2c2ad19
攻击者合约地址
- https://bscscan.com/address/0x67d3737c410f4d206012cad5cb41b2e155061945
攻击者盗取资金交易
- https://bscscan.com/tx/0xba0fa8c150b2408eec9bbbbfe63f9ca63e99f3ff53ac46ee08d691883ac05c1d
- https://bscscan.com/tx/0xda1016b24b8982ea27671e3502691c0ca17231e1dbc0dfd00df41f0646217643
xWinFarm合约地址
- https://bscscan.com/address/0x8f52e0c41164169818c1fb04b263fdc7c1e56088#code
xWinDeFi合约地址
- https://bscscan.com/address/0x1bf7fe7568211ecff68b6bc7ccad31ecd8fe8092#code
攻击过程
由于攻击者的两笔攻击交易均类似,这里分析攻击者的第一笔交易,该笔交易也是损失资金最多的交易,下面分步解析该笔交易,方便读者更清晰的了解攻击过程。
第一步:闪电贷共获取76000枚BNB。
第二步:将闪电贷借出所有BNB分成1:1两笔,并将其中一笔37999枚BNB兑换为山寨币,并在xWinFarm合约中添加流动性获取Cake-LP。
第三步:由于添加了流动性,合约随即铸造了对应的PCLP-xWin代币给用户,作为流动性提供者的证明。(到这里xWin 协议将授权的推荐 xWin 代币奖励记录到推荐地址)
第四步:调用redeem函数将之前加入的BNB赎回,并销毁Cake-LP。
随后攻击者将此过程(第一步至第四步)循环20次,不断积累推荐人奖励。
第五步:最终攻击者使用推荐人地址提取了303998枚xWin奖励,
第六步:通过PancakeSwap V2将303998枚xWin兑换为903枚BNB,获利离场。
至此
攻击者通过该笔交易获取了903枚BNB,加上攻击者第二笔攻击交易获取的资金,攻击者共计获取了1007枚BNB,总价值超过30万美元。
看似简单的循环步骤,被推荐人利用资金循环操作,为何可以不断增加推荐者的代币奖励数量,该奖励是否没有数额限制,带着以上疑问,继续分析合约的代码逻辑。
攻击成功的原因
通过以上交易分析可以明确,攻击者会通过每一次循环更新推荐者奖励数量,通过链上交易log信息可获取攻击者更新奖励调用的事件_Subscribe,如下图:
继续跟进代码中的Subscribe方法,该方法也是攻击者获取奖励调用的主要方法,如下图:
Subscribe方法中,更新奖励的代码逻辑在以上标注的if判断框中,并且需要达到rewardRemaining > 0的判断条件,也就是推荐奖励的总额,目前合约中rewardRemaining变量为6000万,并且该值会通过奖励值不断减小。
当前来看该变量依旧是一个非常大的数值,以至于攻击者可以获取大量奖励资金。达到if条件判断后,会继续调用storeRewardQty方法和updateReferralReward方法,这里是更新推荐人奖励,所以继续跟进updateReferralReward方法,如下图:
updateReferralReward方法中,推荐奖励是通过_tradeParams.amount.mul(referralperunit).div(1e18);计算公式来获得,目前合约中referralperunit奖励参数为0.1,也就是当每次循环76000BNB时,会得到7600枚xWin代币,那么20次循环后只会得到152000枚xWin代币,而通过交易信息分析,攻击者共获取了303998枚xWin代币,也就是说该算法下的奖励资金比攻击者获得的资金少了一倍。
继续分析合约,该合约中存在管理员修改referralperunit变量,也就是说合约管理员可能已经将奖励参数修改为0.2。
当referralperunit变量为0.2时,每次循环76000BNB时推荐者就会得到15200枚xWin,20次循环的奖励总额也就是303998枚xWin代币,该值也是攻击者最终获取到的资金数。
目前,xWin官方已终止推荐及其相关奖励功能,并将所有在闪电贷攻击之前抵押 LP xWin-BNB Farm的 xWin 代币持有者提供 1:1 xWin代币补偿。
总结
通过此次攻击事件来看,攻击者通过多次循环流动操作,并通过xWin合约中的推荐人奖励缺陷,最终获得了大量代币,目前类似的闪电贷攻击事件居多,为何还会频频发生,对于DeFi项目而言,合约代码的安全,代币价格的相对稳定,旧版本的及时更新都是保证项目安全极其重要的部分,对于合约功能缺陷问题,应在合约上线前进行严格审查及测试。对于此类闪电贷攻击事件,零时科技安全团队给出以下建议:
安全建议
对于合约代码安全,可找多家安全审计公司进行审计。
对LP价格及获取奖励的铸币代码块,应根据业务逻辑进行严格审核演算,避免出现参数可控制导致大量铸币问题。
使用可信的并且安全可靠的预言机,如Chainlink去中心化预言机,Alpha homera采用的。
对敏感性较强的代码,要做到及时更新完善。
来源:freebuf.com 2021-06-30 15:18:54 by: noneage
请登录后发表评论
注册