背景
北京时间 2022 年 9 月 10 日,DPC 代币合约遭到黑客攻击,损失超 73,614 BUSD, 零时科技安全团队及时对此安全事件进行分析,详情可移步至分析文章“零时科技 || DPC 攻击事件分析”。
DPC 合约简介
DPC 合约是一个 ERC20 代币合约,合约提供兑换、转移代币等功能。用户可以使用 USDT 兑换获得 DPC 代币,将 DPC 代币与 USDT 进行质押来获得 DPC 代币奖励。
漏洞核心
由于 DPC 合约中计算奖励算法存在漏洞,攻击者通过质押流动性代币获得奖励,通过调用函数取出代币时进行奖励累加,在合约中取出任意数量代币都会进行奖励累加操作且对于操作没有频率的限制,并且在奖励累加时会进行两次累加操作,使得计算奖励时会翻倍增加。
1.通过质押代币将 oldClaimQuota[] 与 dpcLp[]赋值
2.调用 claimStakeLp() 函数计算奖励
3. getClaimQuota() 函数中可以看到再次执行了 ClaimQuota 的加法操作,调用一次计算奖励函数时会给奖励进行翻倍。
漏洞测试
攻击合约核心代码
测试结果
攻击合约初始资金为 204 代币,向被攻击合约质押 200 代币后调用攻击函数,每调用一次攻击函数向被攻击合约转移 1 个代币实现奖励累加,调用四次攻击函数后获得的奖励为 321 代币,将奖励提取至被攻击合约。
漏洞预防
在计算奖励的函数中设置奖励计算的频率,并且设置每次调用函数时传入参数的最小值,避免攻击者可以通过转移小额代币就可以实现奖励的累加。
将计算奖励函数中累加计算改为只进行函数调用,避免一次调用函数实际进行了两次奖励累加。
修改之后用同样的攻击方法获利只有 38 代币,为正常应获得的奖励数额。
零时
往期内容回顾
零时科技 | Nomad 跨链桥被盗 1.8 亿美元事件分析
零时科技 | Audius 金库 1850 万枚 AUDIO 被盗事件分析
零时科技联合创始人黄鱼先生受邀对话《Web3 应用创新与生态安全》
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。