零时科技 || Spectra 攻击事件分析
2024-07-26 13:43
零时科技
2024-07-26 13:43
订阅此专栏
收藏此文章


背景介绍


2024 年 7 月 23 日,我们监控到一笔 Ethereum 链上攻击交易:https://etherscan.io/tx/0x491cf8b2a5753fdbf3096b42e0a16bc109b957dc112d6537b1ed306e483d0744

被攻击的项目为Spectra Protocol,Spectra 协议是无需许可的,意味着其服务完全开放供公众使用。任何人都可以随意创建新的市场、交换收益衍生品或成为流动性提供者。此次攻击中,攻击者共获利188, 013asdCRV,折合73, 325USD。 



攻击及事件分析


首先,攻击者查询了 asd CRV Token 中,地址 0x279a7dbfae376427ffac52fcb0883147d42165ff对 Spectra Protocol 的授权额度与该地址的 asd CRV 余额。



接着,攻击者调用 execute 函数开始针对 Spectra Protocol 进行攻击,execute 函数代码如下:



最终,输入数据会调用_dispatch,该函数的代码如下:



由上述代码我们可以看出,该代码根据_commandType来决定执行哪些操作,在此次攻击中,_commandType 为 0x12 ,所以 command=0x12&0x3f=0x12,对应的值为 KYBER_SWAP



所以,攻击者调用代码段如下。我们可以看到,该代码的kyberRoutertargetData均可以被控制,意味着攻击者可以利用 Spectra Protocol 合约调用任意合约并传入任意参数。



我们将攻击者的inputs 数据解析出来如下:



我们可以发现,kyberRouter 已经被操纵为地址:

0x43e54c2e7b3e294de3a155785f52ab49d87b9922


tokenIn 已经被操纵为地址:

0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee


tokenOut 被操纵为地址:

0xba8ce86147ded54c0879c9a954f9754a472704aa


我们可以看到 Constants.ETH 为:

0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE



所以,代码进入到如下流程



其中,targetData 经过解析如下:



由于,transferFrom 的 signature 为 0x23b872dd;所以,transferFrom 对应的参数 from 为:

0x279a7dbfae376427ffac52fcb0883147d42165ff


to 为:

0xba8ce86147ded54c0879c9a954f9754a472704aa


value 为:

188,013,365,080,870,249,823,427


又因为,kyberRouter 被控制为:

0x43e54c2e7b3e294de3a155785f52ab49d87b9922,即 asdCRVToken。


所以,攻击者相当于操纵了 Spectra Protocol 从 0x279a7dbfae376427ffac52fcb0883147d42165ff 转了 188,013,365,080,870,249,823,427asdCRV 到地址 0xba8ce86147ded54c0879c9a954f9754a472704aa(此地址为攻击者控制的地址)。

至此,攻击者完成攻击。 



总结


本次漏洞的成因是被攻击合约对攻击者传入参数校验不严格,导致攻击者可以通过构造特殊的inputData来使受害者合约调用任意合约并传入任意参数。最终,攻击者利用特殊的参数,使得受害者合约通过transferFrom将授权给其合约的代币转入到攻击者控制的地址。建议项目方在设计代码运行逻辑时要多方验证,合约上线前审计时尽量选择多个审计公司交叉审计。 




若需了解更多产品信息或有相关业务需求,可扫码关注公众号或移步至官网:


微信号noneage

官方网址https://noneage.com/





推荐阅读

REVIEW




END





点击阅读全文 立刻直达官网

     /www.noneage.com/    


【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

零时科技
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开