日前 Stargate 跨链桥的底层协议 LayerZero更新了默认的交易验证合约,经 Cobo 区块链安全团队分析,此次更新修复了之前版本中存在的严重漏洞,该漏洞可能导致所有依托 LayerZero 构建的跨链项目的资产受到影响。
Stargate Finance(https://stargate.finance/ )是近日最受人瞩目的跨链桥项目,截至发文时 TVL 已超过 35 亿美金。
Stargate 跨链桥底层基于 LayerZero 实现跨链消息传递。LayerZero 完成跨链消息传递的基本原理是:
- Oracle 会将源链上的 blockhash 和 block receiptsRoot 提交到目标链上
- Relayer 会将源链上跨链消息所在交易的 receipt 以及该 receipt 与 block receiptsRoot 的路径关系提交到目标链上,此时目标链上的交易验证合约会基于 Ethereum MPT [1] 的依赖关系,对 Relayer 所提交的 receipt 和 Oracle 所提交的 receiptsRoot 的对应关系进行验证
- 如果验证通过,该 receipt 被认为是合法的 receipt,并向上层协议转发,触发后续的跨链资产操作
LayerZero 3 月 28 日在未发表任何公告的情况下更新了跨链使用的验证合约[2]。Cobo 安全团队通过对比原始验证合约(MPTValidator)和新验证合约(MPTValidatorV2)代码[3],发现本次更新是对之前重大安全漏洞的修复。
补丁核心代码如下:
原始漏洞代码在进行 MPT 验证时,通过外部传入的 pointer 来获取下一层计算所用到的 hashRoot。这里使用 solidity 底层 add, mload 等汇编指令从 proofBytes 中获取 hashRoot ,由于没有限制 pointer 在 proofBytes 长度内,因此攻击者可以通过传入越界的 pointer,使合约读取到 proofBytes 以外的数据作为下一层的 hashRoot。这样就存在伪造 hashRoot 的可能,进一步导致伪造的交易 receipt 可以通过 MPT 验证。最终可造成的后果是,在 Oracle 完全可信的前提下,Relayer 仍可以单方面通过伪造 receipt 数据的方式来实现对跨链协议的攻击,打破了 LayerZero 之前的安全假设。
目前 LayerZero 协议的 Oracle 是一个类似多签的合约,三位 admin 中的两位提交相同的数据后,会被认为数据是有效的。但是 Relayer 是单签 EOA 控制,任何一个 Relayer 都可以提交攻击数据,完成所有的攻击流程。
补丁后的代码使用传入的 path 并使用 safeGetItemByIndex 函数获取 MPT 下一层的 hashRoot,保证了 hashRoot 存在于当前的 proofBytes 中,从而可以使 MPT 验证正确的进行下去。
此次爆出漏洞的代码是 LayerZero 协议中最核心的 MPT 交易验证部分的代码,是整个 LayerZero 及上层协议(例如 Stargate)正常运作的基石。虽然LayerZero项目方已经修复了目前明显的漏洞,但是不排除还存在其他被攻击漏洞的可能性。此外,LayerZero 项目的关键合约目前大都还被 EOA 控制,没有采用多签机制或者时间锁机制。如果这些特权 EOA 的私钥一旦泄漏,也可能会导致所有上层协议的资产受到影响。
在此,Cobo 区块链安全团队提醒投资者注意新项目的风险,同时呼吁 LayerZero 项目方在对合约代码进行深度审计的同时,也尽快将目前 EOA 控制的特权转移给多签或者时间锁合约,减少攻击风险敞口。
Reference:
- https://eth.wiki/fundamentals/patricia-tree
- https://etherscan.io/tx/0xf4f0495bfed37d4d95b3342ead0962433c7973f240b9b0739faa91e6ccac9d40
- https://www.diffchecker.com/RJdDTCx7