Grim Finance闪电贷安全事件分析_GRI:grin币价格

0x01:前言

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

交易细节如下图所示:

浏览上图的交易过程可知,攻击合约利用闪电贷借取代币,将借取的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在depositFor()函数中。通过Tenderly(https://dashboard.tenderly.co/tx/fantom/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6/debugger调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:

Gridex将于3月24日启动第三轮GDX空投:据官方推特,Gridex宣布将于3月24日0:00(UTC)启动第三轮GDX空投,空投对象为Arbitrum上ARB/ETH交易对(0.05% grid)的所有挂单用户,具体细则将尽快公布。

据悉,Gridex protocol是以太坊上首个完全链上化的订单簿交易协议,目前已部署于Arbitrum区块链网络上。[2023/3/21 13:16:30]

0x03:漏洞分析

depositFor()函数位于https://ftmscan.com/address/0x660184ce8af80e0b1e5a1172a16168b15f4136bf#code的第1115行:

F2Pool鱼池将于5月19日8时停止GRIN币种挖矿:据F2Pool官方消息,由于GRIN挖矿收益及矿工数量持续过低,F2Pool鱼池将于2021年5月19日08:00停止提供GRIN币种的挖矿服务。GRIN挖矿收益查询将持续至2021年6月21日。F2Pool鱼池将在此期间支付所有帐户的GRIN余额。如帐户中有未支付余额,请务必在6月18日前进行一次GRIN钱包地址变更,准备使用新钱包地址接收余额。具体安排为:

1.针对余额不少于0.3GRIN的帐户,F2Pool鱼池将在用户绑定最新钱包地址后进行支付;

2.5月19日至6月18日,F2Pool鱼池将在每周五向完成钱包地址变更的用户发起一次性支付,支付日期为5月21日、5月28日、6月4日、6月11日、6月18日。[2021/5/14 22:02:01]

David Grider:公司对比特币未来12个月表现持乐观态度:华尔街分析公司Fundstrat Global Advisors首席数字策略师David Grider在周四发表的一份关于加密货币的研究报告中表示,其公司看好比特币的发展前景,并特别指出减半是一种积极的催化剂:“我们对未来12个月持乐观态度,预计比特币价格可能会继续上涨至50%甚至更多。”Marketwatch亦表示,Fundstrat认为比特币在未来12个月内将达到14350美元。Fundstrat联合创始人Tom Lee近期在推特上分享了这种看涨情绪,他解释称,比特币今年迄今的表现证明,它不仅受益于减半,而且是一种“可靠的风险资产,可以对冲灾难性事件”。(Bitcoinist)[2020/5/3]

该函数的safeTransferFrom()方法从IERC20(token)调用,最后一次调用,也就是逆序第一次执行后,余额balance也会随之变动。当前铸造凭证数量/前一笔铸造凭证数量固定为3.54:

Grin钱包v3.1.1补丁已经发布:据官方推特,Grin钱包v3.1.1补丁已经发布,修复了所有由依赖项引起的https监听器错误。[2020/3/17]

我们推导其公式为:

将该公式分子拆分,得到shares/totalSupply的固定比为2.54:

动态 | 非盈利组织AI Grid Foundation为其区块链项目募集2000万美元:据unhashed消息,AI Grid Foundation今天宣布已经募集了2000万美元资金用于其区块链项目项目ELONCITY,该项目还将拥有自己的令牌协议,这将有助于客户参与能源交换。核财经App注:AI Grid Foundation是一个总部设在新加坡的非营利组织,倡导使用去中心化的可再生能源来解决集中式电网面临的紧迫问题。[2018/10/1]

最后将Debug交易里的shares/totalSupply进行计算,其值与shares/totalSupply的固定比相同,因此可以确定套利值只与totalSupply()有关:

其中函数safeTransferFrom()传入的变量token可控,导致攻击者可以自己实现safeTransferFrom()方法,将该方法重入到depositFor(),拉升totalSupply()总量,最后通过_mint()方法向用户添加质押凭证实现套利。以实施了5次重入攻击为例,开始pool的值为0,在重入depositFor方法的前四次里,攻击者一直传入自己铸造的代币,pool的值会一直保持为0,但在第五次,也就是最后一次传入100个受认可的代币时,after的值会变成100,而afer-pool的差值amount也就是100,最后由于重入了5次,导致合约会向攻击者铸造100*5的质押凭证代币。

其后果就是攻击者只质押一次代币,仍能多次增加质押总量实现套利。0x04:修复方案

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

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

3.锁定交易token:

0x05:总结

经过完整分析,知道创宇区块链安全实验室明确了该次攻击事件的源头并非网传的闪电贷攻击,攻击者利用GrimBoostVault合约的depositFor方法参数可控,实施了重入攻击,将自己的铸造的无价值代币兑换成了质押凭证,最后通过withdrawAll方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。

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

水星链

[0:15ms0-1:460ms