BTCV高分资讯 > 数字货币 > 慢雾:当技术消除了YFValue合同的漏洞时,一行代码

慢雾:当技术消除了YFValue合同的漏洞时,一行代码

作者:高分资讯来源:高分资讯 数字货币 2020年08月26日

在DeFi项目的YFValue质押池中发现了合同漏洞,1.7亿美元的资金面临被锁定的风险。慢雾分析了漏洞的技术细节。

原标题:《慢雾:YFValue,一行代码如何锁定上亿资产》

作者:于丹,在慢雾安全小组工作

据连锁新闻报道,DeFi项目YFValue (YFV)昨天宣布,该团队在YVV质押池中发现了一个漏洞,恶意参与者利用这个漏洞分别重置了质押中的YVV计时器。目前,一名恶意参与者正试图勒索该团队。慢雾安全小组对此进行了深入分析,以下是相关技术细节。

详细分析慢雾:技术拆解 YFValue  合约漏洞,一行代码如何锁定上亿美元?

以上是YFValue的官方描述。从声明中,我们可以知道YFV的抵押贷款池有问题。恶意用户可以重置YFV抵押人的定时器,给YFV抵押人造成不便,但这不会导致经济损失。

登录YFValue官方网站,可以发现在YFValue系统中,用户可以通过质押相关令牌获得相应的奖励。目前,YFValue支持以下质押令牌池:

慢雾:技术拆解 YFValue  合约漏洞,一行代码如何锁定上亿美元?

可以看出,目前由于漏洞,YVF的抵押池的抵押功能已经在界面中关闭,但是合同中的令牌抵押功能还没有关闭,所以我们需要跟踪代码来分析具体的细节。

根据官方网站提供的Github地址,我们查到了相关的代码仓库。关于YFV抵押贷款的相关逻辑在YFV股份有限公司的合同中。合同中有两种抵押功能,即股份功能和股份抵押功能。以下是具体代码:

职能股份(uint256金额,地址推荐人)公共更新奖励(msg.sender)检查下一个纪元{

要求(金额0,“不能下注0”);

需要(推荐人!发件人,“你不能提及你自己。”);

super.tokenStake(金额);

lastStackTimes[msg . sender]=block . timestamp;

发出标记(msg.sender,amount);

如果(rewardReferral!=address(0)refer!=地址(0)) {

iyfVreferral(RewardReferrar)。setReferrer(msg.sender,referrer);

{}

{}

函数堆栈审核(地址堆栈审核,uint256金额)公共更新审核(堆栈审核)下一个时期{

要求(金额0,“不能下注0”);

super.tokenStakeOnBehalf(赌注,金额);

最后一次监视时间[监视时间]=块.时间戳;

排放标桩(标桩,数量);

{}

从代码中不难发现,无论是stake函数还是stakeOnBehalf函数,逻辑基本上是相同的。首先,验证抵押金额不能为0,然后分别调用令牌上限函数和令牌上限函数。然后更新用户的抵押时间。只有“抵押”功能可以用来抵押他人。令牌码和令牌码本身有以下代码:

函数令牌股份(uint256金额)内部{

_totalSupply=_totalSupply.add(金额);

_ balances[msg . sender]=_ balances[msg . sender]。添加(金额);

yfv . SafeTransferFrOm(msg . sender,address(this),amount);

{}

函数标记标记字符(地址标记,uint256金额)内部{

_totalSupply=_totalSupply.add(金额);

_余额[股份认购]=_余额[股份认购]。添加(金额);

yfv . SafeTransferFrOm(msg . sender,address(this),amount);

{}

可以看出,在这里,相应的令牌只是通过transferFrom的方式转移到合同中,没有特殊的逻辑点。整个抵押过程在这里很清楚,下一步是收入的过程。利益奖励功能用于计算用户的收入,提取功能用于接收收入。代码如下:

函数StackReference()公共更新奖励(msg.sender)检查下一个纪元{

uint256奖励=GetResponse();

要求(奖励0,“挣得太少”);

super.tokenStake(奖励);

lastStackTimes[msg . sender]=block . timestamp;

发出消息(消息发送者,奖励);

{}

功能提取(uint256金额)公共更新奖励(msg.sender)检查下一个纪元{

要求(金额0,“不能提取0”);

要求(block.timestamp=解冻时间(msg.sender),“硬币仍被冻结”);

超级令牌提取(金额);

发出提取(邮件发送者,金额);

{}

通过分析用于计算和接收收入的代码,发现逻辑也非常简单。赌注函数首先通过更新奖励修改器更新用户的奖励,然后使用获取奖励函数计算用户的奖励,并将抵押时间设置为当前的时间段。最后,当用户提取奖励时,提取功能将首先计算当前的冻结时间,然后将其与解冻冻结时间功能计算的时间进行比较。只有当当前冻结时间大于解冻冻结时间计算的时间时,才能允许取款。解冻时间的代码如下:

函数unfrozenStakeTime(地址帐户)公共视图返回(uint256) {

返回上次冻结时间[账户]冻结时间;

{}

根据代码,解冻时间使用用户的最后一次抵押时间加上冻结停止时间常数来获得锁定时间,如果时间超过,可以通过提取功能提取利润。抵押和收入收集的整个简化过程如下:

慢雾:技术拆解 YFValue  合约漏洞,一行代码如何锁定上亿美元?

经过大量分析,回到我们最初的问题,恶意用户如何锁定其他用户的资产?

回到用户抵押贷款逻辑,我们可以发现抵押贷款逻辑中的stakeOnBehalf函数旨在帮助抵押贷款,但是这里有一个问题。如果这个用户以前已经抵押了怎么办?然后,通过再次抵押被抵押的用户,例如抵押一个YVF,抵押用户的定时器能以非常低的成本被重置,导致用户在取款时不能成功地调用它吗?此外,假设YFV按揭用户已经成功调用了“抵押奖励”功能,当“解冻时间”指定的时间临近时,恶意用户可以通过“抵押奖励”功能将少量资产抵押给该用户,然后再次锁定抵押奖励。理论上,这种循环可以阻止用户取出自己的资产,但这个问题不会导致财务损失。攻击过程如下:

慢雾:技术拆解 YFValue  合约漏洞,一行代码如何锁定上亿美元?

这是本月曝光的第二个未经审计的DeFi项目。根据YFValue的官方声明,项目代码是由有经验的开发人员开发的,其他成功项目的代码也是可以借鉴的,但是风险还是不可避免的出现了。这个行业有专业化。一方面,安全审计需要项目方的积极思考;另一方面,它需要专业安全团队的逆向思维,从专业黑客的角度模拟对抗,找出问题。

通过分析代码和漏洞的详细信息,针对此漏洞的修复方案也非常简单,只要用户的抵押状态在抵押时被检查为已抵押,如果已抵押,则不允许再次抵押。或者每笔抵押贷款单独处理,这不会影响以前的抵押贷款状态。

来源链接:mp.weixin.qq.com

标签: bitcoin vault