Grim Finance 闪电贷安全事件分析_RES:Bitcoin Token

0x01:前言

援引官方消息,北京时间12月19日,Fantom链上复合收益平台GrimFinance遭遇了闪电贷攻击。知道创宇区块链安全实验室第一时间对本次事件深入跟踪并进行分析。

0x02:事件详情

交易细节如下图所示:

浏览上图的交易过程可知,攻击合约利用闪电贷借取代币WFTM和BTC,将借取的代币与自己铸造的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在攻击者通过depositFor()实现质押的过程中。

通过Tenderly调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:

Coffeezilla:投资者仍未收到YouTube网红承诺的1000枚ETH退款:金色财经报道,YouTube记者Coffeezilla表示,YouTube网红Logan Paul在2023年1月对于NFT游戏CryptoZoo的1000枚ETH退款承诺(截至发文时,总价值共190万美元),以Logan Paul的财力应很容易完成,但投资者仍未收到任何详细信息。

2022年12月,Coffeezilla揭露了该项目的问题,但Logan Paul自承诺还钱之后便对此事闭口不谈,且无明确的退款计划。

此前,Logan Paul在一项拟议中的集体诉讼中被点名,该诉讼涉及Logan Paul为NFT项目CryptoZoo做销售推广,但相关产品从未推出。[2023/7/1 22:12:04]

多链借贷协议FilDA发布漏洞利用声明:已造成约70万美元的损失:4月23日消息,多链借贷协议FilDA发布漏洞利用声明称,今天早些时候在亦来云智能链(ESC)和 REI 网络上遭到攻击,已造成约 70 万美元的损失。没有其他 FilDA 部署受到影响。已识别漏洞并隔离攻击媒介。ESC 和 Rei FilDA 平台已经暂停,只有在对当前情况进行彻底审查后才会恢复。将与CEX、安全公司等多方进行合作分析链上活动,以帮助跟踪和监控这些地址。将要求执法部门追究此案,并鼓励受影响的用户也联系当地执法部门,以便他们了解盗窃事件。[2023/4/23 14:22:14]

0x03:漏洞分析

depositFor()函数位于的第1115行:

function?depositFor(address?token,?uint?_amount,address?user?)?public?{

币安否认“国际刑警组织向赵长鹏发出红色通缉令”的传言:4月4日消息,针对推特上有关“国际刑警组织向赵长鹏发出红色通缉令”的传言,币安发言人在电子邮件声明中表示,“这个谣言不是真的”。赵长鹏也在推特作出回应,称网上流传的通缉令是PS过的照片,并建议用户屏蔽FUD来源。(The Block)[2023/4/4 13:43:28]

?uint256?_pool?=?balance();

?IERC20(token).safeTransferFrom(msg.sender,?address(this),?_amount);

?earn();

?uint256?_after?=?balance();

?_amount?=?_after.sub(_pool);?//?Additional?check?for?deflationary?tokens

SBF否认猎杀3AC,遭Zhu Su质疑或将走法律程序:12月9日消息,SBF针对此前Zhu Su指责其猎杀三箭的言论发布回应表示,其本人今年犯了许多严重错误,但猎杀三箭资本不是其中之一,Zhu Su说的不是真的,也没有证据能证明。

Zhu Su随后转载SBF推文回应表示,“你确定毕竟你声称不知道Alameda发生的事情。没关系,我们可以让司法部(DoJ)决定。”[2022/12/9 21:33:46]

?uint256?shares?=?0;

?if?(totalSupply()?==?0)?{

??shares?=?_amount;

?}?else?{

??shares?=?(_amount.mul(totalSupply())).div(_pool);

?}

被FTX收购的LedgerPrime在Clearpool推出单一借贷池:10月26日消息,数字资产投资公司LedgerPrime宣布在Clearpool的DeFi 协议上推出单一借贷池,并仅在 Clearpool Polygon 市场上提供。

LedgerPrime 是一家多策略数字资产投资公司,在2017年由Ledger Holdings推出,随后于2021年被FTX US收购。Clearpool是一个面向机构借款人的去中心化资本市场生态系统,使机构能够安全地访问数字资产和 DeFi。[2022/10/26 16:39:09]

?_mint(user,?shares);

}

该函数的safeTransferFrom()方法从IERC20(token)调用,调用完该方法后,余额balance也会随之变动,最后通过_mint()方法向用户添加质押凭证代币。其中调用的变量token可控,导致攻击者可以自己实现safeTransferFrom()方法,将该方法重入到depositFor()发起攻击。

以实施了5次重入攻击为例,开始_pool的值为0,在重入depositFor方法的前四次里,攻击者一直传入自己铸造的代币,_pool的值会一直保持为0,但在第五次,也就是最后一次传入100个受认可的代币时,_after的值会变成100,而_afer-_pool的差值_amount也就是100,最后由于重入了5次,导致合约会向攻击者铸造100*5的质押凭证代币。

其后果就是攻击者向该合约质押自己铸造不受认可的代币,同样会增加质押总量,最后利用多出来的质押凭证实现套利。

0x04:修复方案

1.由于depositFor()方法里的token可控才是导致这次攻击事件的原因,因此只需要在传递参数的时候让token不可控就行:

function?depositFor(?uint?_amount,address?user?)?public

2.由于套利的原因是depositFor()方法里存在修改代币数量的函数,因此还可以将修改代币的方法单独实现,这样即使token变量可控,也无法成功套利:

function?depositFor(address?token,?uint?_amount,address?user?)?public?{

?IERC20(token).safeTransferFrom(msg.sender,?address(this),?_amount);

}

3.锁定交易token:

function?setLPToken(address?lp)?public?onlyOwner?{

lpToken?=?lp;

}

function?depositFor(uint?_amount,address?user?)?public?{

uint256?_pool?=?balance();

IERC20(lpToken).safeTransferFrom(msg.sender,?address(this),?_amount);

earn();

......

}

0x05:总结

经过完整分析,知道创宇区块链安全实验室明确了该次攻击事件的源头并非网传的闪电贷攻击,攻击者利用GrimBoostVault合约的depositFor方法参数可控,实施了重入攻击,将自己的铸造的无价值代币兑换成了质押凭证,最后通过withdrawAll方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。

对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。

来源:金色财经

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:15ms0-1:291ms