4

​零时科技 | DeFi平台Grim Finance攻击事件分析

 2 years ago
source link: https://learnblockchain.cn/article/3312
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

​零时科技 | DeFi平台Grim Finance攻击事件分析

北京时间2021年12月19日,Grim Finance官方发推文称平台被外部攻击者利用,攻击者盗币价值超过3000万美元

640.webp

0x1 事件背景

Grim Finance是一个智能收益优化平台,允许用户将AMMs(自动做市商)发行的LP-Tokens押在Grim Vaults中,这些LP-Tokens会自动收获并将其奖励重新押在LP-Tokens上,以获得复合效应,帮助用户收获更多的奖励。

零时科技区块链安全情报平台监控到消息,北京时间2021年12月19日,Grim Finance官方发推文称平台被外部攻击者利用,攻击者盗币价值超过3000万美元,零时科技安全团队及时对该安全事件进行复盘分析。

_20211221111310.png

0x2 攻击者信息

零时科技安全团队通过初步追踪分析,此次攻击发生在Fantom链,主要攻击信息如下:

攻击者钱包地址

https://ftmscan.com/address/0xdefc385d7038f391eb0063c2f7c238cfb55b206c

攻击者合约地址

https://ftmscan.com/address/0xb08ccb39741d746dd1818641900f182448eb5e41#code

https://ftmscan.com/tx/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6

GrimBoostVault合约

https://ftmscan.com/address/0x660184ce8af80e0b1e5a1172a16168b15f4136bf#code

0x3 攻击分析

以下将拆解攻击者交易,方便读者更清晰地了解攻击过程。
_20211221130756.jpg

第一步:攻击者闪电贷借款30枚BTC和92万枚WFTM,并通过PancakePair将借款添加流动性获取0.0476枚Spirit LP。

第二步:将获取的Spirit LP质押后获得GB-BTC-FTM。

第三步:通过多次质押存款获取GB-BTC-FTM(攻击的主要部分,通过未验证的Token不断质押,提高质押奖励的差值)。

第四步:将获取的GB-BTC-FTM归还,获得0.0663枚Spirit LP(已通过多次质押差值获利)。

第五步:解除流动性获取41枚BTC和128万枚WFTM,并归还闪电贷借款及手续费,随后将获利的11枚BTC和36万枚WFTM转至攻击者钱包地址。

攻击者通过同样的攻击手法继续进行了8次攻击,如下图

至此

_20211221130807.jpg

攻击者通过9笔攻击交易共获取累计获取26万枚BTC,1865万枚,75万枚DAI,75万枚USDC,13万枚BOO,价值约3000万美元。

下来通过合约代码了解漏洞发生的原因。

0x4 漏洞细节

通过查询交易详情可以找出本次攻击中使用的合约方法主要有两个:

GrimBoostVault.depositFor方法,用户质押资金并返回相应的证明代币。
_20211221130813.jpg

GrimBoostVault.withdrawAll方法,用户归还证明代币获取对应的质押资金。
_20211221130817.jpg

通过交易分析我们可以得知,攻击者成功的第三步主要是由于多次运转depositFor方法造成,首先来分析该方法,通读depositFor方法流程,主要是判断用户将资金质押转入合约后,计算合约余额差值,随后将差值进行计算后发送给用户相应的质押证明代币。乍一看貌似没有安全问题,但细心的同学会发现,这里的token地址并没有做固定限制,该token地址是由用户传入,由于depositFor方法中会用到token合约地址中的safeTransferFrom方法,token合约地址为用户可控后,safeTransferFrom方法随之可控。

现在可明确攻击者的攻击路径,首先创建Token合约,并在合约中的safeTransferFrom方法中写入重新调用GrimBoostVault.depositFor方法的逻辑,在进行多次重入后最后传入一笔正常的Token代币质押,之后虽然会进入到正常流程,但是由于之前的多次重入,导致获取合约余额的前后差值过大,最终铸造了大量的证明代币。

例如:攻击者进行了6次重入,最后一次传入资金为100,那么最终得到的差值就是100*6,铸币时的计算值也是600。

重入成功后,攻击者调用withdrawAll方法归还重入获取的大量证明代币获取对应的质押资金,完成获利。

目前,Grim Finance官方已暂停所有金库,并提醒用户尽快提取自身所有资金,暂未声明合约修改方案和补偿方案。

0x5 总结

通过此次攻击事件来看,攻击者主要利用GrimBoostVault合约depositFor方法未进行Token地址检查,通过多次重入造成巨大的合约余额差值,铸造大量资金,随后通过withdrawAll方法取走获利的资金,DeFi项目中类似的攻击事件居多,为何还会频频发生,对于DeFi项目而言,合约代码的安全,代币价格的相对稳定,方法传参的可控性,旧版本的及时更新都是保证项目安全极其重要的部分,任何细节的马虎都可能导致项目及用户资金受到损失。对于此类闪电贷攻击事件,零时科技安全团队给出以下建议。

0x6 安全建议

对于合约代码安全,可找多家安全审计公司进行审计。

对于涉及资金转账的方法,应进行严格的权限控制。

对敏感性较强的代码,要做到及时更新完善。

  • 发表于 15小时前
  • 阅读 ( 54 )
  • 学分 ( 0 )
  • 分类:资讯

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK