错误中的启示:跨链桥攻击回顾

综述跨链桥这个细分赛道中出现的安全事件,并选取三个案例进行具体分析,从错误中学习,进而更好的启发在未来跨链桥设计以应用上需要关注的要点。

出品:DODO Research
编辑:Yaoyao 作者:Lisa

根据 The Block 年终报告,过去一年跨链桥的总锁仓量(TVL)大幅下降。从一月的峰值 $580 亿下降至今天的 $60 亿,跌幅达 90%。虽然跌幅如此大的主要原因来自于币价的波动,但是重大的跨链桥攻击事件的是不可轻视的因素,比如 Ronin 桥 $6 亿 和 Wormhole $3 亿的重大损失。

640.png $\qquad\qquad\qquad\qquad\qquad\qquad\quad\,\,\,$Digital Asset 2023 Outlook

如果未来的趋势将是多链的,那么跨链桥的存在就是必然的,同时也是很难做的角色,在过去一年跨链桥事故频发。Dr.DODO 在之前的文章 《跨链漫谈:深度解析 16 个跨链方案权衡》中总结了跨链桥的分类方法,并详细地比较了16 个跨链桥机制上的设计方法和取舍。

本篇文章将综述跨链桥这个细分赛道中出现的安全事件,并选取三个案例进行具体分析,从错误中学习,进而更好的启发在未来跨链桥设计以应用上需要关注的要点。

最近一次在 10 月发生的 BNB 跨链桥受攻击事件,导致近 $570M 损失,这一事件再次把跨链桥的安全性问题推上热议。根据 Messari 8 月推出的研报数据,算上 2021 年的重大事件,共有 9 起跨链桥攻击事件,构成将近 $2B 美金的资产损失。

从下图整理可以看出,其中 2022 年最引人侧目的攻击来自于 Ronin bridge 的事故 - Ronin 是为 Axie Infinity 打造的侧链。按攻击方法来看,常见的攻击方法包括验证者私钥泄露,或者黑客通过伪造证明而成功地绕过某些关键的验证关卡。比如 Ronin 的失误就是源于验证者私钥的泄露。每一起跨链桥的事故几乎都来自于人为设计因素或者代码漏洞错误,这一点值得反思。

640 (1).png

由浅入深,首先,简要回顾跨链桥的基本概念。

不同的公链如同孤立的无需许可的计算机,具有不同的共识机制,相互之间无法直接通讯。跨链桥的存在就是为了使信息能够不被篡改地从一个计算机(源链)传递到另一个计算机(目标链)上。

不同的跨链桥对这个共识问题有着不同的解决方案,比如采用中心化的桥,委员会,PoS 机制,轻客户端等。而不同的解决方案在信息传递的安全性,成本,延迟性上有所取舍。

接下来,文章进一步的把跨链流程进行拆解,了解跨链具体涉及到哪些步骤,这样在讨论不同攻击的时候,可以更好的理解出错的点在哪里。

从概念上来理解,跨链流程如下:

  1. 首先当源链上的用户发起了一个状态改变,如一笔交易,这个事件将由源链上的验证者进行验证,并出块。

  2. 此时,跨链桥所做的事情就是去监听这个需要跨链的事件,下载,并对其进行验证和签名。

  3. 接下来被验证签署后的事件被传输至目标链。

  4. 再由目标链上的验证者进行验证,出块。

  5. 由此,源链上发起的状态改变得以在目标链被执行。

此外,A&T capital 的分析师 Billy 在 《跨链通信协议将如何成为 Web3 的 TCP/IP?》一文的第一部分对跨链协议的运作方式与技术路径进行描述,涉及跨链的底层逻辑,但简洁易懂。

刚开始的跨链产品主打资产跨链桥,但是随着发展会演变成通识信息传输桥(general message passing bridge)。这些桥梁允许任何数据,包括代币、链的状态、合约调用、NFT或治理投票,这样子的数据从 A 链跨到 B 链。

