木星链 木星链
Ctrl+D收藏木星链
首页 > ETH > 正文

POL:跨链桥警钟常鸣:Polygon 如何预防「潘多拉魔盒」的开启

作者:

时间:1900/1/1 0:00:00

1 Polygon 是谁?

Polygon 是以太坊的 layer2 扩容方案,其愿景是建造以太坊的区块链互联网。Polygon 提供了一个通用框架,允许开发人员利用以太坊的安全性创建定制的,专注于应用程序的链,并提供一个互操作性网络,结合了各种不同的扩展方案,如:zk-rollup、PoS 等。其中,Polygon PoS 是目前 Polygon 上最成熟和广为人知的扩容方案。它利用侧链进行交易处理,实现提升交易速度并节省 Gas 消耗的目的,网络结构主要包含以下三层:

以太坊主网上的一系列合约,主要包括:Staking、Checkpoint、Reward 合约,负责 PoS 权益相关的质押管理功能,包括:提供 MATIC 原生代币的质押功能,使得任何质押该代币的人可以作为验证者加入系统;验证 Polygon 网络的转态转换获得质押奖励;惩罚验证者的双重签名、验证者停机等不合法行为;保存 checkpoint。

权益证明验证节点层,包括一组 PoS Heimdall 节点,负责将 Polygon 网络的检查点提交给以太坊主网,同时监听部署在以太坊上的一组质押合约。主要流程为:首先选择验证者池中的一部分活跃的验证者作为块生产者,它们将负责在 Bor 层创建区块并广播;接着根据 Bor 提交的检查点,验证 Merkle 根哈希并附加签名;最后,提议者将负责收集指定检查点的所有验证者签名,如果签名数量达到 2/3 以上,则在以太坊上提交该检查点。

出块节点层,包括一组由 Heimdall 层上的验证者委员会定期选取的区块生产者,它们是一个验证者子集,负责将 Polygon 侧链上的交易聚合并生成区块。该层会定期向 Heimdall 层发布检查点(checkpoint),其中检查点代表 Bor 链上的一个快照,如下图所示。

检查点机制是一种将 Bor 层的数据同步到以太坊上的机制,其中同步的数据是检查点,即在一个检查点间隔的时间段内包含的 Bor 层区块数据快照,源码如下:

Proposer:提议者,它也是由验证者选取的,区块生产者和提议者都是验证者的子集,且他们的责任取决于其在整个池子中的股权比例。

RootHash:是由 StartBlock 到 EndBlock 之间的 Bor 块生成的 Merkle Hash。

以下是编号 1 到 n 的 Bor 块生成 RootHash 值的伪码:

综上,该值是 Bor 区块头中的区块号 number、区块时间戳 time、交易树根 Hash 值 tx hash、收据树根 Hash 值 receipt hash 计算得到的 keccak256 哈希值构成的 Merkel tree 的根哈希值。

AccountRootHash:需要将每个检查点发送到以太坊上的验证者相关账户信息的 Merkle Hash,单个账户信息的哈希值计算方式如下:

OKX Web3钱包现已集成跨链桥Stargate:6月7日消息,据官方消息,OKX Web3 钱包现已集成 Stargate 跨链桥。目前 OKX Wallet 支持 10+主流跨链聚合 Swap 服务,在用户使用 OKX Web3 钱包进行兑换交易时,为用户提供最优跨链深度与最优报价。同时 OKX Web3 钱包的限价功能支持手动设置成交价格,当达到预设价格后交易会自动执行,方便用户以预期价格成交。[2023/6/7 21:21:55]

由账户 Merkle tree 根哈希值生成 AccountRootHash 的方式与 RootHash 值相同。

状态同步机制(StateSync)是指将以太坊数据同步到 Polygon Matic 链,主要分为以下几个步骤:

首先以太坊上的合约会触发 StateSender.sol 中的 syncState() 函数进行状态同步

syncState() 函数将发出一个 event 事件,如下:

