跨链 – 链接信息孤岛的桥梁

背景

区块链的发展

区块链借由密码学、共识等机制创建了一个存储庞大交易资料的点对点网络系统。

公链自2008年中本聪在《比特币白皮书》中提出区块链概念伊始,经过了十余年的发展,整个区块链架构也在不断升级迭代着,大致可以分为三个阶段:

  • 第一阶段即区块链技术的源头 – 比特链时期。当时区块链技术主要应用是作为数字货币的基础建设,例如比特链就是比特币的基础建设,比特币是比特链的原生代币也是唯一代币,想要发行一种新代币,只能部署新链;
  • 第二阶段是以太坊时期,它为区块链引入了智能合约的概念,并将可编程能力抽象、完善,形成一套图灵完备的编程语言(Solidity)和 近乎(Gas)图灵完备的虚拟机(EVM)。此时区块链的能力不再局限于单一货币,图灵完备保障了各种代币合约、DAPP的构建,以太坊也逐渐成为最大的去中心化应用公链。
  • 第三阶段是多链时期,随着以太坊的大火,整个网络逐渐变得拥挤,而且代币价格攀升,每次的交互成本让人难以接受;另一方面以太坊也不能满足所有需求,于是一众区块链如雨后春笋般冒出,有的是为了满足低交互成本的需求,有的是为了探索新技术如隐私、共识、多链网络等。

区块链的百花齐放无疑解决了单链的许多局限性问题,但也形成了一个个孤岛,用户数据信息在链间无法传递,跨链需求应运而生。

跨链技术的发展

区块链技术早期都是基于单链的形式发展,但由于单链的性能优化和技术升级存在较大难度,愈发不能满足实际需求;另一方面,跨链技术其实从比特币诞生之初就被初步研究,初期是为了探索、实验新技术,后面逐渐聚焦于资产转移、信息跨链。

区块链数十年的发展,也是网络架构由 单链扩容 逐步过渡到 多链协同 的时期:

跨链技术发展史

名词解析

公证人机制

在Web2的交易场景中,买家将财产交付于中间服务器,等收到卖家的货物时,再同意解除锁定,中间服务器就充当着公证人的角色,负责保管买家财产和防止买家、卖家作恶。

在Web3的交易场景中,公证人是一方或多方可信节点,交易双方将代币发送到相应链上的节点地址,验证、签名通过后再分别转发到对应的交易地址。

这里的资产锁定可以通过中心服务器、智能合约等方式;签名方式也有单签名、多签名、分布式签名(多方计算)等机制。

公证人机制是技术上可实现的最简单的交易机制,无须考虑单链还是跨链、同构链还是异构链;缺点在于可能存在中心化风险,交易双方需要信任公证人。

PS:甚至可以认为区块链共识也是一种公证人机制,利用全球节点作背书。

Ripple协议

Ripple 是一个开源、分布式的金融支付协议,支持法币、比特币等虚拟币,对标 SWIFT 体系,想要成为国际支付和清算的方式。

Ripple 网络可以被认为是一条区块链,通过共享的公开数据库账本达成共识。Ripple并不是基于传统的 PoW 共识,而是 RPCA算法,利用最小信任的UNLs节点来加速共识。

在 Ripple 网络的交易中,用户可以随意选择支付的货类型币:用户的账户上可以持有一种货币,但使用另一种货币来支付。Ripple通过在大量争相赚取差价的做市商之间传递兑换单的方法来进行自动的货币兑换。

虽然 Ripple 对于用户来说很便捷,但其想要成为国际间通用的支付手段的愿景是注定不会成功的:它相当于一个新的 SWIFT 协议加上公开的账本信息,这些特点注定无法被拥有传统账本、崇尚私密的银行所接受。于是在 Ripple 的基础上,瑞波实验室又推出了 InterLedger 协议。

既然建立一个人人都同意的全球金融传输协议很困难,那么我们可以开发一个协议,它能将所有我们目前正在使用记账系统连接在一起。

哈希时间锁定(Hash TimeLock Contract)

