事件背景
零时科技区块链安全情报平台监控到消息,北京时间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()函数时传入的数字无关,因此攻击者可以用一个较小的金额进行多次调用,实现获得大额的奖励。
安全建议
- 建议计算中涉及到函数调用时需要详细检查变量数值变动情况,避免数值被重复计算。
- 建议项目方上线前进行多次审计,避免出现审计步骤缺失。