一文具体复盘Poly Network被黑6.1亿美元进程及原因
2021 年 08 月 10 日,据慢雾区动静,跨链互操纵协议 Poly Network 蒙受黑客进攻,慢雾安详团队第一时间参与阐明,并将阐明功效分享如下。
进攻配景
Poly Network 是由 Neo、Ontology、Switcheo 基金会配相助为首创成员,漫衍科技作为技能提供方配合提倡的跨链组织。
如下图,通过官方的先容我们可以清楚的看出 Poly Network 的架构设计:用户可以在源链上提倡跨链生意业务,生意业务确认后由源链 Relayer 将区块头信息同步至 Poly Chain,之后由 Poly Chain 将区块头信息同步至方针链 Relayer,方针链 Relayer 将验证信息转至方针链上,随后在方针链举办区块头验证,并执行用户预期的生意业务。
以下是本次进攻涉及的详细地点:
进攻焦点
源链未对提倡的跨链操纵的数据举办查抄。
方针链未对理会出的方针挪用合约以及挪用参数举办查抄。
EthCrossChainData 合约的 owner 为 EthCrossChainManager。
bytes4(keccak256(abi.encodePacked(_method, "(bytes,bytes,uint64)"))) 可以被 hash 碰撞。
进攻细节
Poly Network 会在各个链上陈设智能合约以便举办跨链互操纵(阐明将以在以太坊陈设的智能合约为例),个中 EthCrossChainManager 合约用于验证 Poly Chain 同步来的区块头以确认跨链信息的真实。EthCrossChainData 合约用于存储跨链数据,中继链验证人 (即 Keeper) 的公钥也存储在这个合约中。LockProxy 则用于资产打点。
本次进攻中,进攻者分两步来完成这次进攻,我们接下来举办具体阐明:
首先进攻者通过在其他链挪用 crossChain 函数结构数据提倡跨链生意业务。
我们切入此函数举办阐明 :EthCrossChainManager.crossChain
从上图我们可以清晰的看出,此函数只是用于辅佐用户结构 makeTxParam 并存储告终构后的哈希以便后续验证,其并未对用户传入的跨链操纵参数举办任何限制,因此进攻者完全可以通过结构任意想结构的数据而让 Relayer 毫无预防的将其同步至 Poly Chain,通过 Poly Chain 将其同步至以太坊 Relayer。
随后在以太坊上的 Relayer 通过挪用 EthCrossChainManager 合约中
的 verifyHeaderAndExecuteTx 函数提交区块头信息来验证这笔跨链信息的真实性。
我们切入此函数举办阐明:EthCrossChainManager.verifyHeaderAndExecuteTx
通过上图代码我们可以看出其先对区块头举办反序列化,以解出所需要验证的详细信息。随后挪用 getCurEpochConPubKeyBytes 函数从 EthCrossChainData 合约中获取 Keeper 公钥,并通过 deserializeKeepers 函数获得 Keeper 地点。
接下来将通过 ECCUtils.verifySig 验证签名是否为 Keeper,从以下代码中我们可以发明 verifySig 函数中会切出签名者的 v r s,并通过 ecrecover 接口获取签名者地点,然后挪用 containMAddresses 函数轮回较量签名者是否为 Keeper,只要 Keeper 签名数量切合要求即可通过查抄,数量要求即为 EthCrossChainManager 合约传入的 n - ( n - 1) / 3)。
签名验证后会通过 ECCUtils.merkleProve 举办默克尔根验证,只要是正常跨链操纵即可通过此项查抄。随后会对生意业务是否反复发送举办查抄并存储已验证后的数据。这里只需担保不反复提交即可。
最后,也是最要害的一步,其将通过内部挪用 _executeCrossChainTx 函数执行结构的数据。
从上图我们可以看出 _executeCrossChainTx 函数未对传入的 _toContract、_method 等参数举办查抄就直接以 _toContract.call 的方法执行生意业务。
个中通过链上数据我们可以看出 EthCrossChainData 合约的 owner 即为 EthCrossChainManager 合约,而先前我们知道中继链验证人 (即 Keeper) 的公钥存在 EthCrossChainData 合约中,且此合约存在 putCurEpochConPubKeyBytes 函数可以直接修改 Keeper 公钥。
颠末以上阐明,功效已经很明晰了,进攻者只需在其他链通过 crossChain 正常提倡跨链操纵的生意业务,此生意业务目标是为了挪用 EthCrossChainData 合约的 putCurEpochConPubKeyBytes 函数以修改 Keeper 脚色。随后通过正常的跨链流程,Keeper 会理会用户请求的方针合约以及挪用参数,结构出一个新的生意业务提交到以太坊上。这本质上也只是一笔正常的跨链操纵,因此可以直接通过 Keeper 查抄与默克尔根查抄。最后乐成执行修改 Keeper 的操纵。
但我们留意到 putCurEpochStartHeight 函数界说为
function putCurEpochConPubKeyBytes(bytes calldata curEpochPkBytes) external returns (bool);
而 _executeCrossChainTx 函数执行的界说为
abi.encodePacked(bytes4(keccak256(abi.encodePacked(_method, "(bytes,bytes,uint64)")))
我们可以知道这两个函数的函数签名在正常环境下传入的 _method 为 putCurEpochStartHeight 必定是完全差异的,因此通过 _toContract.call 理论上是无法挪用到 putCurEpochStartHeight 函数的。但 _method 是进攻者可以节制的,其完全可以通过列举各个字符组合以得到与挪用 putCurEpochConPubKeyBytes 函数沟通的函数签名,这要求其只需列举前 4 个字节切合即可。我们也可以本身实验列举验证,如下所示:
可以看出前四个字节与 putCurEpochConPubKeyBytes 函数是一致的
至此我们就已还原出进攻者的进攻细节。
通过理会链上数据,我们可以发明进攻者将 Keeper 替换为了
0xA87fB85A93Ca072Cd4e5F0D4f178Bc831Df8a00B。
最后进攻者只需利用替换后的 Keeper 地点举办签名即可通过所有查抄执行挪用 LockProxy 合约将其打点的资产转出。
进攻流程
进攻者在源链经心结构一笔修改方针链 Keeper 的操纵。
操作官方 Relayer 正常在方针链提交数据并执行替换 Keeper 操纵。
进攻者通过替换后的 Keeper 地点对其转出资产的操纵举办签名提交至 EthCrossChainManager 举办验证。
验证 Keeper 为进攻者已替换完的地点通过查抄,执行将资产转移至进攻者指定地点。
赢利走人。
MistTrack 阐明进程
慢雾 AML 团队阐明统计,本次进攻损失共计超 6.1 亿美元!
详细如下:
资金流向阐明
慢雾 AML 旗下 MistTrack 反洗钱追踪系统阐明发明,进攻者初始的资金来历是门罗币 (XMR)。
免责声明:数字资产交易涉及重大风险,本资料不应作为投资决策依据,亦不应被解释为从事投资交易的建议。请确保充分了解所涉及的风险并谨慎投资。OKEx资讯站仅提供信息参考,不构成任何投资建议,用户一切投资行为与本站无关。