哈希时间锁定机制利用 原子性 和 博弈论 实现了跨链交易的流程,相比于公证人机制用第三方信用背书,哈希时间锁定则用代码逻辑作为担保,具有更高的安全性。

假如有两条区块链 ChainA 和 ChainB,两个用户 Alice 和 Bob,Alice 有资产 a,Bob 有资产 b,Alice 与 Bob 想通过 哈希时间锁定 来交换资产,那么他们可以使用以下方式:

1. Alice 选取一个秘密随机数 S,计算出 S 的哈希值 H(S) ;
2. Alice 指定一个时间点 T1,根据 H(S) 和 T1 在 ChainA 上创建资产锁定合约:
   只有 Bob 签名的 S 并且在时间点 T1 之前才能将资产 a 转移走,如果到时间点 T1 后仍未解锁,则允许 Alice 撤销资产锁定。
3. Bob 也指定一个小于 T1 的时间点 T2,根据 H(S) 和 T2 在 ChainB 上创建资产锁定合约:
   只有 Alice 签名的 S 并且在时间点 T2 之前才能将资产 b 转移走,如果到时间点 T2 后仍未解锁,则允许 Bob 撤销资产锁定,同时可以考虑对 Alice 做相应处罚。
4. Alice 使用 S 在时间点 T2 前调用 ChainB 上的智能合约解锁消费资产 b;
5. 由于在 Alice 解锁资产 b 的过程中公开了参数 S ,所以 Bob 也获得 S 的值。Bob 使用 S 在时间点 T1 前解锁消费资产 a。

签名哈希锁是为了限制特定人员提取资产;加上时间锁是为了防止一方作恶不操作,导致资产一直处于锁定状态。

若一方作恶导致交易流程中断,另一方除了损失一些手续费和资产锁定时间,没有其他资产损失;而对作恶一方的惩处,可以在代码逻辑中具体实现。

PS:哈希时间锁定的关键点在于交易内容是公开的,因此 Bob 可以读取到参数 S,如果是在 Secret 这样的隐私链,该机制无法生效。

哈希时间锁定的使用场景局限于 跨链资产交换,无法实现 跨链资产转移;换言之,必须自行匹配到交易对手方才能进行资产互换,无法实现单方的资产转移。

闪电网络

最初的区块链系统为了实现公平、安全的目标,采用的是全部节点间的共识,再加上 PoW 机制,导致整个链上共识的时间是很长的,用户交易需要等待很长时间。

而 闪电网络 通过 哈希时间锁定 机制创造了一个链下的支付通道,将链上的频繁交易转移至链下,等到最终结算时再到链上进行状态共识。整个过程只需在链上进行两笔交易。

假如在比特链上有两个用户 Alice 和 Bob,他们是商业合作关系,想要使用闪电网络进行链下交易,那么他们可以使用以下的方式来实现:

1. Alice 和 Bob 先各自把 5 个 BTC 转到一个 2/2 的多重签名地址 M(P2SH):只有双方签名才可以消费代币,通道开启;
2. 一天 Alice 需要向 Bob 支付 1 个 BTC,此时 Alice 拥有 4 个 BTC, Bob 拥有 6 个 BTC;
	1. Alice 首先选取一个秘密随机数 S1,计算出 S 的哈希值 H(S1) ;
	2. Bob 指定一个时间点 T1,根据 H(S1) 和 T1 创建资产锁定交易 C1:
   		1. 将 6 个 BTC 从 M 转给 Bob;
		2. 将 4 个 BTC 从 M 转到一个 1/2 的多重签名:满足下面一个条件即可消费
			a. Bob 签名的 S1;
			b. 在 T1 时间后 Alice 的签名;
	3. Bob 对该交易签名后发给 Alice,Alice此时只能选择 接受并记录 或 发布交易强制中断通道
