0x01:前言
援引官方消息,北京时间12月19日,Fantom链上复合收益平台GrimFinance遭遇了闪电贷攻击。知道创宇区块链安全实验室第一时间对本次事件深入跟踪并进行分析。0x02:事件详情
交易细节如下图所示:
浏览上图的交易过程可知,攻击合约利用闪电贷借取代币,将借取的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在depositFor()函数中。通过Tenderly(https://dashboard.tenderly.co/tx/fantom/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6/debugger调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:
前众议院议长Newt Gingrich希望中央银行持有比特币,以对冲通胀:10月24日消息,美国前众议院议长纽特·金里奇 (Newt Gingrich) 担忧通胀,他建议各国应在其货币储备中持有比特币,以对冲通胀。Gingrich目前是以色列公司国际比特币咨询公司 (IBAC) 的顾问,他认为新兴经济体将从采取这样的行动路线中受益最大。(zycrypto)[2021/10/24 6:10:31]
0x03:漏洞分析
depositFor()函数位于https://ftmscan.com/address/0x660184ce8af80e0b1e5a1172a16168b15f4136bf#code的第1115行:
Integritee与KILT Protocol合作,以实现SocialKYC公开认证:10月20日消息,区块链隐私公司Integritee宣布与开源区块链协议KILT Protocol达成合作,这一合作将允许KILT的身份验证服务SocialKYC在区块链分类帐上由用户公开审计。[2021/10/20 20:43:34]
该函数的safeTransferFrom()方法从IERC20(token)调用,最后一次调用,也就是逆序第一次执行后,余额balance也会随之变动。当前铸造凭证数量/前一笔铸造凭证数量固定为3.54:
Grin开发者:莱特币MimbleWimble协议代码将于2021年第一季度准备就绪:金色财经报道,Grin开发者David Burkett在推特表示,莱特币MimbleWimble协议的代码将于2021年第一季度准备就绪。激活时间将根据用户和矿工随后很快进行。此前消息,莱特币基金会于2019年10月发布莱特币改进提案草案LIP-0002和LIP-0003,旨在为莱特币网络整合MimbleWimble协议,以建立隐私功能。[2020/12/31 16:07:28]
我们推导其公式为:
Grin网络遭受51%攻击,官方提醒用户等待交易的额外确认:据报道,Grin网络最近遭受51%攻击。一个未知实体在周六控制了超过57%的网络算力。根据Grin网站的说法,该团队建议人们等待“关于支付最终性(Finality)的额外确认”。
根据Grin网站11月9日发布的提醒公告,“重要通知:Grin网络算力在短时间内大幅提高。值得注意的是,这与Nicehash速率翻倍的时间相吻合,目前超过50%的网络算力在已知池之外。考虑到这些情况,明智的做法是等待对交易的额外确认,以确保支付的最终性。”
据此前报道,11月8日,2Miners发推表示,Grin Network正受到51%攻击,付款已停止。请自行承担风险,因为新的区块可能会被拒绝。(Bitcoin.com)[2020/11/10 12:10:25]
将该公式分子拆分,得到shares/totalSupply的固定比为2.54:
分析 | 新买矿机进行 Grin 挖矿几乎不可能回本:全球通证数据与评级机构 TokenInsight 在热门匿名币 Grin 主网上市前发表该项目挖矿收益与投资策略研究报告,指出如果新买矿机进行 Grin 挖矿几乎不可能回本;而在 Grin 挖矿中,NVIDA 卡相较于 AMD 卡在算力与功耗上更具有优势。
TokenInsight 通过成本/收入模型测算指出,假设电费为 0.4 元/度,利用 GTX1080Ti 进行挖矿,当 Grin 币价比难度(以 M 计)大于千分之 4.2 时,至少能够赚回电费。此外,TokenInsight 参照 Beam 主网上线之后的表现指出,矿工在上线第一天立刻开始挖矿并及时卖出,相对而言会一个较佳选择。[2019/1/15]
最后将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方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。