{"content":{"title":"零时科技 || DPC攻击复现","body":"![微信图片_20220929155604.jpg](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/09gU3HXZ6336728115a6f.jpg)\r\n# 背景\r\n\r\n北京时间2022年9月10日，DPC代币合约遭到黑客攻击，损失超73,614 BUSD, 零时科技安全团队及时对此安全事件进行分析，详情可移步至分析文章“零时科技 || DPC攻击事件分析”。\r\n\r\n# DPC合约简介\r\n\r\nDPC合约是一个ERC20代币合约，合约提供兑换、转移代币等功能。用户可以使用USDT兑换获得DPC代币，将DPC代币与USDT进行质押来获得DPC代币奖励。\r\n\r\n# 漏洞核心\r\n\r\n由于DPC合约中计算奖励算法存在漏洞，攻击者通过质押流动性代币获得奖励，通过调用函数取出代币时进行奖励累加，在合约中取出任意数量代币都会进行奖励累加操作且对于操作没有频率的限制，并且在奖励累加时会进行两次累加操作，使得计算奖励时会翻倍增加。\r\n\r\n1.通过质押代币将oldClaimQuota[] 与 dpcLp[]赋值\r\n\r\n![图片1.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/Q2YQWic4633672ac9e13a.png)\r\n\r\n2.调用claimStakeLp()函数计算奖励\r\n\r\n![图片2.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/eDVBOYwt633672b5b0ec4.png)\r\n\r\n3. getClaimQuota()函数中可以看到再次执行了ClaimQuota的加法操作，调用一次计算奖励函数时会给奖励进行翻倍。\r\n\r\n![图片3.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/2jP0jehr633672c612aa2.png)\r\n\r\n# 漏洞测试\r\n\r\n攻击合约核心代码\r\n\r\n![图片5.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/CpF8xldQ633672dbd6313.png)\r\n\r\n**测试结果**\r\n\r\n攻击合约初始资金为204代币，向被攻击合约质押200代币后调用攻击函数，每调用一次攻击函数向被攻击合约转移1个代币实现奖励累加，调用四次攻击函数后获得的奖励为321代币，将奖励提取至被攻击合约。\r\n\r\n# 漏洞预防\r\n\r\n1. 在计算奖励的函数中设置奖励计算的频率，并且设置每次调用函数时传入参数的最小值，避免攻击者可以通过转移小额代币就可以实现奖励的累加。\r\n2.  将计算奖励函数中累加计算改为只进行函数调用，避免一次调用函数实际进行了两次奖励累加。\r\n\r\n![图片6.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/NJaOz6ZR63367320f1660.png)\r\n\r\n修改之后用同样的攻击方法获利只有38代币，为正常应获得的奖励数额。\r\n\r\n![图片7.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/RWWsZVeB6336732b4f400.png)"},"author":{"user":"https:\/\/learnblockchain.cn\/people\/52","address":null},"history":null,"timestamp":1664513136,"version":1}