3. 一天 Alice 又向 Bob 支付 1 个 BTC,此时 Alice 拥有 3 个 BTC, Bob 拥有 7 个 BTC;
4. 这时 Alice 可以作恶了,因为此时有两笔 Bob 签名的交易 C1、C2,分别代表 Alice 拥有 4 和 3 个 BTC,Alice 肯定想要广播 C1 到链上,并强行中断通道;
5. 别担心,在 Bob 第二次签名 C2 之前,还有一个机制:Alice 需要公开 S1;
6. 此时如果 Alice 广播 C1,Bob 就可以在 T1 时间前通过 S1 消费掉通道内的所有代币;
7. 经过多次交易后,如果想要关闭通道:
	a. 双方协商在 M 发起一笔最终的交易状态到链上;
	b. 一方强行广播最后一次交易;

闪电网络主要面向高频、小额支付,节省了大量交易时间和费用,是比特链高扩展、低延迟一个解决方案。之所以称之为网络,是因为通道不只存在于两个人之间,利用中间人,P2P的通道可以最终扩展成一个网络,具体交易流程见下方 InterLedger 协议。

PS:以太坊扩容中也有类似实现,称为状态通道(State Channels)。

InterLedger 协议

关于 Interledger 协议,一个简单的解释是:两个不同的记账系统可以通过第三方连接器来中继货币的传输和转换。整个过程可以看作是单向的哈希时间锁定,为此 Interledger 还专门规定了 HTLA 协议。流程大致如下:

假如有两条区块链 ChainA 和 ChainB,两个用户 Alice 和 Bob,Alice 有资产 a,Alice 要通过链接器 Mo 向 Bob 支付款项 b,那么他们可以使用以下的方式来实现:

1. Bob 选取一个秘密随机数 S,计算出 S 的哈希值 H(S) ;
2. Alice 指定一个时间点 T1,根据 H(S) 和 T1 在 ChainA 上创建资产锁定合约:
	只有 Mo 签名的 S 并且在时间点 T1 之前才能将资产 a 转移走,如果到时间点 T1 后仍未解锁,则允许 Alice 撤销资产锁定。
3. Mo 也指定一个小于 T1 的时间点 T2,根据 H(S) 和 T2 在 ChainB 上创建资产锁定合约:
	只有 Bob 签名的 S 并且在时间点 T2 之前才能将资产 b 转移走,如果到时间点 T2 后仍未解锁,则允许 Mo 撤销资产锁定。
4. Bob 使用 S 在时间点 T2 前调用 ChainB 上的智能合约解锁消费资产 b;
5. 由于在 Bob 解锁资产 b 的过程中公开了参数 S ,所以 Mo 也获得 S 的值。Mo 使用 S 在时间点 T1 前解锁消费资产 a。

PS:不一定每次交易都上链,如 Alice 和 Mo 、Mo 和 Bob 之间都可以存在闪电网络。

整个过程很好理解,就是一个单向的哈希时间锁定。但我们之前提到过瑞波想做的不只是链间账本交易,对于那些和区块链毫无关系的,如银行系统之间的结算,Interledger 又要如何处理呢?

很遗憾,Interledger 也没有一个完美的解决方案。在草案中 Interledger 给出了两种方式:

  • 采用第三方公证人机制,对不支持 哈希时间锁定 或 账本 的资金进行托管;

  • 采用信任线,寻找一条可信的、支持 哈希时间锁定 的中继;

还是上面的例子,假如Bob一端不是ChainB,而是一个银行系统,那么:

  • 公证人机制:Mo 和 Bob 协商确定一个公证人系统,Mo 将银行资金托管给公证人,只有当 Bob 共享 S 后,才同意转账;

  • 信任线:Mo 和 Bob 是长期可信的商业合作关系;

2WP

上面我们了解了 跨链资产交换 的协议,在学习 跨链资产转移 的 侧链 / 中继 技术前,我们先来了解下什么是 双向锚定(2 Way Peg)。

跨链的过程不是一个真实物体从一条链转移到另一条,而是一些代币在一条链被锁定,在另一条链被生成。

跨链过程中最棘手的一个问题是,对应链如何判断代币在当前链已被 完全锁定,这就是 2WP 承诺。