Heimdall 层的所有验证者都会收到该事件,其中一个验证者会将该交易打包到 heimdall 区块中,并添加到待处理的状态同步列表中;

bor 层节点会通过 API 获取到上述待同步列表,交给 bor 层的合约进行进一步的业务逻辑处理。

Polygon Bridge 实现了 Polygon 和 Ethereum 之间的双向跨链通道,使得用户可以在两个不同链平台之间更为方便地转移代币而不会产生第三方威胁和市场流动性限制。Polygon Bridge 有 PoS 和 Plasma 两种类型,二者在 Polygon 和 Ethereum 之间的资产转移都有以下相同之处:

1)首先需要将 Ethereum 上的代币映射到 Polygon,如下图所示:

2)同样采用双向锚定技术(Two-way Peg),即

a:从以太坊上转移的代币资产都会先在 Ethereum 上被锁定,且相同数量的映射代币会在 Polygon 上被铸造;

b:为了将代币资产提取到 Ethereum,首先需要将这些映射代币在 Polygon 上 burn 掉,之后再解锁锁定在 Ethereum 上的资产;

下图为 PoS Bridge 和 Plasma Bridge 的对比:

由上图可知,安全性方面,PoS Bridge 依赖于外部验证者集合的安全性,而 Plasma 依赖于 Ethereum 主链的安全性。同时在用户进行跨链资产转移时(如将代币从 Polygon 转移到 Ethereum),PoS 仅需要一个检查点的间隔时间,大约 20 分钟到 3 小时;而 Plasma 则需要一个 7 天的争议挑战期。同时 PoS 支持更多的标准代币,而 Plasma 仅支持三种类型,包括:ETH、ERC20、ERC721。

PoS Bridge 主要包含两个功能:Deposit 和 Withdrawals,其中 Deposit 指的是将用户在以太坊上的资产转移到 Polygon,Withdrawals 则指的是将资产从 Polygon 提取到以太坊上。

NEAR选择Wormhole作为官方跨链桥,将共同开发ZK轻客户端:5月17日消息,跨链桥Wormhole宣布NEAR Protocol选择其作为新的官方跨链桥,Wormhole将使所有的NEAR资产能够无缝桥接到20多个连接的链,并将数百个Wormhole支持的应用程序和社区带入NEAR生态系统。此外,Wormhole的核心贡献者将加入Zpoken和NEAR一起开发ZK轻客户端,该客户端可证明和验证以太坊和NEAR状态,而无需当今所需的相同信任假设。[2023/5/17 15:08:22]

下面以用户 Alice 使用 PoS Bridge 将其以太坊账户上的代币资产发送到其在 Polygon 账户中为例进行介绍:

1、如果用户想转移的代币资产为 ERC20、ERC721、ERC1155 类型,则首先需要用户将要转移的代币通过 approve 函数授权。如下所示:通过调用以太坊上 token 合约中的 approve 方法将对应数量的 token 授权给 erc20Predicate 合约。

其中 approve 函数有两个参数:

spender:用户授权允许花费代币的目标地址

amount:可以被花费的代币数量

2、上述授权交易被确认后,用户接着通过调用 RootChainManager 合约的 depositFor() 方法将代币锁定到以太坊上的 erc20Predicate 合约中。此处,如果转移的资产类型是 ETH,则调用 depositEtherFor()。具体如下:

其中 depositFor 函数有三个参数:

user:接收 Polygon 上 deposit 代币的用户地址

rootToken:以太坊主链上的 token 地址

depositData:ABI 编码后的代币数量

以下是 RootChainManager 合约中 depositFor 函数的具体代码:

分析源码可知,该函数首先获取到 token 对应的 predicate 合约地址,接着调用其 lockTokens() 函数将 token 锁定在该合约中。最后_stateSender 将调用 syncState() 进行状态同步,该函数只有 admin 设置的状态发送者(state sender)才能调用。

3、StateSender.sol 中的 syncState() 函数将提交事件 StateSynced,具体为:

其中第一个参数为该 log 的序号索引,第二个参数用于校验调用者是否是已注册的合法合约地址,第三个是需要进行状态同步的数据。该交易会被添加到 Heimdall 块中,并被添加到挂起的状态同步列表中。

Arbitrum:官方跨链桥新增交易历史记录功能:3月9日消息,以太坊 Layer2 扩容解决方案 Arbitrum 宣布,官方跨链桥新增交易历史记录功能。[2023/3/10 12:52:52]

4、接着 Polygon Matic 链上的 bor 节点通过 API 获取到状态同步列表中的 StateSynced 事件后,该链上的 ChildChainManager 合约会调用 onStateReceive() 函数,该函数用于接收从以太坊上传过来的同步数据,根据状态同步的业务逻辑类型进行下一步处理:

data:包括 bytes32 类型的 syncType、bytes 类型的 syncData。其中,syncType 代表业务类型,包括 deposit 和 mapping 代币映射;当 syncType 为 mapping 时,syncData 为编码后的 rootToken 地址、childToken 地址和 bytes32 类型的 tokenType;当 syncType 为 deposit 时,syncData 为编码后的 user 地址、rootToken 地址和 bytes 类型的 depositData。depositData 在 REC20 中是数量,ERC721 中指的是 tokenId。

5、由于此处进行的是 Deposit 业务,所以接着会调用_syncDeposit() 函数。该函数会首先将 syncData 按照对应格式解码,得到对应的 rootToken、user 地址、depositData。接着校验 rootToken 在 polygon 上是否有对应的映射代币 childToken,如果有则调用 childToken 的 deposit() 函数。

6、此处我们以 ERC20 的代币合约为例,介绍映射代币合约如何 deposit。该函数将 mint 对应数量的代币到用户账户中。

该函数有两个参数:

user:正在进行存款的用户地址

depositData:用 ABI 编码的 amount

下面以用户 Alice 使用 PoS Bridge 将其在 Polygon 账户中存放的资金提取到以太坊账户为例进行介绍:

1、当用户 withdraw 时,需要首先在 Polygon 链上通过调用映射 token 合约的 withdraw() 函数,burn 掉对应数量的映射代币。

withdraw 仅包含一个参数:将要被 burn 掉的 token 数量。对应的 token 合约中的 withdraw() 函数如下:

稳定币跨链桥Symbiosis推出Mobile SDK和JS SDK:据官方消息,稳定币跨链桥Symbiosis Finance宣布推出两个软件开发工具包(SDK)功能,分别是Symbiosis Mobile SDK、Symbiosis JS SDK。Symbiosis相信,SDK集成将在Web3浪潮中发挥巨大作用。

据悉,Symbiosis Mobile SDK是一个多平台库,旨在创建适用于Symbiosis生态系统和Web3领域的应用程序。为此,Symbiosis使用Kotlin多平台方法同时支持Android和iOS生态系统。

JS SDK帮助开发人员将协议集成到外部应用程序中。用户不需要对智能合约有深入了解,就能理解如何使用SDK。它还有助于用户进行代币跨链兑换。浏览器钱包可以使用该SDK来吸引新用户,获得更多的流量和收入。Symbiosis计划在未来推出一款可以添加到任何网站的小插件。[2022/3/30 14:27:33]

2、上述交易将经过大约 20 分钟到 3 小时将被包含到 checkpoint 中,被验证者提交到以太坊。

3、一旦交易被添加到检查点中并提交到了以太坊,将调用以太坊上的 RootChainManager 合约的 exit() 函数,该函数将通过验证提交的检查点内容确认在 Polygon 上 withdraw 交易的有效性,并触发对应的 Predicate 合约解锁用户 deposit 的代币。

其中,传入该函数的 Proof 证明 inputData 包括以下数据:

headerNumber:包含了 withdraw 交易的检查点区块 header

blockProof:证明子链中的区块头是提交的 merkle root 的叶子节点

