首发 | 一个小数点造成数百万美元蒸发 Fantasm Finance攻击事件分析 CertiK中文社区 刚刚
北京时间2022年3月9日21:50,CertiK安全专家团队检测到Fantasm Finance抵押池被恶意利用。
攻击者铸造了大量的XFTM代币,并将其交易为ETH,总损失约为1000ETH(价值约270万美元)。
下文CertiK安全团队将从合约地址及攻击操作等方面为大家进行详细的解读并分析。
攻击步骤
①攻击者在地址0x944b58c9b3b49487005cead0ac5d71c857749e3e部署了一个未经验证的合约。
②在第一个tx中,攻击者将Fantom代币(FTM)换成FSM代币,并在合约0x880672ab1d46d987e5d663fc7476cd8df3c9f937中调用mint()函数。
③攻击者调用collect()函数,以此铸造了超出权限更多的XFTM代币。
④攻击者多次重复步骤②和③,造成Fantasm Finance巨额损失。
漏洞分析
在函数calcMint中,合约使用以下公式来计算铸币量:
_xftmOut = (_fantasmIn * _fantasmPrice * COLLATERAL_RATIO_MAX * (PRECISION - mintingFee)) PRECISION (COLLATERAL_RATIO_MAX - collateralRatio) PRICE_PRECISION。
由于小数点错误,导致_xftmOut最终的值远远大于代码的设计初衷。
资金去向
攻击者可因此获取大约1000个ETH,所有的资金均被转移至Etherscan(地址为0x47091e015b294b935babda2d28ad44e3ab07ae8d)并被发送到tornado proxy。
写在最后
本次事件主要是由合约公式计算错误引起的。
只需通过适当的同行评审、单元测试和安全审计,这一类型的风险往往极易避免。
在加密世界里大家一提到漏洞,往往会认为漏洞必然是很复杂的,其实并非总是如此。有时一个小小的计算错误,就可以导致数百上千万美元的资产一朝蒸发。
本次事件的预警已于第一时间在CertiK项目预警推特【https://twitter.com/CertiKAlert】进行了播报。
近期攻击事件高发,加密项目方及用户们应提高相关警惕并及时对合约代码进行完善和审计。
除此之外,技术团队应及时关注已发生的安全事件,并且检查自己的项目中是否存在类似问题。


