0x01:前言
援引官方消息,北京时间12月19日,Fantom链上复合收益平台GrimFinance遭遇了闪电贷攻击。知道创宇区块链安全实验室第一时间对本次事件深入跟踪并进行分析。
0x02:事件详情
交易细节如下图所示:
浏览上图的交易过程可知,攻击合约利用闪电贷借取代币WFTM和BTC,将借取的代币与自己铸造的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在攻击者通过depositFor()实现质押的过程中。
通过Tenderly调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:
Swell Network的swETH/ETH池已上线Balancer和Aura Finance:5月9日消息,以太坊质押协议 Swell Network 的 swETH/ETH 流动性池已上线 Balancer 和基于 Balancer 的生态收益治理平台 Aura Finance。[2023/5/9 14:51:26]
0x03:漏洞分析
depositFor()函数位于的第1115行:
function?depositFor(address?token,?uint?_amount,address?user?)?public?{
法律专家:Mango Markets案例会影响DAO未来如何实施其法律和治理结构:2月4日消息,加拿大律师事务所McMillan LLP的合伙人Benjamin Bathgate表示,针对所谓的Mango Markets漏洞利用者Avraham Eisenberg的诉讼可能会影响DAO未来如何实施其法律和治理结构。Bathgate表示,在很多情况下,DAO只是用户的集合,这是一个用户社区,也许有一个核心贡献者负责编码。管理Mango Market DAO的怀俄明州有限责任公司Mango Labs正在寻求收回剩余的4700万美元。然而,Bathgate表示,Mango Labs的诉讼不太可能成功,到那时可能会为DAO生态系统敲响警钟。
此前报道,Mango Markets攻击者Avraham Eisenberg在纽约美国地方法院第一次听证会上放弃保释。目前,Avraham正被Mango Labs起诉,要求赔偿剩余的4700万美元,他被指控犯有商品欺诈、商品操纵和电汇欺诈三项刑事罪。[2023/2/4 11:46:50]
?uint256?_pool?=?balance();
22,152枚ETH从未知钱包转移到CryptoCom:金色财经报道,WhaleAlert监测数据显示,22,152枚ETH(价值约26,860,583美元)从未知钱包转移到CryptoCom。[2022/11/28 21:05:30]
?IERC20(token).safeTransferFrom(msg.sender,?address(this),?_amount);
?earn();
?uint256?_after?=?balance();
?_amount?=?_after.sub(_pool);?//?Additional?check?for?deflationary?tokens
?uint256?shares?=?0;
数据:近24小时全网爆仓2.35亿美元:金色财经报道,据Coinglass数据,近24小时全网爆仓2.35亿美元,其中以太坊爆仓784.46万美元,比特币爆仓686.61万美元。[2022/9/23 7:15:09]
?if?(totalSupply()?==?0)?{
??shares?=?_amount;
?}?else?{
??shares?=?(_amount.mul(totalSupply())).div(_pool);
?}
?_mint(user,?shares);
}
该函数的safeTransferFrom()方法从IERC20(token)调用,调用完该方法后,余额balance也会随之变动,最后通过_mint()方法向用户添加质押凭证代币。其中调用的变量token可控,导致攻击者可以自己实现safeTransferFrom()方法,将该方法重入到depositFor()发起攻击。
持有1枚以上ETH的地址数量达到历史新高:金色财经报道,Glassnode数据显示,持有1+ETH硬币的地址数量刚刚达到1,564,372的历史新高。[2022/7/27 2:40:22]
以实施了5次重入攻击为例,开始_pool的值为0,在重入depositFor方法的前四次里,攻击者一直传入自己铸造的代币,_pool的值会一直保持为0,但在第五次,也就是最后一次传入100个受认可的代币时,_after的值会变成100,而_afer-_pool的差值_amount也就是100,最后由于重入了5次,导致合约会向攻击者铸造100*5的质押凭证代币。
其后果就是攻击者向该合约质押自己铸造不受认可的代币,同样会增加质押总量,最后利用多出来的质押凭证实现套利。
0x04:修复方案
1.由于depositFor()方法里的token可控才是导致这次攻击事件的原因,因此只需要在传递参数的时候让token不可控就行:
function?depositFor(?uint?_amount,address?user?)?public
2.由于套利的原因是depositFor()方法里存在修改代币数量的函数,因此还可以将修改代币的方法单独实现,这样即使token变量可控,也无法成功套利:
function?depositFor(address?token,?uint?_amount,address?user?)?public?{
?IERC20(token).safeTransferFrom(msg.sender,?address(this),?_amount);
}
3.锁定交易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();
......
}
0x05:总结
经过完整分析,知道创宇区块链安全实验室明确了该次攻击事件的源头并非网传的闪电贷攻击,攻击者利用GrimBoostVault合约的depositFor方法参数可控,实施了重入攻击,将自己的铸造的无价值代币兑换成了质押凭证,最后通过withdrawAll方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。
对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。
来源:金色财经
标签:TOKETOKENKENTOKViaBTC TokenKuCoin TokenRizz Tokendbktoken
???从《礼记·礼运》到辛亥革命,从独立宣言到法国大革命,从马列主义到中国特色社会主义,无论是思想理论还是革命实践,全人类都在朝着构建共建共治共享的社会治理共同体而努力.
1900/1/1 0:00:00近日,比特小鹿集团董事长、比特大陆和Matrixport联合创始人吴忌寒接受了福布斯的采访。自从与比特大陆另一位创始人詹克团经历股权纠纷之后,吴忌寒已鲜少露面.
1900/1/1 0:00:00任何一个领域的爆发都有其背后更深层次的原因,比如大环境影响、行业领袖表率、市场认可、用户信任、资本投入等等.
1900/1/1 0:00:00年年岁岁花相似,岁岁年年人不同,曾经的我你爱理不理,现在的我你高攀不起,感情如是,投资又何尝不如是!发现、投入、持住、成功这是一个考验眼光,且磨人的过程,多少人半途而废,几个人坚持到最后.
1900/1/1 0:00:00在世界范围内,人们正日益关注着货币的隐私存储作用。在货币交易中,完备的隐私保护与其匿名性特征相契合.
1900/1/1 0:00:00原文来自:通证通研究院?×?FENBUSHIDIGITAL文:宋双杰,CFA;王新刚特别顾问:沈波;Rin2018年8月.
1900/1/1 0:00:00