0x01:前言
援引官方消息,北京时间12月19日,Fantom链上复合收益平台GrimFinance遭遇了闪电贷攻击。知道创宇区块链安全实验室第一时间对本次事件深入跟踪并进行分析。0x02:事件详情
交易细节如下图所示:
浏览上图的交易过程可知,攻击合约利用闪电贷借取代币,将借取的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在depositFor()函数中。通过Tenderly(https://dashboard.tenderly.co/tx/fantom/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6/debugger调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:
?Binance Labs 启动第 4 季孵化计划,FilSwan、Grindery、NuLink 等 14 个项目入围:5月4日消息,?Binance Labs 宣布将于 5 月 5 日启动第 4 季孵化计划,共 14 个项目从超 500 个项目中入围,包括 FilSwan、Grindery、NuLink、Starton、CODA Ventures、OpenLeverage、AlterVerse、ChapterX、CoralApp、Gamic Guild、Qwestive、Reveel、Playbux、Ambrosia 等。[2022/5/4 2:50:08]
Grim Finance遭遇闪电贷攻击,损失超3000万美元:12月19日消息,据官方消息,Fantom链上复合收益平台GrimFinance遭遇闪电贷攻击,目前损失已超3000万美元。攻击者使用GrimFinance的保险库策略中名为「beforeDeposit()」的函数进行攻击,输入恶意Token合约。目前GrimFinance已经暂停所有的金库,提醒用户立即撤回所有资产。[2021/12/19 7:49:10]
0x03:漏洞分析
depositFor()函数位于https://ftmscan.com/address/0x660184ce8af80e0b1e5a1172a16168b15f4136bf#code的第1115行:
声音 | 余弦:Grin和Beam的重要突破点只有暗网接受:慢雾科技联合创始人余弦在微博上表示:Grin 和 Beam 的重要突破点只有一个:暗网接受。其他匿名币同理,否则别谈核心价值。 ???暗网目前接受主要列表:BTC BCH LTC ETH XMR ZEC DASH XRP DOGE。[2019/7/15]
该函数的safeTransferFrom()方法从IERC20(token)调用,最后一次调用,也就是逆序第一次执行后,余额balance也会随之变动。当前铸造凭证数量/前一笔铸造凭证数量固定为3.54:
动态 | 武汉芯动宣布预售 Grin ASIC 矿机:武汉矿机生产商芯动科技 Innosilicon 宣布了 ASIC 矿机的预售,最终规格和交货期将在 4 月 31 日前公布。部分规格详情如下:算力比最好的 GPU 强大和高效多倍,预计 4 月 15 日前公布;功耗小于 500 瓦(±10%,正常模式,壁式,93%,25°C );尺寸待定,家庭友好型;净重小于 5 千克。[2019/2/27]
我们推导其公式为:
动态 | 门罗开发者首谈Grin:并不害怕被取代:据ambcrypto消息,在近期的一场活动中,莱特币创始人李启威(Charlie Lee)、门罗开发者Riccardo Spagni以及Whale Panda讨论了有关Grin和Beam的话题。当被问到是否因这个新的隐私币感到不安时,Riccardo Spagni回答,他对一切能够改善隐私的事物都表示支持。他表示将来会经常diss Grin和Beam,因为在他看来,有批评才有进步。他接着说,他不会受到货币威胁的原因是,这并不能阻止Monero的存在。另外,他还透露门罗正在部署MimbleWimble协议。随后,李启威也对Grin和Beam做出了评价,认为它们能够“在不做出任何妥协的情况下实现隐私和延展性”。当被问到这一协议是否可能作为侧链部署到比特币网络或直接进入比特币网络时,李启威回答,重点在于侧链的安全性。[2019/1/21]
将该公式分子拆分,得到shares/totalSupply的固定比为2.54:
最后将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方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。