blockNumber:子链上包含 withdraw 交易的区块号

blockTime:withdraw 交易的区块时间戳

txRoot:区块交易树的 root 值

receiptRoot:区块收据树的 root 值

receipt:withdraw 交易的收据

receiptProof:withdraw 交易收据的默尔克证明

branchMask:收据树中 32 位表示的收据路径

receiptLogIndex:从收据树中读取的日志索引

下面是该函数的核心逻辑,主要包括三部分:第一部分是校验 withdraw 交易收据的有效性,第二部分是校验检查点是否包含了交易区块,第三部分是调用 predicate 合约中的 exitTokens() 函数将锁定的代币发送给用户。

4、以 ERC20Predicate 合约为例,即从 log 中解码出接收者、发送者、发送代币数量后,将给定数量的代币发送给用户。

由 PoS Bridge 跨链消息传递过程源码分析可知,整个过程的函数调用都只有验证者指定的角色才能调用,所以跨链的安全性仅由 PoS 保证(公证人)。

Wanchain跨链桥WanBridge已集成Fantom:11月18日消息,Wanchain跨链桥WanBridge已集成Fantom,可以实现与FTM等Fantom链上资产的多链互跨,此前Wanchain通过跨链桥WanBridge已跨链集成Ethereum、EOS、XRP、BSC、Polkadot、Litecoin、Moonriver、Avalanche在内的区块链网络。

注:WanBridge跨链桥由25个跨链节点(Storeman)组成,每个节点通过每月的公开竞选产生,整个跨链节点组的密钥控制方式是分布式的,每个节点只掌握一个私钥碎片,通过安全多方计算和门限最优签名完成资产的跨链转账。[2021/11/18 22:01:30]

Plasma Bridge 同样包含两个功能:Deposit 和 Withdrawals,具体流程如下图所示:

Polygon Plasma 与我们跨链桥系列第一篇文章介绍的比特币 Plasma MVP 实现略有差别,主要采用基于账户模型的 Plasma MoreVP。该算法与 Plasma 相比,主要在 withdraw 部分做了部分改进。

由于 ERC20、ERC721 的代币传输,是通过类似比特币 UTXO 的 event 日志实现的,所以我们首先介绍一下该事件:

input1:转账前发送者的账户余额

input2:转账前接收者的账户余额

output1:转账后发送者的账户余额

output2:转账后接收者的账户余额

其次,原先的 Plasma MVP,由于区块是由单个(Operator)或者少数的区块生产者生成,因此在 Polygon 上存在以下两种攻击场景:

Operator 作恶:

上一篇文章(《跨链桥安全回顾:Nomad 去中心化抢劫事件带给我们什么启发?》)提到,当用户的交易被 Operator 打包为 Plasma 区块后,存在链下数据的不可用性问题。因此,用户在进行 exit 交易时,如果从较旧的交易开始退出,Operator 可以使用其最近的一笔交易对其发起挑战,则会挑战成功。同时,由于 Plasma 中采用了 PoS 的检查点机制,Operator 如果勾结验证者作恶,甚至可以伪造一些状态转换并提交到以太坊。

用户作恶:

用户在发起 exit 交易后,继续在 Polygon 上花费代币,类似于跨链的双花。

综上,Polygon 的 Plasma MoreVp 算法采用了另一种计算退出优先级的算法,即从最近的交易开始退出。该方式由于使用了类似 UTXO 的 LogTransfer 事件,只要用户的合法交易使用了正确的 input1、input2,即使 Operator 一些恶意交易打包在用户交易之前,由于用户交易仅来自有效的 input,所以也能被正确处理。相关伪代码如下:

下面以用户 Alice 使用 Plasma Bridge 将其以太坊账户上的代币资产发送到其在 Polygon 账户中为例进行介绍:

1、首先用户同样需要将其需要转移的代币资产通过 approve 函数授权给主链(Ethereum)上的 Polygon 合约 depositManager。