最后,在进行案例分析之前,文章简述跨链桥的两个重要分类方法:验证机制和代币跨链方法。

1) 验证机制 - 跨链桥网络里的节点是如何达成共识的?

简单来说,验证跨链事件发生的正确性的方法主要分为几种:

  • 外部验证:可以理解为一种类似 POS 的机制。由一个验证者群体形成公会,通过其独立的公私钥形成有效的签名。

  • 乐观验证:由源链上的验证者乐观的假设交易有效,并签名。当数据发布到目标链会启动一个欺诈证明窗口。这是任何第三方主体,称为 watcher 可以证明在源链上的欺诈行为并断开与目标链上的通信通道。这种信任假设要求只需要有一个诚实的验证者就可以确保安全。

  • 本地验证:又称轻客户端验证。轻客户端本质上是智能合约,它无需进行大量计算,只负责下载区块头,进行验证。项目方在实施上一般需要在源链目标链各部署一个轻客户端,然后依靠中间的relayer 进行信息传递。轻客户端是安全性高的验证方法,但是也有它的权衡。比如,轻客户端部署起来有难度:轻客户端与其底层链的共识耦合。实施于一个区块链的轻客户端不能重新用于其他链,限制了扩展性和重复利用的能力。

  • 中心化验证:由发行跨链桥的组织成员通过多方签名的方法进行中心化验证。

640 (2).png

2) 代币跨链方法 - 代币是如何从 A 链 转移到 B 链的

代币跨链的具体形式有以下几种:

  • 燃烧+铸造,其风险在于需要把发行与销毁资产的权限交给项目方,或是增发的问题。

  • 锁定+铸造,这种模式相比于前一种更加安全且去中心化,因为它没有资产发行与销毁的权限。但风险点可能存在于资产在A链被盗导致 B 链的资产没有背书。

  • 在源链/目标链部署流动性池,比如一个跨链协议支持任意链上任意资产的跨链的方式是通过在多条链上建立原生代币资金池并结合燃烧+铸造的方式实现。

640 (3).png

在了解了跨链桥的跨链机制之后,再看跨链攻击的具体流程时,可以更好的了解跨链桥风险点所在。

Poly Network 攻击案例

Poly Network 在 2021 年 8 月 10 日遭受攻击,黑客通过把自己的地址和验证者地址进行调换从而成功通过验证,本次攻击损失 $6.1 亿。

Poly Network 的工作机制是作为中间链去接收发送链的区块头,相当于所有它连接的链的轻客户端。

比如下图,当 Ontology 上发起一笔交易以后,区块头就会被送到 Poly Network 上。区块头里面含有有一个 state root hash,当交易与证明到达 PolyNetwork之后,这上面的 keepers 就可以进行验证,如果合法的话, PolyNetwork 就会自己发送一个 event,然后目标链的 relayer 就会听到,进而转发到目标链的 EthCrossChainManager 合约上。

640 (4).png

在了解 Poly Network 工作机制之后,我们来看受攻击的合约。

首先,LockProxy 是控制资产的合约。其次,EthCrossChainManager (CCM) 的优越性有两点:

1)只有它能调用 LockProxy 进行 unlock 或者 burn 资产;

2)CCM 掌管着 CrosschainData , 这个合约保存着 Poly Network 里面的 keeper 公钥名单。

640 (5).png

也就是说,当跨链交易的数据发到 CCM 之后,合约可以从这个数据中恢复出一些签名的地址。

然后它会拿这些地址和它自己存的 keeper 名单 做对比,看看是不是有 2/3 的 keeper 在这些地址里面。如果有,就认为发送过来的数据是合法的。

所以上述攻击出现的问题有两点:

1)任意的用户可以进行的远程调用合约。在这个事件之后,项目方加入了白名单机制,只有指定方可以调用这个非常特别的合约。

2)合约之间的从属关系,导致关键的合约容易被篡改。

Multichain 攻击案例

2022 年 1 月 20 日,Multichain 攻击损失 $300 万,原因在于黑客通过恶意部署代币合约地址,而 Multichain 未能检测出来导致。

