0x01:前言
援引官方消息,北京时间12月19日,Fantom链上复合收益平台GrimFinance遭遇了闪电贷攻击。知道创宇区块链安全实验室第一时间对本次事件深入跟踪并进行分析。0x02:事件详情
交易细节如下图所示:
浏览上图的交易过程可知,攻击合约利用闪电贷借取代币,将借取的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在depositFor()函数中。通过Tenderly(https://dashboard.tenderly.co/tx/fantom/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6/debugger调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:
BlockApps与拜耳合作 推出基于以太坊的Agritech网络:区块链解决方案提供商BlockApps近日启动了一个基于区块链的农作物追踪网络,称为“TraceHarvest”,而拜耳就是其最早的用户之一。据报道,TraceHarvest为用户提供了从种子源开始追踪农产品生命周期的能力,一直到定义供应链中每一方的责任。该平台还为用户提供实时信息,理想情况下可减轻与手动跟踪作物有关的问题。TraceHarvest对供应链的所有参与者(如农民,经销商,制造商,分销商和技术提供商)开放,并且还旨在为农民提供进入新市场并创造额外收入的机会。除了跟踪农作物,该平台还可以用于环境保护和消费者保护,例如碳补偿信用额和食品安全召回。此外,该公司希望研究人员可以使用平台上存储的数据来使食品供应链更具可持续性。(Cointelegraph)[2020/11/23 21:44:36]
动态 | 古灵币Grin推出最新挖矿算法 最快在12月19日上线测试网:匿名币项目古灵币 Grin 在其大会 GrinCon1 中宣布将推出工作量证明算法家族 Cuckoo 的最新一代 Cuckaroom,进一步推进 GPU 挖矿转换为专用设备 ASIC 挖矿设备的进程,并计划于 12 月 19 日左右在测试网 Floonet 上激活该算法。此前,匿名币项目古灵币 Grin 公布了其 3.0 版本的计划草案,预计在区块高度 524,160 进行第二次硬分叉升级,也就是 2020 年 1 月 15 日左右。[2019/11/26]
0x03:漏洞分析
depositFor()函数位于https://ftmscan.com/address/0x660184ce8af80e0b1e5a1172a16168b15f4136bf#code的第1115行:
动态 | Grin完成主网第一次硬分叉升级:匿名币项目Grin表示,在北京时间7月17日下午17:45 左右,在区块高度262,080成功完成第一次硬分叉升级。[2019/7/17]
该函数的safeTransferFrom()方法从IERC20(token)调用,最后一次调用,也就是逆序第一次执行后,余额balance也会随之变动。当前铸造凭证数量/前一笔铸造凭证数量固定为3.54:
我们推导其公式为:
动态 | Grin现已上线Bittrex International:Grin现已上线Bittrex International,并已开通其存款和交易业务,此外将很快开放Grin提币业务。[2019/2/10]
将该公式分子拆分,得到shares/totalSupply的固定比为2.54:
最后将Debug交易里的shares/totalSupply进行计算,其值与shares/totalSupply的固定比相同,因此可以确定套利值只与totalSupply()有关:
金色财经现场报道 Ian Grigg称区块链需要“守门人”:金色财经现场报道,4月6日晚间,备受瞩目的EOS.io香港见面会如期举办,EOS团队Block.one核心成员出席此次活动,与1500名来自世界各地区块链社区开发人员、区块链爱好者会面。Ian Grigg说:“强调区块链去中心化于是想要推翻“围墙”,其实这并不是必须的。我们需要一个“守门人”去控制删选风险。eos设定了21个超级节点,可以通过这种把控来处理和应对“黑天鹅”的问题,把风险降到最低。eosio设定的21个节点数量‘正合适’是根据经验来定的,平衡中心化与过分分散化的最佳数量。”[2018/4/7]
其中函数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方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。