缝隙原因

近来,据业内人士提供的有关信息(如下图所示),名为 KingDefi 的项目合约存在缝隙,并提示其他用户慎重操作,提取资金并取消授权。知道创宇区块链安全实验室调研发现,KingDeFi 是一个 DeFi 项目,主要功能包括对 BSC、Solana 链上 DeFi 的收益聚合剖析、用户 DeFi 收益追踪以及项目原生代币的典当挖矿

KingDefi收益计算逻辑漏洞分析

在检查 BSC 链上的 KrownMaster 合约(用于典当挖矿 staking )源码后发现,该合约确实存在逻辑缝隙,会导致用户收益率受到影响,在相应的核算逻辑存在疏漏,以下为详细解说。

合约链上地址如下:

https://bscscan.com/address/0x56a65a3736e65349e5b0737cb2c5eb7d5ccbbbe3#code

如下图所示,我们注意到在项目用户奖赏更新算法逻辑的处理过程中存在对 investor 数组的一个遍历,此处 investor 地址存在被重复遍历并且修正对应奖赏的可能性。

KingDefi收益计算逻辑漏洞分析

如下图所示,用户在经过 deposit 调用进行典当的时分,判别当用户典当数量为 0 时,可作为 investor 地址参加投资收益列表从而获得典当收益,而该判别可被黑客利用。

KingDefi收益计算逻辑漏洞分析

如下图所示,黑客可经过调用 withdraw 或许 withdrawAll 函数将指定 pid 池子中的典当数量提现,从而使得 user.amount 为 0,进而该地址能够在再次 deposit 典当的时分经过相应检查进入 investor 列表,从而在 updatePool 函数中对黑客 investor 地址进行重复遍历并且添加屡次典当奖赏,使得典当奖赏分配不均,影响到其他用户的典当挖矿收益。

KingDefi收益计算逻辑漏洞分析

KingDefi收益计算逻辑漏洞分析

经过检查项目 github 发现,KingDefi 项目方当时已对该问题进行了修正。

缝隙修正

那么项目方怎么修正该缝隙?检查项目的 github 地址(https://github.com/kingdefi/Krown-Contracts/tree/main/Farm),发现其在 18 个小时前曾更新过代码,比照一下更新代码。

KingDefi收益计算逻辑漏洞分析

发现项目方已经删除了用于存储用户地址的数组,改为了 rewardsPerShare 变量,该变量表示单位典当代币所对应的奖赏代币;一起项目方也更改了奖赏的核算方法 (updatePool 函数):由本来循环一切用户地址来按比例分配奖赏改为更新 rewardsPerShare 变量来核算用户奖赏代币。

KingDefi收益计算逻辑漏洞分析

比照两种奖赏方法,后者已经不会产生前者由于重复核算奖赏的问题,这种奖赏方法类似于 sushiswap 的奖赏核算方法,一起也避免了前者由于循环次数太多导致的 gas 销毁过大的问题。

缝隙总结

Kingdefi 这次的缝隙影响到的是用户的奖赏代币数量,攻击者可不断典当提取来提高自身奖赏的分配数量,可是用户的典当代币是不受任何影响,能够正确安全提取出来。从项目方的修正结果来看,其换了一种常规奖赏核算方法,该方法符合典当挖矿逻辑,用户可正常且正确提取典当和奖赏代币。在此提醒广大项目方,在上线 Defi 挖矿项目前一定要做好代码审计,不同的核算方法在招引新用户的一起也会大大添加犯错的危险!

视野开拓

什么叫雇员?别人没有发现你的错误,你就没有责任,这就叫雇员。什么叫老板?你没有发现别人的错误那么所有的错误都是你的,这就是老板。-《市场的逻辑》

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注