前言

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

事件详情

交易细节如下图所示:

浏览上图的交易过程可知,攻击合约(0xb08ccb39741d746dd1818641900f182448eb5e41)利用闪电贷借取代币,将借取的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在depositFor()函数中。

通过Tenderly(https://dashboard.tenderly.co/tx/fantom/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6/debugger 调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:

漏洞分析

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

function depositFor(address token, uint _amount,address user ) public {uint256 _pool = balance();IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);earn();uint256 _after = balance();_amount = _after.sub(_pool); // Additional check for deflationary tokensuint256 shares = 0;if (totalSupply() == 0) {shares = _amount;} else {shares = (_amount.mul(totalSupply())).div(_pool);}_mint(user, shares);
}

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

我们推导其公式为:

将该公式分子拆分,得到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的质押凭证代币。





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

修复方案

  1. 由于depositFor()方法里的token可控才是导致这次攻击事件的原因,因此只需要在传递参数的时候让token不可控就行:
function depositFor( uint _amount,address user ) public
  1. 由于套利的原因是depositFor()方法里存在修改代币数量的函数,因此还可以将修改代币的方法单独实现,这样即使token变量可控,也无法成功套利:
function depositFor(address token, uint _amount,address user ) public {IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);
}
  1. 锁定交易token:
function setLPToken(address lp) public onlyOwner {lpToken = lp;
}
function depositFor(uint _amount,address user ) public {uint256 _pool = balance();IERC20(lpToken).safeTransferFrom(msg.sender, address(this), _amount);earn();......
}

总结

经过完整分析,知道创宇区块链安全实验室 明确了该次攻击事件的源头并非网传的闪电贷攻击,攻击者利用GrimBoostVault合约的depositFor方法参数可控,实施了重入攻击,将自己的铸造的无价值代币兑换成了质押凭证,最后通过withdrawAll方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。

对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。

Grim Finance闪电贷安全事件分析相关推荐

  1. 一念天堂一念地狱——Impossible Finance 闪电贷攻击事件跟踪

    前言 6 月 20 日,BSC 链上的 DeFi 项目 Impossible Finance 突然遭遇闪电贷袭击,本是涨势喜人的 IF 代币从此也一蹶不振,价值一路下滑.知道创宇区块链安全实验室 第一 ...

  2. 知道创宇区块链安全实验室 | OneRing Finance 闪电贷攻击事件分析

    前言 北京时间 2022 年 3 月 22 日,知道创宇区块链安全实验室 监测到 Fantom 生态稳定币收益优化器 OneRing Finance 遭到闪电贷攻击,黑客窃取逾 145万 美元. 分析 ...

  3. Yearn Finance闪电贷攻击分析学习

    合约代码: https://etherscan.io/address/0xacd43e627e64355f1861cec6d3a6688b31a6f952#code https://etherscan ...

  4. 又发闪电贷价格操纵攻击?—— welnance.finance事件分析

    前言 11月13日,知道创宇区块链安全实验室 监测到 BSC 上的 DeFi 协议 welnance.finance 遭遇闪电贷价格操控攻击.实验室第一时间对本次事件深入跟踪并进行分析. 事件分析 基 ...

  5. 创宇区块链|Inverse Finance 安全事件分析

    前言 北京时间 2022 年 4 月 2 日晚,Inverse Finance 借贷协议遭到攻击,损失约 1560 万美元.知道创宇区块链安全实验室第一时间跟踪本次事件并分析. 分析 基础信息 攻击t ...

  6. 知道创宇区块链安全实验室|Hundred 与 Agave 闪电贷攻击事件分析

    1.前言 北京时间 3 月 15 日晚,知道创宇区块链安全实验室 监测到 Gnosis 链上的借贷类协议 Hundred Finance 与 Agave 均遭遇了闪电贷袭击,包括 AAVE 的分支 A ...

  7. Belt Finance 遭闪电贷攻击,Fork Curve 的潘多拉魔盒已打开?

    北京时间 5 月 30 日,PeckShield 「派盾」预警显示,BSC 链上结合多策略收益优化的 AMM 协议 Belt Finance 遭到闪电贷攻击. PeckShield 「派盾」通过追踪和 ...

  8. 零时科技 | Discover 闪电贷攻击事件分析

    0x1 事件背景 零时科技区块链安全情报平台监控到消息,北京时间 2022年6月6日 Binance 链上 Discover 智能合约遭到闪电贷攻击.零时科技安全团队及时对此安全事件进行分析. 0x2 ...

  9. 黑客如何欺骗闪电贷和套利的DeFi 项目

    黑客如何欺骗闪电贷和套利的DeFi 项目 自去年以来,DeFi市场发生了数十起安全事件.DeFi是一个新兴的投资行业,有很多风险,但这也意味着用户可用的空间可能很少,当用户知之甚少时,名义上的交易会让 ...

最新文章

  1. 城科会刘朝晖:从互联网大脑模型看城市大脑
  2. Openfire 代码部署报错: Variable references non-existent resource:${workspace_loc:openfire_src}...
  3. 生活中人人都是主角,也都不是主角
  4. java配置文件扫描包_SpringMVC和Spring的配置文件扫描包详解
  5. Geek的入门神器:micropython-能跑python的stm32开发板
  6. Python模块——_winreg操作注册表
  7. 简单的三步教你下载PyCharm汉化插件,让你学习Python事功半倍
  8. 基于JEECG框架,前台VUE,后台java,导入导出
  9. 冬幕节成就任务攻略指引
  10. chrome driver 环境问题
  11. ListView源码(推荐)
  12. admin是谁,以及如何修改admin密码
  13. 北航计算机机试13真分数约分
  14. GitHub 热点速览 Vol.16:化身蒙娜丽莎和乔布斯对话
  15. sprintf 函数的详解
  16. windows应用程序与控制台应用程序的区别
  17. 静态HTML网页设计作品—绿色古典旅游景区(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品
  18. 关于我成为大学生一个半月后的自我反思
  19. XP Sp3 开机就要激活,否则无法登录windows桌面
  20. qq服务器断掉修改昵称,qq昵称修改 更新资料失败

热门文章

  1. java面试题【北京2023版】
  2. python 源码解析 object 定义的介绍
  3. dbeaver 数据库客户端
  4. 联通宽带固定ip设置 为了内部测试稳定性和便捷性
  5. ubuntu下libmodbus库的使用
  6. 用虚幻引擎制作逼真毛发:获取白皮书!
  7. linux系统触摸板设备文件,Linux系统下笔记本触摸板的起停
  8. Flash download tool 下载报错的弹窗信息对应的原因
  9. ###turtle正方形绘制###python
  10. 使用Python和Asyncio编写在线多人游戏(一)