从去年两个重要的跨链桥攻击到今年目前为止已发生多个跨链桥攻击事件,跨链桥攻击明显增多,被盗资金也颇为庞大,貌似黑客已经盯上了跨链桥这块肥肉
0x1 背景介绍
0x4 跨链桥常见漏洞分析
ChainSwap 攻击事件
2021年7月,跨链资产桥梁项目ChainSwap遭到攻击,该跨链桥上的二十多个项目遭到攻击,损失了近 800 万美元资产,并使十多个项目暴跌 99%。
该攻击事件主要由于协议未对signatures合法性进行严格检查,导致攻击者使用自己生成的签名可进行签名交易。
Factory合约
上图receive方法主要功能是将用户跨链之后的资金转移给目标链用户地址,需要验证发送链的签名。当前需要验证的签名个数为1。
由于receive方法逻辑及调用的ecrecover,_decreaseAuthQuota方法未对调用的signatures做严格检查,攻击者传入了自己生成的签名,后续合约逻辑对signatures的映射值及其他计算时,也并未有严格判断,导致攻击者成功执行receive方法为自己转移资金签名。
Poly Network 攻击事件
2021年8月,跨链互操作协议 Poly Network 突遭黑客攻击,使用该协议的 O3 Swap 损失惨重,在
上图中,_executeCrossChainTx 方法未对传入参数做严格限制,导致攻击者传入toContract,method参数均由攻击者可控,由于协议内部关系,攻击者传入经过hash碰撞与putCurEpochConPubKeyBytes方法相同方法签名,成功调用EthCrossChainData 合约的 putCurEpochConPubKeyBytes 方法直接修改中继链验证人公钥为自己可控,之后利用该验证人签名恶意的资金转移,获取大量资金。
Multichain(AnySwap) 攻击事件
2022年1月,Multichain官方声明协议跨链桥存在安全风险,部分代币存在被黑的风险,督促用户尽快取消授权。
事件核心原因:协议调用的底层代币合约没有实现 permit 方法,但包含回退功能,所以调用 permit 方法合约正常运行。
左AnyswapV4Router合约,右WETH9合约。
上图中anySwapOutUnderlyingWithPermit方法中,前三个参数均由调用者传入,也就是from,token等参数均由攻击者可控,当参数可控后,攻击者部署攻击合约,将受影响的代币合约地址设置为底层代币参数。核心问题是,由于WETH9不存在permit 方法,但会调用WETH9的fallback方法进行deposit操作,故调用不会发生错误(交易不会回滚),所以当用户将资金授权给协议后,攻击者会迅速将用户资金转移。
Qubit Bridge 攻击事件
2022 年 1 月,Qubit Finance 跨链桥Ethereum-Binance 被黑客入侵,损失超过 8000 万美元。
核心问题:deposit方法中资金地址为address(0)时而safeTransferFrom未发生错误,导致存款功能正常执行。
QBridge合约
上图中,deposit为正常存款方法,调用该方法中的IQBridgeHandler(handler).deposit时,当用户传入的resourceID映射tokenAddress地址为0地址时,后续的tokenAddress.safeTransferFrom(depositer, address(this), amount);转账会正常执行,导致方法及事件运行正常,调用者可以成功存款。
这里比较重要的是官方 tokenAddress的ETH为零地址是官方所为(官方已声明deposit功能为忽略的遗弃功能)。
Meter Bridge 攻击事件
2022 年 2 月 ,Meter.io 跨链协议遭到攻击,合约并没有阻止封装的 ERC20 代币与原生 gas 代币的直接交互,损失约 430 万美元。
事件核心问题:deposit方法进行存款时未验证WBNB存款情况,导致攻击者绕过判断条件不进行任何存款而正常获取资金。
Bridge合约
上图中,deposit和depositETH方法均为存款方法,而deposit方法存款时,未验证存款为原生代币的情况。攻击者利用deposit存款时,传入WBNB地址,由于该方法未验证WBNB存款的情况,未进行资金存储转移,之后调用depositHandler.deposit方法成功绕过判断条件,最后攻击者利用该缺陷,成功获取大量资金。
Wormhole 攻击事件
2022 年 2 月 ,Ethereum和Solana两大区块链的重要桥接“虫洞”(Wormhole)遭黑客攻击,损失超过3.2亿美元。
漏洞核心原因:verify_signatures调用的load_instruction_at方法中未验证instruction合法性,导致攻击者可伪造,从而利用验证签名获取资金。
verify_signature.rs 接口合约
上图中verify_signatures方法是跨链验证时所调用的签名方法,由于verify_signatures方法调用了load_instruction_at方法,load_instruction_at方法为协议更新后的废弃方法,该方法中未对传入的instruction做严格检查,导致攻击者传入了自己可控的值,攻击者利用该签名方法对自己的跨链请求进行签名,获取大量资金。
Li Finance 攻击事件
上图swapAndStartBridgeTokensViaCBridge 方法中,对传入的_swapData参数未进行严格限制,同样的LibSwap.swap调用中,也未对该值进行严格限制,导致swap方法中,_swapData可成功调用call方法进行恶意操作,攻击者利用该缺陷,进行多次call调用获取资金。
Ronin Network 攻击事件