由于 比特链 / 以太坊 等基于 PoW / PoS 的共识机制是 概率性 的,即当前区块被挖出、共识,但不一定是最终结果,等到未来有一个更长的链出现,现有的链还是要被废弃、否决。

而对于 Tendermint确定性共识机制,一旦区块被挖出、共识,结果就不会更改。

因此确定性共识的 2WP 很容易证明,而对于概率性共识的跨链,2WP的实现必须作出妥协。

具体实现方式:

  • 公证人机制,通过公证人进行托管,负责资产的锁定、验证和释放;

  • 维护 完整节点 或 轻节点,验证交易,妥协接受 概率性;

  • 区块纠缠,在链间区块上建立纠缠关系,假如未来其中一笔交易被撤销,那么交易所在的区块回滚,同时依赖于这一区块的另一条链上的区块也会回滚,其交易也会被撤销。(没有找到详细说明文章)

侧链

侧链通过双向锚定,允许主侧链之间能够互相操作、资产互转。

顾名思义,侧链偏指附属关系,在早期比特链时期,侧链作为比特链新技术的实验链被研究、发展,通过将高频交易转移至侧链,实现对主链的扩容。

侧链是一个独立的区块链,有自己的账本系统、共识机制、脚本合约等,所以侧链发生事故对主链没有影响。

公证人模式

最简单的实现方式是通过公证人托管,其同时负责主侧链的资产锁定和验证释放。

SPV模式

主侧链维护 完整节点 或 轻节点,验证交易是否确认。大致流程如下:

1. 当用户要向侧链转移代币时,首先在主链创建交易,将代币发送至一个特定地址锁定,这个地址是包含了侧链信息的特殊地址;
2. 等待一段确认期,使得上述交易获得共识;
3. 用户在侧链根据 SPV证明 提取代币;
4. 等待一段竞争期,防止双花攻击;
5. 原生代币解锁,在侧链上自由流通;
6. 当用户想要返回主链时,采取类似的反向操作。

摘自:https://yeasy.gitbook.io/blockchain_guide/06_bitcoin/sidechain

  • 确认期:为了能够获取区块内交易的 Merkle Proof 证明,可以证明资产已被锁定;

  • 竞争期:为了确保资产被 完全锁定。如等待SPV区块头的确认数大于 6 次。

资产锁定到特殊地址,可以通过主侧链软分叉升级协议来原生支持。

2017 年 1 月,基于一年多的探索,Blockstream 发表了文章《Strong Federations: An Interoperable Blockchain Solution to Centralized Third Party Risks》,着重描述了 联合挂钩(Federated Pegs)的相关概念和应用。

可以看作是 公证人机制 + 分布式私钥 的结合,用普通地址锁定释放资金,无需升级区块链协议,大致流程如下:

1. 在 TEE 中,内部存在一个 Master Secret,生成两个私钥 sk1 和 sk2;
2. sk1 对应于 锁定地址 a1; sk2 对应于 释放地址 a2;
3. Master Secret的重构拆分为 n 个秘钥,只有 m of n 才可以重构 Master Secret;
4. 用户要跨链转账时,发送代币到 a1;
5. 当至少有 m 个 公证人确认交易后,发送密钥碎片到 TEE,重构生成sk2;
6. a2 地址释放资金;

Plasma

Plasma 是以太坊的侧链解决方案,也是通过将大量交易和计算下放到侧链来实现主链的可扩展性。

Plasma 框架被设计成一个树状的区块链,以分层方式排列,使得可以在主链之上创建许多较小的链,这些链被称为 Plasma chain 或者 子链,主链的智能合约充当两者通信的媒介。

子链聚焦于不同需求的实现,主链则负责维持网络安全并惩罚作恶者,子链和主链之间的通信由防伪证明保护,每个子链都有自己的 共识机制 和 防伪证明。如果发生恶意行为,子链可以向其 父链 或 主链 提交投诉,回滚区块。大致流程如下:

