• 零时科技 || Victor the Fortune攻击事件分析


    事件背景

    零时科技区块链安全情报平台监控到消息,北京时间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()函数可以继续获利,并且当攻击者地址资金增加时获得的奖励也随着增加,攻击者通过重复以上步骤获得奖励逐渐增加直到将池子掏空。

    总结及建议

    此次攻击是由于合约中的计算奖励函数的算法只与用户地址余额和时间差有关,攻击者通过先调用转账获得用户初始时间,之后调用获得奖励的函数,通过这两个函数调用过程中的时间差计算获得奖励。通过多次转账计算获得奖励使得资金累加,最后将池子中代币几乎掏空。

    安全建议

    • 建议对于计算获得奖励时设置最小时间差,避免攻击者通过短时间多次调用函数获利。
    • 建议项目方上线前进行多次审计,避免出现审计步骤缺失

  • 相关阅读:
    SpringBoot缓存@Cacheable注解
    11-2 mybatis入门细节
    领导的潜台词,你读懂了吗?
    蓝牙SDK状态机与车载音频HSM状态机比较
    System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权。
    删除共享文件凭据脚本
    影刀连接Mysql数据库
    C语言 2 —— 常量
    冰冰学习笔记:内存地址空间
    Monaco Editor教程(五): 实现同时多文件编辑,tab切换
  • 原文地址:https://blog.csdn.net/m0_37598434/article/details/127657917