零时科技 || Spectra攻击事件分析

Ethereum链上的Spectra Protocol项目遭受攻击,攻击者共获利188, 013 asdCRV。攻击者利用特殊的参数,使得受害者合约通过 transferFrom 将授权给其合约的代币转入到攻击者控制的地址

微博文章封面(事件).jpg

背景介绍

<!--StartFragment-->

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

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

<!--EndFragment-->

攻击及事件分析

<!--StartFragment-->

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

<!--EndFragment-->

1.png <!--StartFragment-->

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

<!--EndFragment-->

2.png <!--StartFragment-->

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

<!--EndFragment-->

3.png <!--StartFragment-->

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

<!--EndFragment-->

4.png <!--StartFragment-->

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

<!--EndFragment-->

5.png <!--StartFragment-->

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

<!--EndFragment-->

6.jpg <!--StartFragment-->

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

0x43e54c2e7b3e294de3a155785f52ab49d87b9922

tokenIn已经被操纵为地址:

0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

tokenOut被操纵为地址:

0xba8ce86147ded54c0879c9a954f9754a472704aa

我们可以看到Constants.ETH为:

0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE

<!--EndFragment-->

7.png <!--StartFragment-->

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

<!--EndFragment-->

8.png <!--StartFragment-->

其中,targetData经过解析如下:

<!--EndFragment-->

9.jpg

<!--StartFragment-->

由于,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(此地址为攻击者控制的地址)。

至此,攻击者完成攻击。 

<!--EndFragment-->

总结

<!--StartFragment-->

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

<!--EndFragment-->

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
零时科技
零时科技
0xbD0b...A354
专注区块链生态安全