事件背景
零时科技区块链安全情报平台监控到消息,北京时间2022年10月27日,BSC链上Victor the Fortune 合约受到黑客闪电贷攻击,攻击者已获利约5.8万美元,耗尽了流动资金池,攻击者地址为0x57c112cf4f1e4e381158735b12aaf8384b60e1ce,零时科技安全团队及时对此安全事件进行分析。
攻击步骤
1. 攻击者通过闪电贷借出约100,000 USDT
2. 将借出的USDT兑换为77,853 VTF
3. 调用updateUserBalance()函数计算获得奖励
4. 调用transfer函数将资金全部转移至 地址 0x1dd557415a0ddea7d3e56f49c78d54ebbf31f569
5. 调用updateUserBalance()函数获得奖励
6. 重复执行第四步和第五步,最后共获得 499,803,157 VTF
7. 将获得的VTF兑换获得 158,450 USDT
8. 归还闪电贷后共获利 58,450 USDT
漏洞核心
攻击者通过调用transfer函数进行转账,在转账函数中调用了updateUserBalance()函数,由于此时userBalanceTime[user]为0会将当前时间赋值给userBalanceTime[user]。
之后调用updateUserBalance(),当userBalanceTime大于0时会调用 getUserCanMint函数计算奖励值
在getUserCanMint函数中计算返回值是用户的余额除以常数乘当前时间与用户开始时间的时间差,由于没有设置最小时间差,因此在很短时间调用函数也可以获得奖励。
由于调用一次updateUserBalance()函数后会更新时间,攻击者通过调用transfer函数将资金转移至一个新的地址,再次调用updateUserBalance()函数可以继续获利,并且当攻击者地址资金增加时获得的奖励也随着增加,攻击者通过重复以上步骤获得奖励逐渐增加直到将池子掏空。
总结及建议
此次攻击是由于合约中的计算奖励函数的算法只与用户地址余额和时间差有关,攻击者通过先调用转账获得用户初始时间,之后调用获得奖励的函数,通过这两个函数调用过程中的时间差计算获得奖励。通过多次转账计算获得奖励使得资金累加,最后将池子中代币几乎掏空。
“
安全建议
-
建议对于计算获得奖励时设置最小时间差,避免攻击者通过短时间多次调用函数获利。
-
建议项目方上线前进行多次审计,避免出现审计步骤缺失
往期内容回顾
零时科技 | Audius金库1850万枚AUDIO被盗事件分析
零时科技联合创始人黄鱼先生受邀对话《Web3应用创新与生态安全》
原文始发于微信公众号(零时科技):零时科技 || Victor the Fortune攻击事件分析