2024 年 1 月 16 日,Socket Tech遭到攻击,损失约 330 万美元。 攻击者利用了Socket某合约中数据验证环节的漏洞,通过恶意数据输入盗取了授权合约的用户资金。 这次攻击共给 230 个地址带来损失,最大的单地址损失约为 65.6 万美元。
背景介绍
Socket 是一种服务于跨链安全、高效数据和资产传输的互操作性协议。 Socket Gateway合约是与 Socket 流动性层所有交互的接入点,所有资产桥接器和 DEX 在此汇聚成一个唯一的元桥接器,并根据用户偏好(如成本、延迟或安全性)选择最佳交易路由。
黑客攻击发生的前三天,Socket合约管理员执行了addRoute命令,在系统中加入了一条新路由。 添加路由的目的是扩展Socket网关的功能,但却无意中引入了一个关键漏洞。
下图为通过合约管理员添加路由的记录
![7175438 XUCuq9HLGndBLjSx7BetXn4VZuHJeeSy0HJcRnZw.png](https://img.jinse.cn/7175438_watermarknone.png)
事件梗概
1. 北京时间1月16日15:03,攻击者钱包转入攻击所用资金,我们的时间分析表明这笔资金来自0xe620,与从Tornado Cash提取的10 BNB有关。
![7175439 stJh04TkjPfHuZyxg4Jc4r6nkYupyxUeU2WuMUa4.png](https://img.jinse.cn/7175439_watermarknone.png)
2. 这些资金被用于创建和执行两个合约,来利用Socket的漏洞。 第一个合约针对的是授权了 SocketGateway 的地址中的 USDC(截图如下);127 名受害者被骗走约 250 万美元。
![7175442 6lyQAxmIpwkyzoZjNRylRjkBTcR8XFkPW9BGI5je.png](https://img.jinse.cn/7175442_watermarknone.png)
3. 接下来,第二个合约则将目标对准了受害者地址内的WETH, USDT, WBTC, DAI 与MATIC。于是,另外104名受害者损失了如下资产:
- 42.47526105 WETH
- 347,005.65 USDT
- 2.88962154 WBTC
- 13,821.01 DAI
- 165,356.99 MATIC
4. 攻击者将USDC与USDT转换成了ETH。
![7175452 GR9DU9e3GXEL6tGQ6GTyUQ5Hx3x9FTlPEJiyoHu6.png](https://img.jinse.cn/7175452_watermarknone.png)
漏洞来源
被攻击者利用的漏洞存在于新添加的路由地址 routeAddress内的performAction函数中。
该地址内的performAction函数原本的功能是协助Wrapping与Unwrapping的功能。 然而,该函数中出现了一个关键漏洞:用户在无需验证的情况下,直接在.call() 中通过swapExtraData调用外部数据,这意味着攻击者可以执行任意恶意函数。
![7175454 8zOChIDLaJim6AbVW5X59wfMHot0M1aRLGuMn5Gs.png](https://img.jinse.cn/7175454_watermarknone.png)
在这次事件中,攻击者制作了一个恶意的 swapExtraData 输入,触发transferFrom函数。 该恶意调用利用了用户对 SocketGateway 合约的授权,从他们那里盗走了资金。
虽然合约会通过检查余额检查确保 fromToken.call() 调用后用户余额会出现正确的变化,但该函数没有考虑攻击者将金额设置为0的情况。
![7175455 kXNfXqMeGCzRj7kcoOPmJZuLYqxCL3u7ioqgTeyH.png](https://img.jinse.cn/7175455_watermarknone.png)
还原攻击流程
1. 使用攻击合约,攻击者在Socket Gateway合约上调用了0x00000196()。
![7175456 gMq5pr4NON2kXUaKVlKxg0EAIQfF8VMQIJmTdGHY.png](https://img.jinse.cn/7175456_watermarknone.png)
2. fallback() 使用六进制签名 196 调用了有漏洞的路由地址合约(routerAddress)。
![7175458 12kIBbXyHTr4ypXaXygZPG7jj1vxqJV2JIi1ZdUa.png](https://img.jinse.cn/7175458_watermarknone.png)
3. 在下面的截图中,我们可以看到攻击者使用的虚假输入,Swapping数量全部为0。
![7175459 ZApSAr6fE1rLYL3EuSYeuKpZiMuzr89ZyjExQOXQ.png](https://img.jinse.cn/7175459_watermarknone.png)
4. 接下来将调用WrappedTokenSwapperImpl.performAction() 进行Swap。
![7175460 U4kUpBPRQowAedic6xAzllw7QOgWfjMqJrjP2gP5.png](https://img.jinse.cn/7175460_watermarknone.png)
5. 在没有进行任何验证的情况下,虚假的SwapExtraData被fromToken (WETH)接受并执行。
![7175462 hFYUySPoxPaAcaHpmBc3XDyNQ0LO7jHcWLMBpURP.png](https://img.jinse.cn/7175462_watermarknone.png)
6. 攻击者重复执行以上流程,直到受害者资产耗尽。 恶意交易出现后,Socket 迅速调用了 disableRoute,屏蔽了之前有漏洞的路由,阻止了更大范围的攻击。
7. 1月23日,Socket宣布已经追回1032枚ETH,并在25日宣布将全额补偿所有损失。本次事件得到解决。
![7175464 i4OXBXUYesBkxF3TrHlneLhkpUyyMW6SVx10cS6P.png](https://img.jinse.cn/7175464_watermarknone.png)
事件总结
在有着无限额用户授权的路由合约中,恶意 calldata 攻击并不罕见。 以前类似的攻击包括 Dexible 和 Hector Bridge。 2023 年 2 月 17 日,去中心化交易所 Dexible 被攻击,损失超过 150 万美元。 漏洞利用者向 Dexible 的 fill() 函数输入恶意 calldata,以窃取用户资产。 2023 年 6 月 2 日,Hector 网络的协议被攻击。攻击者部署了一个虚假的 USDC合约,并通过恶意 calldata,将 65.2万枚真实的USDC从受害者的合约中转移出去。
区块链聚合平台通常通过封装一系列桥和路由合约来提高流动性,减少损耗。然而,这种复杂的封装会给安全性带来更多难题。我们欣慰地看到Socket此次事件可以得到解决,CertiK将继续致力于为平台提供全方位审计与检测,降低各类聚合风险,提高社区信任和整个行业的安全水平。