{"author":{"address":"0xbD0b3505cc45d97DdB3e7FAa75ED0Fc41c61A354","user":"https://learnblockchain.cn/people/52"},"content":{"body":"![微博文章封面(事件).jpg](https://img.learnblockchain.cn/attachments/2024/07/4KmciwCR66a33e942476e.jpg)\r\n\r\n\r\n# **背景介绍**\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n2024年7月23日，我们监控到一笔Ethereum链上攻击交易：**https\\://etherscan.io/tx/0x491cf8b2a5753fdbf3096b42e0a16bc109b957dc112d6537b1ed306e483d0744**\r\n\r\n被攻击的项目为**Spectra Protocol**，Spectra协议是无需许可的，意味着其服务完全开放供公众使用。任何人都可以随意创建新的市场、交换收益衍生品或成为流动性提供者。此次攻击中，攻击者共获利**188, 013asdCRV**，折合**73, 325USD**。 \r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n# **攻击及事件分析**\r\n\u003c!--StartFragment--\u003e\r\n\r\n首先，攻击者查询了asd CRV Token中，地址 **0x279a7dbfae376427ffac52fcb0883147d42165ff**对Spectra Protocol的授权额度与该地址的asd CRV余额。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n![1.png](https://img.learnblockchain.cn/attachments/2024/07/W2J7s6rq66a33cdb9799c.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n接着，攻击者调用execute函数开始针对Spectra Protocol进行攻击，execute函数代码如下：\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![2.png](https://img.learnblockchain.cn/attachments/2024/07/RbDKJ1L366a33cea4bf49.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n最终，输入数据会调用**_dispatch**，该函数的代码如下：\r\n\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n![3.png](https://img.learnblockchain.cn/attachments/2024/07/TA8F0bMn66a33d0240d6c.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n由上述代码我们可以看出，该代码根据**\\_commandType**来决定执行哪些操作，**在此次攻击中，\\_commandType为0x12 ，所以command=0x12\u00260x3f=0x12，对应的值为KYBER_SWAP**。\r\n\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![4.png](https://img.learnblockchain.cn/attachments/2024/07/24ciURIm66a33d38f2f79.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n所以，攻击者调用代码段如下。我们可以看到，该代码的**kyberRouter**和**targetData**均可以被控制，意味着攻击者可以利用Spectra Protocol合约调用任意合约并传入任意参数。\r\n\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![5.png](https://img.learnblockchain.cn/attachments/2024/07/FgjYcrEF66a33d48e1570.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n我们将攻击者的**inputs数据解析出来如下：**\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![6.jpg](https://img.learnblockchain.cn/attachments/2024/07/mxJlXe9766a33d5a97a42.jpg)\r\n\u003c!--StartFragment--\u003e\r\n\r\n我们可以发现，**kyberRouter已经被操纵为地址：**\r\n\r\n0x43e54c2e7b3e294de3a155785f52ab49d87b9922\r\n\r\n\r\n\r\n\r\n**tokenIn已经被操纵为地址：**\r\n\r\n0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\r\n\r\n\r\n\r\n\r\n**tokenOut被操纵为地址：**\r\n\r\n0xba8ce86147ded54c0879c9a954f9754a472704aa\r\n\r\n\r\n\r\n\r\n**我们可以看到Constants.ETH为:**\r\n\r\n0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![7.png](https://img.learnblockchain.cn/attachments/2024/07/7lVEk3CY66a33d77152a4.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n所以，代码进入到如下流程\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![8.png](https://img.learnblockchain.cn/attachments/2024/07/MeniQcPQ66a33d8560b23.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n其中，**targetData经过解析如下：**\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![9.jpg](https://img.learnblockchain.cn/attachments/2024/07/rxR4hY3W66a33d95ecde2.jpg)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n由于，transferFrom的signature为0x23b872dd；所以，**transferFrom对应的参数from为：**\r\n\r\n0x279a7dbfae376427ffac52fcb0883147d42165ff\r\n\r\n\r\n\r\n\r\n**to为：**\r\n\r\n0xba8ce86147ded54c0879c9a954f9754a472704aa\r\n\r\n\r\n\r\n\r\n**value为：**\r\n\r\n188,013,365,080,870,249,823,427\r\n\r\n\r\n\r\n\r\n又因为，**kyberRouter被控制为：**\r\n\r\n0x43e54c2e7b3e294de3a155785f52ab49d87b9922，即asdCRVToken。\r\n\r\n\r\n\r\n\r\n所以，攻击者相当于操纵了Spectra Protocol从0x279a7dbfae376427ffac52fcb0883147d42165ff转了188,013,365,080,870,249,823,427asdCRV到地址0xba8ce86147ded54c0879c9a954f9754a472704aa（此地址为攻击者控制的地址）。\r\n\r\n至此，攻击者完成攻击。 \r\n\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n# **总结**\r\n\u003c!--StartFragment--\u003e\r\n\r\n本次漏洞的成因是被攻击合约对攻击者传入参数校验不严格，导致攻击者可以通过构造特殊的**inputData**来使受害者合约调用任意合约并传入任意参数。最终，攻击者利用特殊的参数，使得受害者合约通过**transferFrom**将授权给其合约的代币转入到攻击者控制的地址。建议项目方在设计代码运行逻辑时要多方验证，合约上线前审计时尽量选择多个审计公司交叉审计。 \r\n\r\n\u003c!--EndFragment--\u003e","title":"零时科技 || Spectra攻击事件分析"},"history":null,"timestamp":1721974474,"version":1}