1. 当用户要向子链转移代币时,首先在父链创建交易,将代币发送合约锁定;
2. Plasma 验证后生成相应数量代币在子链流通;
3. 子链周期性地向父链同步状态,提交 SPV 区块头信息;
4. 当用户要向父链转移代币时,在父链提交  Merkle Proof 资产证明;
5. 等待一段争议期,期间任何用户都可以对该区块提交 防伪证明;

在用户向父链转移代币退出子链时,处理过程是有优先级的,因为矿工可以作恶,他们可以构造虚假交易,通过退出优先级可以确保在错误交易之前的交易,都会比错误交易先处理。那错误交易之后的交易呢?为了处理这种情况,Plasma 要求每次交易必须有两次签名,一次是对自己的交易签名,一次是对区块签名,如果区块内包含作恶交易,用户为了自己的利益可以拒绝签名。两次签名无疑让用户很厌烦,为了解决这个问题,又提出了 More Viable Plasma

退出的争议期一般在一周左右,用户如果不想浪费时间,可以通过 中间人LP 付出一些手续费快速退款,中间人负责检验交易合法性。当子链遇到故障导致堵塞时,还可以通过批量退款,同样的任何涉及用户都可以对该区块提交防伪证明。

Plasma 在实现的过程中暴露出了一系列问题:批量退出、争议期、防伪证明、智能合约等。

  • 用户需要时刻监听交易详情、在争议期提交防伪证明,以避免有人”偷“走自己的代币;

  • 子链故障退出时,用户代币很容易释放,但智能合约的状态如何退出是一个问题,因此 Plasma 基本不支持智能合约;

PS:

Relay

中继,即转发链间通信的中间节点。在链间的交互中,侧链偏向于附属关系,一般共享原生代币;而中继主要指平等的链间关系。

侧链因为只连接主链,所以链间是可以直接通信的;但对于多链网络,不同于链下的闪电网络,如果每条链都直接通信,整个网络充斥着杂乱的通道,链路数量呈平方级上升,很快网络就会不堪重负。这时就需要以中继为中枢,形成一个可以多链协同的中心核轮辐模型。

侧链 / 中继模式下,链间通信都依赖于可信第三方进行信息转发,而之后的交易验证可以在 中继链 或 目标链上进行。

BTC Relay

BTC Relay 是 以太坊 上的一个智能合约,依赖于 Relayer 提交正确的区块头数据,通过存储 SPV 验证交易,及时提交正确 SPV 数据的 Relayer 将会得到奖励。BTC Relay 通过相对简单的设计实现了 比特链 到 以太坊 的单向跨链通信。

Polkadot

Polkadot 提出了一种异构的多链架构,支持多个高度差异化的共识系统进行访问和互操作。Polkadot 还计划将 私有链 / 联盟链 融入到公有链的共识网络中,同时又能保有 私有链 / 联盟链 的数据隐私和许可的特性。

Polkadot 网络主要由 中继链 和 平行链 构成,除此之外还有 转接桥 负责连接其他异构的区块链。平行链作为应用链实现特殊应用场景,但它们自身却不具备区块的共识能力,共识机制通过中继链执行,因此平行链甚至可以不是一条区块链。所有平行链共享中继链的安全,链间通过 XCMP 进行通信。

Polkadot 网络的参与方分为四类:验证者(Validators,负责验证平行链的数据)、收集者(Collator,负责采集平行链的数据并提交给验证者)、提名者(Nominator,Token质押者,为验证者提供押金和信用背书)和渔夫(Fisherman,负责举报和证明恶意行为)。

摘自 Polkadot 白皮书

假如有两条平行链 ChainA 和 ChainB,它们通过 Polkadot 进行跨链转账的大致流程如下:

1. 平行链 A 上的 Collator 收集跨链交易并验证交易的有效性,将交易打包进区块;
2. 中继链上 Validator 和 Nominator 质押原生代币,Validator 参与网络治理;
3. Polkadot 随机分组 Validator 并指定平行链,Validator 验证 ChainA 的区块;
4. 中继链上 Fisherman 质押原生代币,监控网络行为,举报作恶获得奖励;