2、同样等到授权交易被确认后,用户调用 erc20token.deposit() 函数,触发 depositManager 合约的 depositERC20ForUser() 函数,存入用户的 ERC20 代币资产。

3、当以太坊主网确认了该 deposit 交易,接下来会创建一个仅包含这笔交易的区块,并将其采用状态同步机制发送到 Polygon 网络上的 childChain 合约中,mint 相同数量的映射币并存入用户在 Polygon 上的账户。

注:由 childChain 合约源码分析可知,Plasma 仅支持三种类型,包括:ETH、ERC20、ERC721。

当用户想使用 Plasma bridge 从 Polygon 上提取资产到以太坊上,会经历以下几个步骤:

1、用户通过调用 Polygon 上映射币的 withdraw() 函数,burn 掉 Polygon 链上的映射代币资产:

也可以调用 Polygon 上的 Plasma Client 的 withdrawStart() 接口实现。

2、用户可以调用 ERC20Predicate 合约中 startExitWithBurntTokens() 函数,该函数首先会调用 WithdrawManager.verifyInclusion() 校验 checkpoint 是否包含 withdraw 交易和对应的收据,代码如下:

验证通过后,将调用 WithdrawManager.addExitToQueue() 将其按照优先级排序插入到消息队列中:

最后,addExitToQueue() 调用_addExitToQueue() 铸造一个 NFT 作为退款凭证:

3、用户等待 7 天的挑战期

4、挑战期完成,可以调用 WithdrawManager.processExits() 函数将代币发送给用户。

该函数主要分为两个步骤:首先确认消息队列中的 withdraw 交易是否已经过了 7 天挑战期,如果已经超过挑战期则将其该交易移除队列:

接着,判断退款凭证 NFT 是否在挑战期内被删除,未被删除则将该 NFT 销毁并将对应资产退还给用户:

2021 年 10 月 5 日,白帽子 Gerhard Wagner 提交了一个 Polygon 漏洞,该漏洞可能导致双花攻击,涉及到的金额为 8.5 亿美元,白帽子因此获得了 Polygon 官方的 2,000,000 美元漏洞赏金。

在前文 Plasma Bridge 的介绍中我们知道,完整的一次 Withdraw 交易过程为:

用户在 Polygon 上发起 Withdraw 交易,该交易会 burn 掉用户在 Polygon 的代币;

经过一个检查点间隔(大约 30 分钟),等待该 withdraw 交易被包含到检查点中;

超过 2/3 的验证者签名后将其提交到以太坊,此时用户调用 ERC20PredicateBurnOnly 合约中的 startExitWithBurntTokens() 校验 checkpoint 是否包含 burn 交易;

校验通过,则铸造一个 NFT 退款凭证发给用户

用户等待 7 天挑战期

调用 WithdrawManager.processExits() 销毁 NFT,并退款给用户

注意:Polygon 为了防止交易重放(双花攻击),使用 NFT 作为退款凭证,来唯一标识一笔 Withdraw 交易。但是,由于 NFT 的 ID 生成缺陷,造成了攻击者可以构造参数利用同一笔有效的 Withdraw 交易,生成多个不同 ID 的 NFT,再利用这些 NFT 进行退款交易,从而实现「双花攻击」。

下面将对如何如何生成 NFT 进行详细介绍:

1、由上文中的源码解析可知,addExitToQueue() 会调用_addExitToQueue() 铸造一个 NFT:

由传参分析可知,exitid = priority,则 NFT 的 ID 即为 Plasma Bridge 中的 age 优先级左移一位生成。

2、上文的源码解析可知,age 是 WithdrawManager.verifyInclusion() 函数的返回值,该函数会首先校验 withdraw 交易的有效性,校验通过则生成对应的 age。其中,校验的逻辑中使用了可控参数 data 解码出的值 branchMaskBytes:

同时生成 age 时也使用了该值:

3、跟踪交易验证逻辑中的调用的 MerklePatriciaProof.verify() 函数,发现该函数调用_getNibbleArray() 对 branchMaskBytes 进行了转码操作:

4、继续跟踪该解码函数,该函数对 branchMaskBytes 转码时存在丢弃部分值的情况,这种数值丢失的方式会造成不同的值转码后获得同样的解码值。具体为:如果传入的 hp 编码后的值 b 的第一个十六进制位(半个字节)是 1 或 3,就解析第二个十六进制位。否则,就直接忽略第一个字节。

那么如果攻击者构造一个 branchMaskBytes 参数,使得其第一个十六进制位不等于 1 和 3,则共有 14*16 = 224 种方式,能够获得相同的转码后的值。

具体的攻击流程为:

通过 Polygon Plasma 向 Polygon 存入大量 ETH/ 代币

在 Polygon 上发起 Withdraw 交易,等待 7 天的挑战期

修改 withdraw 交易中 branchMaskBytes 参数的第一个字节(同一有效交易最多可以重新提交 223 次),重复发起 Withdraw 交易

综上,该漏洞主要是由于生成防止重放的退款凭证 NFT 的 ID 算法设计存在问题,导致相同的退款交易可以生成不同的 NFT,造成双花攻击。事实证明,编码分支掩码的第一个字节应该始终是 0x00. 修复方法是检查编码的分支掩码的第一个字节是否是 0x00 并且不要将其视为不正确的掩码。

原文标题:《跨链桥安全研究 ( 三 ) | 多边形战士 Polygon 安全透析,如何预防「潘多拉魔盒」的开启?》

撰文:成都链安

来源:ForesightNews

ForesightNews

个人专栏

阅读更多

财经法学

金色早8点

Bress

链捕手

PANews

Odaily星球日报

标签:POLOLYPolygonPOLYPPOLL币HOLY价格polygon币matic币投资机构polygon币圈

ETH热门资讯
NFT:NFT在以太坊合并后表现如何?市场对其态度是否转变?

从某种角度来看,以太坊合并并没有带来价格上涨,这与预期相违令人失望。在某些方面,以太坊的NFT市场本应该带来一些积极的影响。然而,由于ETH转向为PoS,这样的积极影响并未发生.

1900/1/1 0:00:00
ETH:合并后的一天内 ETHW Core 将继续进行 ETH PoW 分叉

最令人期待的以太坊合并现在就在眼前,但并不是每个人都很热切的等待更新。一个名为ETHW Core的组织反对这一转变(POW到POS),他们也准备在主要更新发布后的一天内进行硬分叉.

1900/1/1 0:00:00
NFT:每周热搜:「LUNC」热度蹿升 「Sui」与「世界杯」再度上榜

注:「每周热搜」统计自 Foresight News 上周五至本周四(9 月 2 日至 9 月 8 日)的用户搜索结果,同时对相同概念的大小写进行了合并处理.

1900/1/1 0:00:00
比特币:鲍威尔是 2022 年的保罗·沃尔克吗?答案对比特币很重要

来源:Coindesk编译:比推Bitpush News Mary Liu如果美联储主席杰罗姆·鲍威尔(Jerome Powell)赢得通胀战怎么办?美联储再次大幅加息之后.

1900/1/1 0:00:00
元宇宙:是炒作概念还是真的未来?169个APP自称为元宇宙社交

文:徐赐豪元宇宙社交似乎成为各大公司重点卡位的赛道,但是整体而言,目前还未有现象级元宇宙社交产品的出现。今日,映宇宙推出海外元宇宙社交产品The Place.

1900/1/1 0:00:00
NFT:深度长文:Web3时代 品牌应该如何把握新机遇?(上篇)

最近看了很多讲Web3怎么助力品牌营销的长文,收获颇丰。但分享给还在一线做品牌的小伙伴,收到的反馈却是:还是看不懂,你就直接告诉我咋搞,怎么搞,有没有什么成功案例可以参考?效果好不好?这倒是提醒.

1900/1/1 0:00:00