慢雾:yfvalue合同漏洞技术拆解,一行代码如何能锁定上亿元?

时间:2021-07-26 15:58编辑:未知

以上是yfvalue的官方描述。从声明中,大家可以知晓YFV抵押贷款池存在问题。恶意用户可以重置YFV抵押人的定时器,给YFV抵押人带来不便,但这不会致使资金损失。

通过登录yfvalue官方网站可以发现,在yfvalue系统中,用户可以通过质押有关代币获得相应的奖励。现在,yfvalue支持以下质押代币池:

可以看出,因为漏洞,YFV抵押池的抵押功能在UI界面中已经关闭,但在合同中token抵押功能没关闭。大家需要跟踪代码来剖析具体细则。

依据官方网站提供的GitHub地址,大家追踪到有关代码仓库。YFV按揭的有关逻辑在YFVu中标桩.sol在合同中,合同中有两种抵押功能,即获得功能和保管自主权。具体代码如下:

通过代码不难发现,无论是栈函数还是stakeonself函数,逻辑基本相同。第一,验证mortgage amount不可以为0,然后分别调用上层的tokenstage和tokenstakeonhalf函数。然后更新用户的抵押时间。只不过stakeonself函数可以用来抵押其他人。tokenstack和tokenstakeonself的代码如下:

通过对税收征管代码的剖析,发现其逻辑也很简单。stack函数第一通过updaterward修饰符更新用户的奖励,然后用getreward函数计算用户的奖励,并将抵押时间设置为目前阻止时间。最后,当用户提取奖励时,取款功能会先计算目前的区块时间,然后与解冻taketime函数中计算的时间进行比较。只有当目前冻结时间大于解冻取款计算的时间时,才允许取现。解冻taketime的代码如下:

从代码中,unfrozen taketime是用户最后一次抵押时间加上冻结锁定时间,时间常数得到锁定时间。只须超越时间,就可以通过提取功能提取收益。整个抵押和收益的简化过程如下:

经过很多剖析,回到大家刚开始的问题,恶意用户怎么样锁定其他用户的资产?

回到用户抵押的逻辑,大家可以发现抵押逻辑中stakeonself函数的目的是帮抵押。然而,这里有一个问题。假如用户之前有抵押呢?假如已经被抵押的用户第三被抵押,比如,假如一个YFV被抵押,那样抵押用户的定时器能否以很低的本钱重置,如此用户在取款时就没办法成功调用它。除此之外,假设YFV抵押用户成功调用了stacereward函数,恶意用户在马上达到解冻taketime函数指定的时间时,可以用stakeonbehave函数将少量资产抵押给用户,然后第三锁定抵押奖励。理论上讲,这种循环会使用户没办法取源于己的资产,但这个问题不会致使资金损失。攻击过程如下:

依据yfvalue的官方声明,该项目的代码是由资深的开发职员开发的。同时,对其他成功项目的代码也有借鉴意义。然而,风险仍然不可防止地出现。科技产业有其特殊性。安全审计一方面需要项目方的积极考虑,另一方面需要专业安全团队的逆向思维,从专业黑客的角度模拟对抗,发现问题。

通过对代码和漏洞细则的剖析,修复策略也很简单。抵押时只须检查用户的抵押状况,假如已经抵押,则不允许再抵押。或者单独处置每笔房贷不可以影响之前的按揭情况。

本文标签: link DeFi

上一篇:啥是Mimblewimble?

下一篇:没有了