Cosmos

和 Polkadot 类似:

  • Cosmos主要由 Hub(枢纽)和 Zone(分区)两部分组成,Hub 作为中继负责转发 Zone 之间的通信;

  • 网络都是确定性共识机制;

  • Cosmos 也将要推出共享中枢安全 – Interchain Security

和 Polkadot 不同的是:

  • Hub 只负责转发数据,由目标 Zone 作最终的交易验证;

  • Zone 是一条独立的区块链,拥有自己的 确定性共识机制(Tendermint)和独立安全;

  • 链间通过 IBC 协议进行通信。IBC 是抽象的通信协议,而 Polkadot 的 XCMP 只是一个通信流程,强耦合于 Polkadot 架构。

Cosmos 在已有区块链的架构上进行了抽象、解耦,Cosmos 只规定了网络层通信多链间利用 IBC协议 传输,之上的共识层(确定性)、应用层并无严格要求。

摘自 https://www.youtube.com/watch?v=yR4ORIQICYs

Cosmos的跨链转账流程大致如下:

1. Chain A 要向 Chain B 进行跨链资产转移,两个链会相互进行注册 或 握手;
2. Chain A 根据 Chain ID 和 Channel ID,计算出锁定地址,发送资产并锁定;
3. Relay 将 锁定证明 Proof 转发到 Chain B;
4. Chain B 维持着 Chain A 的一条轻节点,可以进行交易验证,通过后生成资产;
5. 当资产从 Chain B 退回 Chain A 时,进行销毁;
6. Chain A 根据相应证明释放锁定资产。

类似的,通过 Peg,Cosmos 与 以太坊 可以通过 Gravity Bridge 跨链通信,详细流程请见:https://www.gravitybridge.net/post/how-gravity-works

EVMOS

前面我们已经提到过了,Cosmos 只规定了多链间的通信标准,每条链的具体实现是自定义的。因此 Evmos 的目标就是通过对 以太坊EVM 的兼容,实现 Cosmos 多链网络对 以太坊 应用的无缝迁移支持。

PS:

跨链帐户

一个初步了解可见:

https://medium.com/chainapsis/why-interchain-accounts-change-everything-for-cosmos-interoperability-59c19032bf11

首先要说明的是,跨链帐户 不是指通过一个帐户就可以在 Cosmos 的多链网络进行互操作,它最初被命名为 IBC 托管账户,目的是为了抽象、解耦 IBC 在多链间通信的协议标准。

假如 Chain A 链上的 Alice 要和 Chain B 上的智能合约 Bob 通信:

  • 通过托管账户,IBC 的跨链通信只需要定义 Alice 帐户 到 B 链上托管账户的通信标准,具体 托管账户 与 Bob 交互的数据格式是封装的黑盒,无需关心。

  • 没有托管账户,AB链间的互操作需要定义 Alice 帐户 到 B 链上合约 Bob 的通信标准,涉及到多个合约时对应多个通信标准。

其实也不尽然,进一步思考,既然 IBC 可以定义 托管账户到合约 的黑盒标准,那一定也可以定义 A链帐户到合约 的数据格式黑盒,只是相对高耦合了一些。

采用 跨链帐户 的另一个原因是,区块链发展至今,功能其实主要还是虚拟代币、金融交易。既然是交易,肯定需要一个帐户,跨链帐户就是原链账户在对应链上的一个托管账户,负责在对应链上的金融交易,如质押、defi等。

Rollup && Shard

最后是 以太坊 的扩容,利用 链下的零知识证明 和 链上的分片 技术,我之前写过两篇小结可作参考:

跨链原理概述

通过上述的了解我们发现,其实跨链的实现也没有什么银弹。总结来说就两种实现原理,各有千秋:

  • 跨链资产交换:哈希时间锁定

  • 跨链资产转移:双向锚定

再加上 以太坊 的扩容:Rollup 和 分片,仅此而已。

