随着区块链和链上项目的增长,对多链项目的需求正在变多,跨链桥业务也相应的在增加。哪里有生意,哪里就会有安全问题。跨链桥在为用户提供便利的同时,也为黑客提供了便利,Poly Network 被攻击后,跨链桥的安全问题也随之出现。
什么是跨链桥?
区块链桥,也称为跨链桥,其连接两个区块链,允许用户从一个链向另一个链发送加密货币。
跨链桥通过两个独立平台之间的代币转账、智能合约和数据交换等其他反馈和指令,实现了资金的跨链操作。
一种常见的跨链桥的操作如下:
- 用户将资产 A 发送到原链上的一个存储地址,并支付过桥费;
- 资产 A 被智能合约中随机选择的验证者或受信任的托管人锁定;
- 在目标链上发布相同数量的资产 A1,并将资产 A1 发送到目标链上的用户地址。
跨链桥存在漏洞
跨链桥常见漏洞
ChainSwap 攻击事件:
2021 年 7 月,跨链资产桥项目 ChainSwap 遭到攻击。跨链桥上的二十多个项目受到攻击,损失了近 800 万美元的资产,导致十多个项目暴跌 99%。
这种攻击主要是由于该协议没有严格检查签名的有效性,攻击者可以使用自己生成的签名对交易进行签名。
Factory 合约
上图中接收方法的主要功能是将用户跨链后的资金转移到目标链的用户地址,需要验证发送链的签名。当前待验证签名个数为 1。
由于接收方法的逻辑和名为 ecrecover 和_decreaseAuthQuota 方法并不严格检查签名,攻击者使用了自己产生的签名,但后续合约逻辑没有严格判断映射值签名和其他计算。使攻击者成功地执行接收方法,为自己签名转账资金。
Poly Network 攻击事件
2021 年 8 月,跨链互操作协议 Poly Network 突然遭到黑客攻击。使用该协议的 O3 Swap 遭受了严重的损失。以太坊、币安智能链、Polygon 三大网络上的资产几乎被洗劫一空。1 小时内,分别有 2.5 亿、2.7 亿、8500 万美元的加密资产被盗,总损失高达 6.1 亿美元。
这种攻击主要是由于中继链验证者的公钥被替换造成的。即由攻击者代替跨链的中间验证者,由攻击者自己控制。
协议内部关系:
- 中继链验证者的公钥存在于 EthCrossChainData 合约中;
- EthCrossChainData 合约所有者是 EthCrossChainManager 合约;
- EthCrossChainData 合约的 putCurEpochConPubKeyBytes 方法可以修改中继链验证者角色。
- EthCrossChainManager 合约:
在上面的图中,_executeCrossChainTx 方法没有对传入的参数施加严格的限制,这导致攻击者传入 toContract,方法参数被攻击者控制。由于协议的内部关系,攻击者在哈希冲突后传入与 putCurEpochConPubKeyBytes 方法相同的方法签名。成功调用 EthCrossChainData 合约的 putCurEpochConPubKeyBytes 方法,直接修改中继链验证者的公钥,使其变得可控,然后利用验证者签署恶意的进行资金转移,获取了大量资金。
Multichain (AnySwap) 攻击事件
2022 年 1 月,Multichain 正式声明协议的跨链桥存在安全风险,部分代币存在被黑客攻击的风险,并敦促用户尽快取消授权。
事件的核心原因是:协议调用的底层代币合约没有实现 permit 方法,但包含一个 fallback 函数,因此调用 permit 方法的合约正常运行。
左边是 AnyswapV4Router 合约,右边是 WETH9 合约。
在上图中的 AnySwapOutUnderlyingWithPermit 方法中,前三个参数都是由调用者传入的,也就是说代币和其他参数都是攻击者控制的。当参数可控时,攻击者部署攻击合约来转移受影响的代币。合约地址被设置为基础代币参数。
核心问题是由于 WETH9 没有 permit 方法,但是会调用 WETH9 的 fallback 方法进行充值操作,所以其不会有错误的调用 (交易不会回滚),也就是说,当用户授权到协议时,攻击者会很快转移用户资金。
Qubit Bridge 攻击事件
2022 年 1 月,Qubit Finance 跨链桥以太坊 - 币安被黑客攻击,损失超过 8000 万美元。
核心问题:当 deposit 方法中的资金地址为 address (0) 时,不会出现 safeTransferFrom 错误,导致 deposit 功能正常执行。
QBridge 合约
上图中,存款是一种正常的存款方式。当在此方法中调用 IQBridgeHandler (handler).deposit 时,当用户传入的 resourceID 映射 tokenAddress 地址为 0 地址时,后续的 tokenAddress.safeTransferFrom (depositer, address (this), amount);转账将正常执行,导致方法和事件的正常运行,调用者可以成功进行存款。
这里更重要的是,官方 tokenAddress 的 ETH 0 地址是官方所做的 (官方已经声明存款功能是一个被忽略的废弃功能)。
Meter Bridge 攻击分析
在 2022 年 2 月,Meter.io 跨链协议并未阻止封装的 ERC20 代币与原生 gas 代币的直接交互,导致损失约 430 万美元。
该事件的核心问题是:存款方法在进行存款时不验证 WBNB 的存款情况,导致攻击者绕过判断条件,不存款也可以正常获取资金。
Bridge 合约
在上图中,deposit 和 depositETH 方法都是存款方法,但是当用 deposit 方法存款时,并没有验证该存款是否为原生代币。当攻击者进行存款时,传入 WBNB 地址。该方法不验证 WBNB 存款,之后调用 deposthhandler .deposit 方法成功绕过判断条件。最后,攻击者利用该漏洞成功获取大量资金。
Wormhole 攻击分析
2022 年 2 月,以太坊和 Solana 两大区块链的重要桥 (Wormhole) 被黑客攻击,损失超过 3.2 亿美元。
该漏洞的核心原因是:verify_signatures 调用的 load_instruction_at 方法没有验证指令的有效性,攻击者可以通过伪造验证签名来获取资金。
verify_signature.rs 接口合约
上图中的 verify_signatures 方法是跨链验证过程中调用的签名方法。由于 verify_signatures 方法调用 load_instruction_at 方法,所以在协议更新后,load_instruction_at 方法是一个废弃的方法。这种方法对传入的指令没有严格的检查,这就导致攻击者在传入一个可控值后,利用这种签名方式对自己的跨链请求进行签名,获得大量资金。
Li.Finance 攻击分析
2022 年 3 月,以太坊上的分布式跨链协议 Li.Finance 遭到攻击。攻击者进行了 37 次调用传入,在多个钱包中获得了约 60 万美元的资产 (204 ETH)。
这种攻击的核心问题是对传入的外部数据没有严格的限制,导致攻击者传入自己的可控调用逻辑。
CBridgeFacet 合约
上图中的 swapAndStartBridgeTokensViaCBridge 方法中,传入的_swapData 参数没有严格限制。在同一个 LibSwap.swap 调用中,该值不受严格限制。因此,在 swap 方法中,_swapData 可以成功地调用 call 方法来执行恶意操作。攻击者利用此漏洞进行多次调用以获取资金。
Ronin Network 攻击分析
在 2022 年 3 月,Axie Infinity 侧链 Ronin 验证者节点和 Axie DAO 验证者节点被破坏,导致在两笔交易中从 Ronin 桥接了 173600 ETH 和 2550 万美元的 USDC。
攻击原因:
Sky Mavis 的 Ronin 链目前由 9 个验证者组成。为了识别存款事件或取款事件,需要 9 个验证者中的 5 个签名。攻击者控制了四个 Sky Mavis 的 Ronin 验证者和一个由 Axie DAO 运行的第三方验证者。(2021 年 11 月至 12 月,Axie DAO 允许 Sky Mavis 代表其签署各种交易,在事件停止后没有撤销白名单访问权限,攻击者获得了对 Sky Mavis 系统的访问权限,并使用来自 Axie DAO 验证器的 gasless RPC 来获取签名)。
总结和建议
从以上跨链桥攻击事件可以发现,从去年到今年已经发生了几次跨链桥攻击。跨链桥攻击的数量明显在增加,被盗资金也相当多。黑客已经盯上了跨链桥这块肥肉。从总结来看,攻击主要发生在跨链前和签名处,一般都是合约漏洞,也有由于官方疏忽造成的盗窃事件。针对越来越多的跨链项目和项目合约安全,建议如下:
- 在项目上线前完成合约安全审计
- 合约调用接口需要严格检查其适配性
- 版本更新时,需要重新评估相关接口和签名的安全性
- 需要对跨链签名者进行严格的审查,以确保签名不受恶意人员的控制