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