其他跨链桥项目的原理大致都基于 2WP,不再赘述,只是具体实现方式不同:

  • 锁定证明:MPT(Merkle Proof Tree);

  • 信息转发:人肉跨链、公证人、预言机、中继节点等;

  • 验证链维护:验证节点、预言机等;

从安全性上看,跨链交互其实需要很大的信任。因为连接起来的多链网络会是一个很复杂的系统,其安全性会受限于于木桶原理,整个网络中的短板有可能会拉低这个网络中所有其他连接链的安全性。一旦一条链被攻破,它就可以制造出大量虚假数据,最终会污染整个网络。

这也是为什么 以太坊 选择了 扩容 而非 跨链,接下来就让我们进一步了解跨链安全和事故。

跨链安全

区块链网络的攻击手段,既有传统网络攻击,也有基于共识等机制的攻击,我们这里主要分析相关跨链合约的代码逻辑缺陷:

  • 网络:堵塞超时、日蚀、DDoS

  • 共识:双花、长短距离攻击、女巫攻击

  • 合约:整数溢出攻击、权限管理漏洞

随着多链网络的兴起,跨链桥在加密世界中变得越来越普遍,但由于其木桶原理,一旦出现问题会波及多个网络、大量资金;再加上项目方的“自大”,合约逻辑常常会出现问题。因此跨链桥获得黑客的”青睐”,从2021年至今,跨链安全事故数量接近百次,多数合约未经审计。

下面通过几个著名事故来简单分析下合约漏洞问题:

摘自 https://medium.com/coinmonks/cross-chain-bridge-vulnerability-summary-f16b7747f364

ChainSwap

ChainSwap 在短短半个月内暴露了两个漏洞利用,主要是由于权限校验逻辑问题,导致用户代币可以被黑客取出,依赖其跨链桥的超 20 个项目代币都遭遇黑客盗取。

MappableToken receive函数

两次攻击都是这个逻辑:(有点离谱,中间一个星期时间没有修复)

  • 初始要求最少三个验证节点,但是后面改成一个,攻击者成本降低,拥有更多攻击配额;

  • 签名验证只验证了发送地址,没有验证是否为可信的验证节点;

  • 攻击配额的减少,也没有校验是否为可信的验证节点;

  • 所以只需要任意一个地址伪造签名就可以完成攻击,等配额为0时换个地址,或等待一段时间恢复

Poly Network

官方详细时间线总结:

https://medium.com/poly-network/honour-exploit-and-code-how-we-lost-610m-dollar-and-got-it-back-c4a7d0606267

  • 源链没有检查发起的跨链操作,黑客可以任意构造数据;

  • 目标链也没有检查解析的目标调用合约和调用参数;

  • putCurEpochConPubKeyBytes 可以修改 可信记账人 节点地址;

  • 虽然这个函数是 onlyOwner,但跨链函数调用者就是合约的 owner;

  • 黑客通过伪造跨链数据,使目标链 owner 解析执行函数,修改地址;

Qubit Bridge

QBridge deposit函数

QBridgeHandler deposit函数

  • 传入任意非法值 resourceID,取得零地址,由于零地址在白名单,通过检测;

  • 合约自行实现了 safeTransferFrom,没有检测是否为合约,零地址通过检测;

  • deposit 执行成功,Deposit 事件触发,由于存入 ETH 和 ERC20 合约(WETH)的事件一样(当然区分事件也没有用),所以黑客可以凭借 ERC20 的 “存入证明” 提取对应数量的 ETH;

Meter Bridge

Handler deposit函数

代码逻辑真的辣眼睛:

  • 调用 Bridge 的 depositETH 函数存款,Bridge 会将 ETH 转为 WETH,接着 Handler 的 deposit 触发存款事件,由于存款逻辑在 Bridge 进行了,Handler 检测到是 WETH 合约就会跳过存款处理;

  • 调用 Bridge 的 deposit 函数存款,接着调用 Handler 的 deposit 函数,如果是 WETH 合约也会跳过存款处理

MultiChain

详细分析 + 工具:

