• 零时科技 || DPC攻击事件分析


    事件背景

    零时科技区块链安全情报平台监控到消息,北京时间2022年9月10日,DPC代币合约遭到黑客攻击,损失超73,614 BUSD, 零时科技安全团队及时对此安全事件进行分析。

    攻击信息

    攻击者钱包地址:

    0xf211Fa86CBc60d693D687075B03dFF3c225b25C9

    攻击合约地址:

    0x2109bbecB0a563e204985524Dd3DB2F6254AB419

    被攻击合约地址:

    0xb75ca3c3e99747d0e2f6e75a9fbd17f5ac03cebe

    攻击步骤

    1. 向被攻击合约转移代币,每次转移100 BUSD,共转移 4,200 BUSD

     

    2. 使用 50 BUSD 兑换 3.63 DPC

     

    3. 将兑换得到的 DPC与 47.4 BUSD 用于添加流动性,将获得的流动性代币质押

     

    4. 调用claimStakeLp函数多次取出0.000000000000000001 LP代币,在claimStakeLp中会将当前奖励与之前奖励相加,使得获得的奖励增加。

     

     

    5. 调用claimDpcAirdrop函数获得奖励20,602 DPC,将获得奖励兑换为 75,664 BUSD

     

    漏洞核心

    DPC中通过质押LP代币获得奖励,攻击者通过调用合约中claimStakeLp 函数使得获得的奖励增加。

     

    函数claimStakeLp() 中计算获得的奖励是将之前的奖励与getClaimQuota()计算出的奖励累加,而在函数getClaimQuota()中也进行了一次ClaimQuota的累加计算(下图),攻击者通过多次调用claimStakeLp函数使得获得的奖励增加。

     

    第一次调用claimStakeLp函数获得奖励

     

    多次调用claimStakeLp函数后获得奖励

     

    资金来源

    通过混币平台Tornado.Cash转入 10 BNB

     

    资金流向

    攻击者通过重复攻击共获利约73,614 BUSD,目前资金仍在攻击者钱包中。

     

    总结及建议

    此次攻击主要原因是对于奖励机制设置出现漏洞,使得奖励数额成倍数增加,且奖励数额计算时与调用claimStakeLp()函数时传入的数字无关,因此攻击者可以用一个较小的金额进行多次调用,实现获得大额的奖励。

    安全建议

    • 建议计算中涉及到函数调用时需要详细检查变量数值变动情况,避免数值被重复计算。
    • 建议项目方上线前进行多次审计,避免出现审计步骤缺失。

  • 相关阅读:
    重学java 58.红黑树相关集合
    LeetCode每日一练 —— OR36 链表的回文结构
    particles.js粒子特效(常用登录页背景)
    【深度学习实践(四)】识别验证码
    SpringMVC(五)【拦截器】
    uni-app App端优化
    深入解析PHP函数
    JavaMail发送和接收邮件API(详解)
    Postgresql垃圾回收Vacuum优化手册
    Nginx部署vue项目和配置代理
  • 原文地址:https://blog.csdn.net/m0_37598434/article/details/126875101