被盗约330万美元 跨链互操作协议Socket如何遭受黑客call注入攻击?
来源:Beosin
2024年1月17日,据Beosin旗下EagleEye安全风险监控、预警与阻断平台监测显示, Socket协议遭受攻击者call注入攻击,导致大量授权用户资金被盗。目前攻击者将被盗资金兑换为ETH,并保存在攻击者地址上。
攻击发生之后, Socket官方确认被攻击,并第一时间暂停受影响的合约。
同时,MetaMask在X平台发文称, MetaMask Bridge用户不受今天发生的Socket漏洞的影响。MetaMask称设计跨链桥合约时采用了独特的架构,旨在防范此类攻击。
关于本次攻击,Beosin安全团队对本次漏洞进行了分析。
漏洞分析
该事件发生的主要原因是 Socket合约的performAction函数存在不安全的call调用。 如下图,该函数的基本功能是将用户的ETH和WETH进行转换,如果调用者选择fromToken为ETH,那么将会查询合约的toToken(WETH)余额,随后通过call调用toToken(正常逻辑下,此处必须调用WETH的deposit函数),并转入用户指定的ETH数量,接下来查询合约的toToken(WETH)新余额,如果等于转入用户指定的ETH数量,那么通过,并将toToken转给调用者指定地址。如果调用者选择fromToken不为ETH,那么与上述同理,函数功能就是将调用者的WETH兑换成ETH(正常情况下,call调用必须是调用WETH的withdraw函数)并发送给用户指定地址。
虽然函数中并没有对fromToken与toToken进行任何检查限制,但是除了传入WETH地址,其他ERC20地址都将导致余额检查失败,从而无法伪造这两个参数,间接将token地址限制为WETH。
虽然对token地址有所限制,但是该函数还存在一个问题,便是未对amount进行限制,如果调用者传入的amount为0,则函数的检查条件将恒通过,并不需要调用WETH的deposit与withdraw函数。 此时便可以在call中注入异常的数据,从而达到攻击的目的。
攻击流程
明白了函数问题点,我们来看看攻击者是如何实施攻击的。
1.攻击者首先创建了一个攻击合约。
2.随后,攻击者多次查询不同地址的WETH余额,并且查询该地址对于Socket: Gateway合约的授权数量,最后调用Socket: Gateway合约。
3.可以看到,这里调用performAction函数的时候,swapExtraData参数传入的是0x23b872dd...,该数据是transferfrom的函数签名,说明这里将直接调用token的transferfrom函数。
4.可以看到,攻击者传入fromToken为WETH,amount正是我们上述的0,合约将攻击者的WETH转入合约,但转的是0,而在call调用中,攻击者指定一个用户地址向攻击者转了16枚WETH。
5.攻击者通过大量操作,将无数用户的WETH转移给自己。
6.攻击者使用相同的方式,将授权给该合约的USDT转移给自己。
7.还包括WBTC、DAI以及MATIC三种代币。
截止发稿,被盗的近330万美元的资金,部分被攻击者兑换为了ETH,并且一直存在黑客地址未移动,Beosin Trace将对被盗资金进行持续监控。
目前,互操作性协议Socket在X平台发布安全事件更新:Socket现已恢复运营,受影响的合约已暂停,损害已得到完全控制。在Bungee的桥接以及其大多数合作伙伴前端的桥接已经恢复。详细的事件分析和后续步骤将很快公布。
Socke提醒道: “小心回复中试图对您进行网络钓鱼的虚假Socket帐户。在采取任何行动之前,请务必仔细检查帐户。”
本次事件也再次提醒各位,安全不可掉以轻心。
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
Justin Sun suspected to have purchased $160m in Ethereum
Justin Sun suspected to have purchased $160m in Ethereum