时间:2023-07-17|浏览:197
事件回顾: 2021年8月10日,PolyNetwork遭受了跨链攻击,攻击者转移了6亿美元的加密资产(之后开始陆续归还被盗资产)。攻击者在多个公链上进行了恶意交易,并借助中继器(Poly-Relayer)完成了攻击。 用物业的例子来解释的话,黑客使用假的房主证明(Ontologychain上的无效交易),却从物业(中继器Poly-Relayer)那里拿到了真正的钥匙(Poly链上经过签名的Merkle证明)。
攻击解析:
一、黑客在OntologyChain上发起了一个本应是无效的恶意交易。 二、中继器Ontology-Relayer在没有充分检查的情况下将该交易添加到PolyChain的Merkletree中并签字,然后发布到PolyChain区块中。这也可能是为什么黑客不得不冒险通过中心化交易所购买"ONG"(OntologyChain的Gas)的原因。 三、黑客利用步骤二中的有效Merkle证明,在以太坊上调用了PolyNetwork的ECCM合约,将keepers改为黑客控制的公钥。 四、获得keepers权限后,黑客就可以在多个公链上任意解锁资产。 值得注意的是,PolyNetwork在一些链上的中继器没有执行此交易,因此这些链上的资产未受到影响。
细节分析:
一、黑客于北京时间2021年8月10日17:32:32对Ontology发起了一笔恶意交易。 二、此恶意交易调用了一个method"66313231333138303933",其对应的签名为0x41973cd9(与后面调用的putCurEpochConPubKeyBytes函数签名相同)。 这笔交易本应无效,但中继器OntologyRelayer却在未充分检查的情况下将其纳入PolyChain的Merkletree并签字,然后发布到PolyChain区块中。Merkletree用于证明交易的真实性。 产生的跨链交易链接如下:https://explorer.poly.network/tx/1a72a0cf65e4c08bb8aab2c20da0085d7aee3dc69369651e2e08eb798497cc80 三、此恶意交易利用了中继器OntologyRelayer的漏洞,这可能就是为什么黑客不得不冒险通过中心化交易所购买"ONG"(OntologyChain的Gas)的原因。 黑客部分声明的截图如下: 四、跨链交易在以太坊上调用了PolyNetwork合约的EthCrossChainManager.verifyHeaderAndExecuteTx函数,其中第一个参数包含了Merkle证明,解析如下: 五、该函数解析Merkle证明后发现其有效,并确认该恶意交易确实存在于已被签名的Merkletree中。 随后调用了EthCrossChainManager._executeCrossChainTx函数来执行该交易,即调用指向合约(0xcf2afe102057ba5c16f899271045a0a37fcb10f2)中的method(0x6631313231333138303933),并传入参数args(010000000000000014a87fb85a93ca072cd4e5f0d4f178bc831df8a00b)。由于该method的函数签名与步骤二中提到的method签名相同(均为0x41973cd9,可能是哈希碰撞),因此成功执行,并将keepers的公钥更改为黑客的公钥。以太坊上的交易链接如下:https://etherscan.io/tx/0xb1f70464bd95b774c6ce60fc706eb5f9e35cb5f06e6cfe7c17dcda46ffd59581 六、黑客更改公钥后,即可随意解锁资产。
事件总结:
此次攻击是由一系列交易构成的,其攻击根源分析如下: 1. 中继器OntologyRelayer会接收任意带有"makeFromOntProof"事件的交易。 2. 中继器OntologyRelayer在未充分检查的情况下,将恶意交易发布到PolyChain上。 3. 在步骤二中,该恶意交易被纳入PolyChain的Merkletree中,产生了有效的Merkle证明。 4. 以太坊上的ECCM合约只对步骤二产生的Merkle证明和原始数据进行了轻量级验证。值得注意的是,Merkle证明的全面验证应该在协议层面完成,而不是在智能合约层面。
本文来源:CertiK 文章作者:CertiK