学院 资讯速递 文章

欧科云链链上卫士:黑客利用重入漏洞攻击Paraluni,获利逾170万美元,约1/3已流入Tornado

2022.03.13

一、背景

今日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。

图片来源:OKLink

当前黑客地址「0x94bc」账户余额具体分布如下:

BSC:3,000.0188 BNB

图片来源:OKLink

ETH:5.2430 ETH

图片来源:OKLink

二、攻击细节分析

经链上卫士分析,以「0x70f3」攻击交易为例:

图片来源:OKLink

1、攻击者「0x94bc」提前构造了攻击合约A0x4770」,一个更改了transferFrom方法的ERC20合约UBT「0xca2c」,和另一个代币合约UGT,随后攻击者调用攻击合约AdepositLp方法开始发动攻击;

2、利用PancakeSwap的闪电贷,贷出约15.5万的USDT和BUSD;

3、调用ParaRouter合约的addLiquidity添加15.5万BUSD_USDT流动性,获得15.5万LP_BUSD_USDT,并转移到UBT合约上

4、调用MasterCheif合约的depositByAddLiquidity方法,添加1个UBT1个UGT的流动性,指定pid为18(代表LP_BUSD_USDT);

depositByAddLiquidity调用内部函数depositByAddLiquidityInternal,该方法未对LP和token数组做校验。

5、depositByAddLiquidityInternal调用addLiquidityInternal内部方法,语句paraRouter.addLiquidity触发了UBT的transferFrom方法,UBT合约的transferFrom方法疑似为非标准ERC20代码,该方法调用了MasterChef合约的deposit方法。

我们注意到,addLiquidityInternal方法中,先记录old LP balance再调用addLiquidity然后记录new LP balance最后用new-old得到deposit的实际数量,而由于触发了UBT的transferFrom,导致了new LP balance的赋值被阻断,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

目前,链上卫士团队已对相关地址进行了监控,并将进一步跟进事件进展。

免责声明:OKLink学院仅提供信息参考,不构成任何投资建议。

相关推荐

information-center