今日8时04分(HKT),BSC链上的元宇宙金融项目Paraluni遭遇黑客攻击,黑客获利逾170万美元。据欧科云链链上天眼初步分析:
1、攻击者资金来自PancakeSwap的闪电贷;
2、问题出在项目方MasterCheif合约的depositByAddLiquidity方法,该方法未校验代币数组参数address[2] memory _tokens是否和pid参数指向的LP相吻合,在涉及到LP数额变化时,也未加重入锁。
目前黑客在BSC链上的地址「0x94bc」的账户余额为3000.01 BNB(约112.58万美元),另有235.45 ETH(约60.86万美元)通过cBridge跨链到了ETH网络「0x94bc」。
图片来源:OKLink
通过跨链桥转移至ETH网络的235.45 ETH中的230 ETH(约59.45万美元)分5笔流入混币协议Tornado Cash,占整体获利资金的1/3。
当前黑客地址「0x94bc」账户余额具体分布如下:
攻击细节分析
经链上天眼分析,以「0x70f3」攻击交易为例:
1、攻击者「0x94bc」提前构造了攻击合约A「0x4770」,一个更改了transferFrom方法的ERC20合约UBT「0xca2c」,和另一个代币合约UGT,随后攻击者调用攻击合约A的depositLp方法开始发动攻击;
2、利用PancakeSwap的闪电贷,贷出约15.5万的USDT和BUSD;
3、调用ParaRouter合约的addLiquidity添加15.5万BUSD_USDT流动性,获得15.5万LP_BUSD_USDT,并转移到UBT合约上;
4、调用MasterCheif合约的depositByAddLiquidity方法,添加1个UBT和1个UGT的流动性,指定pid为18(代表LP_BUSD_USDT);
depositByAddLiquidity调用内部函数depositByAddLiquidityInternal,该方法未对LP和token数组做校验。
5、depositByAddLiquidityInternal调用addLiquidityInternal内部方法,语句paraRouter.addLiquidity触发了UBT的transferFrom方法,UBT合约的transferFrom方法疑似为非标准ERC20代码,再次调用了MasterCheif合约的depositByAddLiquidity。
我们注意到,addLiquidityInternal方法中,先记录old LP balance,再调用addLiquidity,然后记录new LP balance,最后用new-old得到deposit的实际数量,而由于触发了UBT的transferFrom,导致重入了一次addLiquidityInternal,old LP balance未能反应最新的deposit数量,因此这一步造成了UBT合约拥有15.5万LP的deposit份额,而攻击合约A也拥有了15.5万LP的deposit份额;
6、UBT和攻击合约A分别抽取MasterCheif中的LP到攻击合约A中;
7、Remove Liquidity后,攻击合约A中有约31万USDT和31万BUSD;
8、归还闪电贷后,攻击者获利约15.5万USDT和15.5万BUSD。
案件总结
重入攻击是一种由于solidity智能合约的特性,再加上智能合约编写不当导致的漏洞。
问题出在项目方MasterCheif合约的depositByAddLiquidity方法,该方法未校验代币数组参数address[2] memory _tokens是否和pid参数指向的LP相吻合,在涉及到LP数额变化时,也未加重入锁。
该事件提醒我们,在涉及到金额变动的合约方法中,一定要关注重入漏洞,尽量使用重入锁modifier。
目前,链上天眼团队已对相关地址进行了监控,并将进一步跟进事件进展。
更多链上数据查询
尽在www.oklink.com
欧
/
科
云
链
点击阅读原文,走进链上天眼