2. 什么是跨链桥?
区块链桥,也称为跨链桥,连接两条区块链,允许用户将加密货币从一条链发送到另一条链。
跨链桥通过在两个独立平台之间启用代币转移、智能合约和数据交换以及其他反馈和指令来进行资金跨链操作。
普通跨链桥运行如下:
- 用户将资产 A 发送到原始链上的一个存款地址并支付过桥费;
- 资产 A 被随机选择的智能合约中的验证者锁定或受信任的托管人;
- 在目标链上发行等量的资产A1,并将资产 A1 被发送到目标链上的用户地址;
貌似并不复杂的跨链资金转移操作,但在多个跨链桥项目中,不同步骤均发生过安全漏洞。
3. 跨链桥发生过哪些漏洞
4. 跨链桥常见漏洞分析
(1) ChainSwap 攻击事件
2021年7月,跨链资产桥梁项目ChainSwap遭到攻击,该跨链桥上的二十多个项目遭到攻击,损失了近 800 万美元资产,并使十多个项目暴跌 99%。
该攻击事件主要由于协议未对signatures合法性进行严格检查,导致攻击者使用自己生成的签名可进行签名交易。
(2) Factory合约
上图receive方法主要功能是将用户跨链之后的资金转移给目标链用户地址,需要验证发送链的签名。当前需要验证的签名个数为1。
由于receive方法逻辑及调用的ecrecover,_decreaseAuthQuota方法未对调用的signatures做严格检查,攻击者传入了自己生成的签名,后续合约逻辑对signatures的映射值及其他计算时,也并未有严格判断,导致攻击者成功执行receive方法为自己转移资金签名。
(3) Poly Network 攻击事件
2021年8月,跨链互操作协议 Poly Network 突遭黑客攻击,使用该协议的 O3 Swap 损失惨重,在以太坊、币安智能链、Polygon 三条网络上的资产几乎被洗劫一空,黑客在不到1小时时间内,分别盗走了 2.5 亿、2.7 亿、8500 万美元的加密资产,损失总额高达 6.1 亿美元。
该攻击事件主要由于中继链验证人公钥被替换。也就是跨链的中间验证人被攻击者替换为自己可控。
协议内部关系:
- 中继链验证人的公钥存在 EthCrossChainData 合约;
- EthCrossChainData 合约存在putCurEpochConPubKeyBytes 方法可以直接修改中继链验证人公钥;
- EthCrossChainData 合约 owner 为 EthCrossChainManager 合约;
- EthCrossChainData 合约的 putCurEpochConPubKeyBytes 方法可修改中继链验证人角色。
EthCrossChainManager合约
上图中,_executeCrossChainTx 方法未对传入参数做严格限制,导致攻击者传入toContract,method参数均由攻击者可控,由于协议内部关系,攻击者传入经过hash碰撞与putCurEpochConPubKeyBytes方法相同方法签名,成功调用EthCrossChainData 合约的 putCurEpochConPubKeyBytes 方法直接修改中继链验证人公钥为自己可控,之后利用该验证人签名恶意的资金转移,获取大量资金。
(4) Multichain(AnySwap) 攻击事件
2022年1月,Multichain官方声明协议跨链桥存在安全风险,部分代币存在被黑的风险,督促用户尽快取消授权。
事件核心原因:协议调用的底层代币合约没有实现 permit 方法,但包含回退功能,所以调用 permit 方法合约正常运行。
左AnyswapV4Router合约,右WETH9合约
上图中anySwapOutUnderlyingWithPermit方法中,前三个参数均由调用者传入,也就是from,token等参数均由攻击者可控,当参数可控后,攻击者部署攻击合约,将受影响的代币合约地址设置为底层代币参数。核心问题是,由于WETH9不存在permit 方法,但会调用WETH9的fallback方法进行deposit操作,故调用不会发生错误(交易不会回滚),所以当用户将资金授权给协议后,攻击者会迅速将用户资金转移。
(5) 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功能为忽略的遗弃功能)。
(6) Meter Bridge 攻击事件
2022 年 2 月 ,Meter.io 跨链协议遭到攻击,合约并没有阻止封装的 ERC20 代币与原生 gas 代币的直接交互,损失约 430 万美元。
事件核心问题:deposit方法进行存款时未验证WBNB存款情况,导致攻击者绕过判断条件不进行任何存款而正常获取资金。
Bridge合约
上图中,deposit和depositETH方法均为存款方法,而deposit方法存款时,未验证存款为原生代币的情况。攻击者利用deposit存款时,传入WBNB地址,由于该方法未验证WBNB存款的情况,未进行资金存储转移,之后调用depositHandler.deposit方法成功绕过判断条件,最后攻击者利用该缺陷,成功获取大量资金。
(7) 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做严格检查,导致攻击者传入了自己可控的值,攻击者利用该签名方法对自己的跨链请求进行签名,获取大量资金。
(8) Li Finance 攻击事件
2022 年3 月,以太坊上分布式跨链协议Li.Finance 受到了攻击,攻击者执行了 37 次 call 注入,获取了多个钱包中约 60 万美元的资产(204 个 ETH)。
该攻击事件的核心问题是未对传入的外部数据进行严格限制,导致攻击者传入了自己可控call调用逻辑。
CBridgeFacet合约
上图swapAndStartBridgeTokensViaCBridge 方法中,对传入的_swapData参数未进行严格限制,同样的LibSwap.swap调用中,也未对该值进行严格限制,导致swap方法中,_swapData可成功调用call方法进行恶意操作,攻击者利用该缺陷,进行多次call调用获取资金。
(9) Ronin Network 攻击事件
2022 年 3 月, Axie Infinity侧链Ronin验证器节点和 Axie DAO 验证器节点遭到破坏,导致在两笔交易中从 Ronin 桥接了 173,600 个以太坊和 2550 万美元的 USDC。
攻击发生原因:
Sky Mavis 的 Ronin 链目前由 9 个验证节点组成。为了识别存款事件或取款事件,需要九个验证者签名中的五个。攻击者控制了 Sky Mavis 的四个 Ronin 验证器和一个由 Axie DAO 运行的第三方验证器。( 2021 年11月 - 12 月,Axie DAO 允许 Sky Mavis 代表其签署各种交易,该事件停止后未撤销许可名单访问权限,攻击者获得了 Sky Mavis 系统的访问权限,并使用无Gas RPC 从 Axie DAO 验证器获取签名)。
5. 总结及建议
通过上述跨链桥攻击事件可以发现,从去年两个重要的跨链桥攻击到今年目前为止已发生多个跨链桥攻击事件,跨链桥攻击明显增多,被盗资金也颇为庞大,貌似黑客已经盯上了跨链桥这块肥肉。从表格总结来看,攻击主要发生在跨链之前和签名处,普遍均为合约漏洞,也存在官方马虎大意造成的被盗事件。
对于越来越多的跨链项目及项目合约安全,可遵循以下安全建议:
- 项目上线前对合约进行安全审计
- 合约调用接口需要严格排查其适配性
- 版本更新时需要对相关接口及签名安全进行重新评估
- 需要对跨链签名者进行严格审查以保证签名不被恶意人员控制