0x01:前言
援引官方消息,北京时间12月19日,Fantom链上复合收益平台GrimFinance遭遇了闪电贷攻击。知道创宇区块链安全实验室第一时间对本次事件深入跟踪并进行分析。
0x02:事件详情
交易细节如下图所示:
浏览上图的交易过程可知,攻击合约利用闪电贷借取代币WFTM和BTC,将借取的代币与自己铸造的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在攻击者通过depositFor()实现质押的过程中。
通过Tenderly调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:
CoinFLEX联创:愿意以OPNX相关权益换取Bitcoin.com以及BlockChain.com创始人还款并达成和解:4月5日消息,CoinFLEX 联创 Mark Lamb 在社交媒体上发文表示,希望与 Bitcoin.com 创始人 Roger Ver 以及 BlockChain.com 创始人兼首席执行官 Peter Smith 达成和解,以 OPNX 相关权益换取二者早日归还欠款。
Mark Lamb 表示,若 Bitcoin.com 创始人 Roger Ver 能如约向 CoinFLEX 支付应付的 8400 万美元款项(借款为 4700 万美元,最终赤字为 8400 万美元),Mark 愿意为 Roger 免去 2 年 OPNX 平台交易手续费。若 BlockChain.com 创始人 Peter Smith 能归还其欠 CoinFLEX 的 300 万枚 FLEX,Mark 愿意给予 Peter 获得 OPNX 股权的机会。[2023/4/5 13:46:41]
NEAR发布修复漏洞的1.31.1版本,建议所有节点运营商立即升级:金色财经报道,NEAR Core 发布 1.31.1 版本 ,该版本修复了此前块结果根验证中的漏洞和总供应量验证中的漏洞。超过 2/3 的主网区块验证节点已于该版本发布之前部署了该版本中的相同补丁,从而保护主网免受与该漏洞相关的攻击。NEAR 建议所有尚未直接修补其节点的节点运营商立即更新。
此前 2 月 11 日,NEAR 中发现涉及块结果根验证的漏洞,作为预防措施,Rainbow Bridge被暂停,团队修复后,Rainbow Bridge于 2 月 13 日完全恢复,可以进行新的代币跨链,没有资金损失。[2023/2/16 12:11:09]
0x03:漏洞分析
depositFor()函数位于的第1115行:
function?depositFor(address?token,?uint?_amount,address?user?)?public?{
Ari Paul:BTC在2024年底会超过11万美元:金色财经报道,区块链投资公司Blocktower Capital创始人Ari Paul在社交媒体上称,我认为BTC在2024年底会超过11万美元。(目前的价格是23000美元)。 如果我们只考虑当前的周期,感觉是相对激进的预测,但放大到2017年,感觉是相当合理的。我们现在已经有5年的价格压缩期了。没有什么是可以保证的,没有人知道未来,我只能提供有根据的猜测。要怎样才能做到这一点呢?目前BTC市值为4430亿美元,我们将有大量新的加密货币交易产品(基金、交易所产品等),可以像GBTC那样带来可观的法币收入。
此外,11万美元将是2021年ATH的2倍。在目前的宏观环境下,这对我来说是可信的,但具有挑战性。如果我们回到宏观风险上,只是回到2021年狂热的一半,11万美元感觉是相当保守的。
这个预测如果是错的?如果我们出现全面衰退,下个季度股票下跌30%,我的基本情况将是BTC的新低点。 也许我们在2024年底低于12000美元,而不是高于110000美元。 还有许多其他风险。[2023/1/29 11:34:38]
?uint256?_pool?=?balance();
韩国拟将统一加密交易所的代币上市和退市标准:6月7日消息,韩国监管当局将于 6 月 13 日举行座谈会,公布自律规章,虚拟资产特别委员会、金融委员会、金融监督院、金融信息分析院和五大虚拟资产交易所(Upbit、Bithumb、Korbit、Coinone、Gopax)的代表将出席会议,内容包括交易所们统一代币上市标准和退市标准、制定自律性方针等内容。(韩国每日新闻)[2022/6/7 4:07:42]
?IERC20(token).safeTransferFrom(msg.sender,?address(this),?_amount);
?earn();
?uint256?_after?=?balance();
?_amount?=?_after.sub(_pool);?//?Additional?check?for?deflationary?tokens
数字钱包Coingrig集成Nordigen的开放式银行平台:金色财经报道,数字钱包Coingrig 集成了 Nordigen 的开放式银行平台,以提高银行与其数字钱包的连接性。Coingrig 是下一代数字钱包,允许用户在一个地方管理他们所有的个人财务和资产。从加密货币到传统银行业务,该钱包为用户提供安全访问其加密货币和银行账户余额的功能,同时还可以跟踪他们的股票市场、ETF 或商品持有量。
通过他们的钱包,用户可以以低廉的费用购买和出售加密货币,可以访问多个区块链上的超过一百万个交易代币,连接他们的中心化交易所持股以及与各种去中心化交易所集成的统一交换功能。钱包是安全的、非托管的,用户无需注册即可访问它。(finextra)[2022/5/29 3:48:15]
?uint256?shares?=?0;
?if?(totalSupply()?==?0)?{
??shares?=?_amount;
?}?else?{
??shares?=?(_amount.mul(totalSupply())).div(_pool);
?}
?_mint(user,?shares);
}
该函数的safeTransferFrom()方法从IERC20(token)调用,调用完该方法后,余额balance也会随之变动,最后通过_mint()方法向用户添加质押凭证代币。其中调用的变量token可控,导致攻击者可以自己实现safeTransferFrom()方法,将该方法重入到depositFor()发起攻击。
以实施了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方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。
对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。
来源:金色财经
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。