建议用户取消不同链上 Sushiswap RouteProcessor2 合约的授权
封面:Sushi
2023 年 4 月 9 日,据 BeosinEagleEye 态势感知平台消息, Sushiswap RouteProcessor2 合约遭受攻击,部分对合约授权过的用户资金被黑客转移,涉及金额约 1800ETH,约 334 万美元。
据了解,SushiSwap 流动性挖矿项目,克隆自 Uniswap,最大的不同是其发行了 SUSHI 代币,团队希望用 SUSHI 通证经济模型,优化 Uniswap。但 Uniswap 创始人 Hayden Adams 表示,Sushi 只是任何有能力的开发人员通过一天的努力创造出来的东西,试图利用炒作和 Uniswap 创造的价值来获利。
其实在本次攻击之前,这个项目还有另外的 “坎坷”,去年 12 月 6 日,上任仅两个月的 Sushi 新任 “主厨” Jared Grey 于治理论坛发起了一项新提案。在该提案中,Jared 首次向外界披露了 Sushi 当前严峻的财务状况,并提出了一个暂时性的自救方案。
正是在这样的压力下,黑客又来一击,那在黑客的打击下,SushiSwap 能否走出自救的道路?
事件相关信息
我们以其中一笔攻击交易进行事件分析。
攻击交易
0xea3480f1f1d1f0b32283f8f282ce16403fe22ede35c0b71a732193e56c5c45e8
攻击者地址
0x719cdb61e217de6754ee8fc958f2866d61d565cf
攻击合约
0x000000C0524F353223D94fb76efab586a2Ff8664
被攻击合约
0x044b75f554b886a065b9567891e45c79542d7357
被攻击用户
0x31d3243CfB54B34Fc9C73e1CB1137124bD6B13E1
攻击流程
1. 攻击者地址 (0x1876…CDd1) 约 31 天前部署了攻击合约。
2. 攻击者发起攻击交易,首先攻击者调用了 processRoute 函数,进行兑换,该函数可以由调用者指定使用哪种路由,这里攻击者选择的是 processMyERC20。
3. 之后正常执行到 swap 函数逻辑中,执行的功能是 swapUniV3。
4. 在这里可以看到,pool 的值是由 stream 解析而来,而 stream 参数是用户所能控制的,这是漏洞的关键原因,这里 lastCalledPool 的值当然也是被一并操控的,接着就进入到攻击者指定的恶意 pool 地址的 swap 函数中去进行相关处理了。
5.Swap 完成之后,由于此时 lastCalledPool 的值已经被攻击者设置成为了恶意 pool 的地址,所以恶意合约调用 uniswapV3SwapCallback 函数时校验能够通过,并且该函数验证之后就重置了 lastCalledPool 的值为 0x1,导致 swapUniV3 函数中最后的判断也是可有可无的,最后可以成功转走指定的 from 地址的资金,这里为 100 个 WETH。
漏洞分析
本次事件攻击者主要利用了合约访问控制不足的问题,未对重要参数和调用者进行有效的限制,导致攻击者可传入恶意的地址参数绕过限制,产生意外的危害。
总结
针对本次事件,Beosin 安全团队建议:
1. 在合约开发时,调用外部合约时应视业务情况限制用户控制的参数,避免由用户传入恶意地址参数造成风险。
2. 用户在与合约交互时应注意最小化授权,即仅授权单笔交易中实际需要的数量,避免合约出现安全问题导致账户内资金损失。