“黑客拿著房主證明找物業拿鑰匙,證明是假的,卻從物業那裡拿到了真的鑰匙”
事件回顧
2021年8月10日,PolyNetwork遭受了跨鏈攻擊,被轉移了6億美金的加密資產(之後攻擊者開始陸續歸還被盜資產)。攻擊者在多條公鏈上進行了惡意交易,並通過中繼器(Poly-Relayer)組件完成了攻擊。
用上面物業的例子來解釋的話,黑客用假房主證明(Ontology chain上的invalid transaction),從物業(中繼器Poly-Relayer)那裡拿到了真的鑰匙(Poly-chain上經過簽名的Merkle證明)。
攻擊解析
一、 黑客在Ontology Chain上初始化了一個本應是無效的惡意交易。
二、中繼器Ontology-Relayer在沒有充分檢查的情況下將此交易納入了Poly Chain的Merkle tree並簽字,然後發佈到Poly Chain區塊中。這也可能是為什麼黑客不得不冒險通過中心化交易所購買”ONG”(Ontology Chain的Gas)的原因。
三、 黑客在以太坊上用步驟二的有效Merkle證明,調用Poly Network的ECCM合約,將keepers改成黑客控制的公鑰。
四、 獲得keepers權限後,黑客就可以在多條公鏈上任意解鎖資產了。
這裡值得注意的是,Poly Network在有些鏈上的中繼器沒有通過此交易,所以其鏈上資產未受影響。
細節分析
一、黑客於北京時間2021年8月10日17:32:32對Ontology發起了一筆惡意交易。
https://explorer.ont.io/tx/F771BA610625D5A37B67D30BF2F8829703540C86AD76542802567CAAFFFF280C#
我們對交易進行了解碼,得到了以下參數映射。
二、此惡意交易調用了一個method “66313231333138303933”,其對應的簽名等於0x41973cd9(與之後調到的putCurEpochConPubKeyBytes函數簽名相同)。
這筆交易應該是無效調用, 可是中繼器Ontology Relayer卻在未充分檢查的情況下將此交易納入了Poly Chain的Merkle tree並簽字,然後發佈到Poly Chain區塊中。 Merkle tree是用來證明交易是否真實存在的。
其產生的跨鏈交易如下:https://explorer.poly.network/tx/1a72a0cf65e4c08bb8aab2c20da0085d7aee3dc69369651e2e08eb798497cc80
三、此惡意交易利用了中繼器Ontology Relayer的漏洞,這可能就是為什麼黑客不得不冒險通過中心化交易所購買”ONG”(Ontology Chain的Gas)的原因。
黑客部分聲明的截圖如下:
四、跨鏈交易在以太坊上調用了Poly Network合約的EthCrossChainManager.verifyHeaderAndExecuteTx(),第一個參數包含了Merkle證明,解析如下:
五、這個函數解析了Merkle證明,發現證明是有效的,此惡意交易確實存在於已被簽名的Merkle tree中。
之後調用了EthCrossChainManager._executeCrossChainTx()函數去執行此交易,即調用toContract指向合約(0xcf2afe102057ba5c16f899271045a0a37fcb10f2)中的method (0x6631313231333138303933),傳入參數args (010000000000000014a87fb85a93ca072cd4e5f0d4f178bc831df8a00b)。而這個method指向putCurEpochConPubKeyBytes(bytes),因為其函數簽名與步驟二中提到的method簽名相同(均為0x41973cd9,此處為哈希碰撞),所以被順利執行,將keepers的公鑰改成了黑客的公鑰。以太坊上的交易如下:https://etherscan.io/tx/0xb1f70464bd95b774c6ce60fc706eb5f9e35cb5f06e6cfe7c17dcda46ffd59581
六、黑客改變公鑰後,即可隨意解鎖資產。
事件總結
此次攻擊是由一連串交易構成的,其攻擊根源分析如下:
1. 中繼器Ontology Relayer會接收任意含有”makeFromOntProof” 事件的交易。
2. 中繼器Ontology Relayer在未充分檢查的情況下,將惡意交易發佈到Poly Chain上。
3. 在步驟二中,此惡意交易被納入到Poly Chain的Merkle tree上,產生了有效的Merkle證明。
4. 以太坊上的ECCM合約只對步驟二產生的Merkle證明和原始數據進行了輕量級驗證。不過值得注意的是,Merkle證明的全面驗證應該在協議層面完成,而不是在智能合約層面。