北京时间2023年1月3号 8:21:14 AM ,NUMEN实验室根据链上监控显示发现 BSC上GDS项目遭到闪电贷攻击。此次攻击共造成187000美金损失,GDS币价直接腰斩。其主要原因是代码逻辑中奖励计算只考虑权重而没考虑时间等因素,当前项目方已关闭其逻辑执行的状态。
具体分析如下:
https://bscscan.com/address/0xcf2362b46669e04b16d0780cf9b6e61c82de36a7
https://bscscan.com/tx/0x2bb704e0d158594f7373ec6e53dc9da6c6639f269207da8dab883fc3b5bf6694
攻击者嵌套了两笔闪电贷,借出大量BSC-USD,有了充足的初始资金,然后攻击者使用PANCAKE用BSC-USD兑换部分GDS。接把BSC-USD和GDS添加到对应的流动性池子,获得大量lp-token。
攻击者部署了很多合约,每个合约都一样,里面只是调用了GDS的transfer函数,攻击者把之前获得的lptoken转移到部署的合约上,攻击者调用自己部署合约里面的withdraw函数,withdraw函数里面又调用了GDS的transfer函数,实现获利。
GDS是个token合约(https://bscscan.com/address/0xc1bb12560468fb255a8e8431bdf883cc4cb3d278#code)属于ERC20代币,但是进行了魔改。transfer会调用_transfer,然后最下面会调用_afterTokenTransfer。里面的from参数是调用者地址,即攻击者创建的合约地址,里面保存了大量的lptoken。
关键代码逻辑,在_afterTokenTransfer中会调用_refreshDestroyMiningAccount。因为转账的to地址等于dead地址,会进到第一个分支,又因为此时的isOpenLpMining为true,会进到里面嵌套的分支,会执行_settlementLpMining。
此次攻击根本问题所在的函数
_settlementLpMining传入的参数是from,之前说过from里面保存了大量lp,当在计算奖(GDS)的时候实际上是一个常量*from的lptoken持有量/lptpken总发行量。因此from中lptoken数量越多,奖励就越多。在当前函数中_internalTransfer直接把奖励转走。 GDS被攻击大约1小时后(Jan-03-2023 01:01:28 AM +UTC),项目方调用了GDS合约中的closeLpMining,把isOpenLpMining变成了false,暂停了功能。详情见如下tx:https://bscscan.com/tx/0x06d23624bd1edeb63665f41c4d3dd098d4c913a715c7b6fd9894575dcb0f43dc 还有一个值得注意的点,攻击者在1天16小时前于币安热钱包有交互,详情见链接:https://bscscan.com/txs?a=0xcf2362b46669e04b16d0780cf9b6e61c82de36a7&f=3
总结:
本次项目被攻击最主要的原因是在转账的奖励计算时,只考虑到交易者持有的lp代币权重,而没有考虑时间等因素,使攻击者利用漏洞从中获利。NUMEN实验室建议项目方在项目部署前要做好完备的代码审计和测试,对于奖励计算时要以时间,数量多种因子去计算奖励,这样可以有效的避免闪电贷攻击。NUMEN专注于为Web3安全保驾护航。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...