Multichain 是可实现跨链路由的桥,通过封装资产 “anyToken”,Multichain 可实现任意资产的任意跨链。首先,当用户把 DAI 放到池子里,等量的 anyDAI 就会被铸造出来,然后由网络中的验证人确定这一事件,在 B 链铸造出等量的 anyDAI, 然后燃烧掉 A 链的 anyDAI。

640 (6).png

受攻击的合约中,关注下图标记的 1,2,3 行:首先,从 anyDAI 这个合约拿到它底层资产合约的地址,即 DAI。其次,permit()  使用户通过签名来允许路由器从用户地址中提款。最后,safetransferfrom 是一个真正的提款动作。

注:签名了的交易被表示为(v,r,s)

640 (7).png

可以看到红字为黑客恶意部署的代币地址,和无效的签名。

640 (8).png

回顾以上提到的关键的三行代码,黑客重新部署了 anyDAI 导致底下 [OUTPUT] 的底层资产解析出来是 WETH 的地址。在此,Multichain 在这里的失误就是它应该检验代币地址是不是来自 Multichain 的代币。

640 (9).png

第二个微妙的问题就是 permit() 是 erc20 的一个扩展协议,但是由于比 weth 出来的时间晚,所以 weth 没有支持这个特性。那么如果去调用一个合约的一个不存在的方法,EVM 会自动去调用这个合约的 fallback 方法;然而,fallback 方法在这个情况下也没报错,所以,permit() 功能也被成功执行。

而第三行之所以可以执行,我们可以认定因为 Multichain 之前请求了 WETH 无限的花费上线,黑客通过滥用了这个 approval 把 WETH 从受害者的账户转出。但值得注意的是很多的协议都会使用,以帮助用户节省 gas 费用。

**BNB 桥攻击案例

**

在 2022 年 10 月 7 日的 BNB 桥攻击案例中,黑客通过成功伪造 Merkle Proof 从而证明原本不存在的数据的存在得以绕过验证者的检查,损失 $5.7 亿。

Binance 的事件中,黑客通过 RangeProof 伪造了 Merkle proof 从而证明某些数据存在 Merkle tree 中。

按理说一个 Proof 是很难伪造的,但是由于 BNB 桥涉及到的数据结构 IAVL - 可理解为 等价于以太坊中的 Merkle patricia trie,是一种 custom merklized balance binary search tree,InnerNode 分为 Left 和 Right 两个字段。

在这里 IAVL 的 RangeProof 存在的重要问题就是它允许 Left 和 Right 两个字段可以同时被填充(按理说只能有一个)。而当 Left 与 Right 都存在的情况下会忽略 Right 进行 RootHash 计算。

攻击者基本上通过将信息粘贴到 Right 字段中的优势,而这些信息从未得到验证,也从未影响哈希计算,以使验证者相信某些 Leaf 是 Tree 的一部分。从而,成功地伪造了 Merkle Proof。

关于 BNB 桥攻击中更加技术性的合约调用逻辑可以阅读:BSC 链上的攻击:为何发生及其潜在的危害

如果未来是多链的,跨链桥作为链与链之前资产和信息转移的桥梁角色关键,因此也承载着极大的责任。目前跨链桥受攻击的原因主要来自于人为和代码错误,其中代码层面的错误其实十分随机,甚至无法很好的归类。这就意味着,跨链桥的开发团队承载着重要的责任,不仅在跨链桥的宏观机制设计上要在不牺牲安全性的情况下做出权衡,且需要在代码层面做好细节上的极致把控。

免责声明

本研究报告内的信息均来自公开披露资料,且本文中的观点仅作为研究目的,并不代表任何投资意见。报告中出具的观点和预测仅为出具日的分析和判断,不具备永久有效性。

本文首发于:https://mp.weixin.qq.com/s/4GO3M3jQhFq1uKvzMnNU1g

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
DODO研究院
DODO研究院
江湖只有他的大名,没有他的介绍。