在DeFi项目的yfvalue质押池中发现了合同漏洞,1.7亿美元的资金有可能被锁定。慢雾分析了漏洞的技术细节。
原题:慢雾:yfvalue,一行代码如何锁定数亿资产
据《连锁新闻》报道,DeFi项目的yfvalue(YFV)昨天宣布,团队在YFV质押池中发现了一个漏洞,恶意参与者利用该漏洞分别重置了质押中的YFV计时器。已经有恶意参与者试图勒索团队。慢雾安全小组对此进行了深入分析,以下是相关技术细节。
详细分析
以上是yfvalue的官方描述。从声明中,我们可以知道YFV抵押贷款池存在问题。恶意用户可以重置YFV抵押人的定时器,给YFV抵押人带来不便,但这不会导致资金损失。
通过登录yfvalue官方网站可以发现,在yfvalue系统中,用户可以通过质押相关代币获得相应的奖励。目前,yfvalue支持以下质押代币池:
可以看出,由于漏洞,YFV抵押池的抵押功能在UI界面中已经关闭,但在合同中token抵押功能没有关闭。我们需要跟踪代码来分析具体细节。
根据官方网站提供的GitHub地址,我们追踪到相关代码仓库。YFV按揭的相关逻辑在YFVu中标桩.SOL在合同中,合同中有两种抵押功能,即取得功能和保管自**。具体代码如下:
通过代码不难发现,无论是栈函数还是stakeonself函数,逻辑基本相同。首先,验证morage amount不能为0,然后分别调用上层的tokenstage和tokenstakeonhalf函数。然后更新用户的抵押时间。只是stakeonself函数可以用来抵押别人。tokenstack和tokenstakeonself的代码如下:
如您所见,这里我们简单地以transferfrom的方式将相应的token转移到契约中。没有特别的逻辑点。在这里,整个抵押过程非常清晰,其次是收益过程。分账功能用于计算用户收入,提取功能用于收取收入。代码如下:
通过对税收征管代码的分析,发现其逻辑也非常简单。stack函数首先通过updaterward修饰符更新用户的奖励,然后使用getreward函数计算用户的奖励,并将抵押时间设置为当前阻止时间。**,当用户提取奖励时,取款功能会先计算当前的区块时间,然后与解冻taketime函数中计算的时间进行比较。只有当当前冻结时间大于解冻取款计算的时间时,才允许取现。解冻taketime的代码如下:
从代码中,unfrozen taketime是用户**一次抵押时间加上冻结锁定时间,时间常数得到锁定时间。只要超过时间,就可以通过提取功能提取利润。整个抵押和收益的简化过程如下:
经过大量分析,回到我们最初的问题,恶意用户如何锁定其他用户的资产?
回到用户抵押的逻辑,我们可以发现抵押逻辑中stakeonself函数的目的是帮助抵押。然而,这里有一个问题。如果用户之前有抵押呢?如果已经被抵押的用户再次被抵押,例如,如果一个YFV被抵押,那么抵押用户的定时器是否可以以非常低的成本重置,这样用户在取款时就无法成功调用它。此外,假设YFV抵押用户成功调用了stacereward函数,恶意用户在即将达到解冻taketime函数指定的时间时,可以使用stakeonbehave函数将少量资产抵押给用户,然后再次锁定抵押奖励。理论上讲,这种循环会使使用者无法取出自己的资产,但这个问题不会导致资金损失。攻击过程如下:
从前面翻倒的大车上发出警告
根据yfvalue的官方声明,该项目的代码是由经验丰富的开发人员开发的。同时,对其他成功项目的代码也有借鉴意义。然而,风险仍然不可避免地出现。科技产业有其特殊性。安全审计一方面需要项目方的积极思考,另一方面需要专业安全团队的逆向思维,从专业黑客的角度模拟对抗,发现问题。
修复计划
通过对代码和漏洞细节的分析,修复方案也非常简单。抵押时只要检查用户的抵押状态,如果已经抵押,则不允许再抵押。或者单独处理每笔房贷不能影响之前的按揭状况。
文章标题:慢雾:yfvalue合同漏洞技术拆解,一行代码怎么能锁定上亿元?
文章链接:https://www.btchangqing.cn/101179.html
更新时间:2020年09月10日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。