https://medium.com/zengo/without-permit-multichains-exploit-explained-8417e8c1639b

  • 黑客伪造虚假 token,合约解析出错误的 underlying Token 地址 – WETH;

  • WETH 没有 permit 函数,但有 fallback 函数,且两者都没有返回值,签名检查通过;

  • 调用 safeTransferFrom 盗取其他用户资金

Wormhole

官方整理时间线:

https://wormholecrypto.medium.com/wormhole-incident-report-02-02-22-ad9b8f21eec6

  • 黑客攻击路径:complete_wrappedpost_vaaverify_signatures,分别对应三个tx:completevaasignature

  • 简单来说就是黑客为了通过 complete_wrapped 函数攻击,需要提交 vaa 和 验证;

  • 问题出在验证这里,从 Solana 1.8 起,该函数由于安全性被弃用,因为相关地址并没有被检查;

  • 使用load_instruction_at,意味着黑客可创建自己的 sysvar account,存储与 Instructions sysvar 中相同的数据,然后在调用 verify_signatures 时将该帐户替换为 Instruction sysvar,就可完全绕过签名验证;

  • 值得一提的是,该攻击就发生在 Wormhole 要升级 Solana 版本的前夕

Li Finance

CBridgeFacet  swapAndStartBridgeTokensViaCBridge函数

LibSwap swap函数

  • swapAndStartBridgeTokensViaCBridge 调用 swap 函数批量处理;

  • swap 没有鉴权,任何人都可以调用他人授权的地址进行转账等操作;

  • 另外由于 swapAndStartBridgeTokensViaCBridge 下方有数量检测,所以需要真正存入一笔资金;

官方的总结也说明了为什么合约问题屡见不鲜:

  • Our mission is to maximize UX;

  • The timing could not have been more unfortunate as we are only a week away from the start of our audits;

也希望能给其他项目方一个警醒,安全是第一位的,不要出事了才想到审计。

Ronin Network

本次攻击和合约无关,是网络层面的攻击,因此没有太多要讲的。

黑客通过对 Sky Mavis 实施网络钓鱼攻击渗透 Sky Mavis IT 基础设备,获得 4 个验证节点的访问权限,又通过 Gas-Free RPC 节点发现了一个后门,获取了 Axie DAO 验证节点的签名,从而控制了 5/9 的验证节点。

除了黑客攻击外,主要是授权不够去中心化,之前有临时状况进行集权,但后续没有及时撤销,后续 Ronin 计划将在网络中添加几个新的验证者节点,以进一步去中心化。

Layer Zero

  • 合约升级:https://www.diffchecker.com/RJdDTCx7

  • 原始漏洞代码在进行 MPT(Merkle Proof Tree) 验证时,通过外部传入的 pointer 来获取下一层计算所用到的 hashRoot;

  • 由于没有限制 pointer 在 proofBytes 长度内,可以通过传入越界的 pointer,使合约读取到 proofBytes 以外的数据作为下一层的 hashRoot;

  • 这样存在伪造 hashRoot 的可能,进一步可能导致伪造交易可以通过 MPT 验证;

  • 这个攻击和权限管控、是否为多签无关

PS:撰写本文时,基于 Layer Zero 的 Stargate 项目的 Rainbow Bridge(Near)被黑客尝试攻击,一个 SPV 类的攻击,黑客尝试创建轻节点伪造交易,但是被挑战,攻击失败了。

BNB IAVL 攻击

IAVL 树是 Cosmos 团队设计的一种新的数据结构,其结合了 Merkle 树和 AVL 树的优点。但在计算 Proof 的过程中,没有考虑到边界情况,导致存在右节点不为空的情况下未参与 hash 计算,攻击者可以构造带有恶意 payload 的节点通过 Proof 校验。

详细分析请见:

跨链安全概述

虽然跨链出现了很多事故,大部分跨链的安全问题没有出自状态的同步、共识,而仅仅是因为普通的代码逻辑。其实不只是跨链,目前整个区块链发展都仍处于野蛮生长阶段,安全问题不容小觑。