攻擊簡述

黑客(地址: 0x489a8756c18c0b8b24ec2a2b9ff3d4d447f79bec)利用跨鏈橋消息驗證機制基礎庫代碼IVAL TREE中的漏洞,偽造提現惡意消息,最終導致跨鏈橋向黑客發送兩筆BNB ,每次都是100BNB ,價值約$600M美金。由於幣安及時的響應,只有價值約$100M美金的資產被轉移了出去。很顯然即使這樣,也是很嚴重的損失。相關tx地址:

https://bscscan.com/tx/0xebf83628ba893d35b496121fb8201666b8e09f3cbadf0e269162baa72efe3b8b

BSC Chain跨鏈橋被黑分析

圖1相關tx地址

漏洞利用原理分析

這次攻擊發生在BSC鏈上, BinanceBridge是給BSC來提供流動性,通過分析我們可以發現這次攻擊是由於BSC L1鏈上的一個IAVL tree(https://github.com/cosmos/iavl)的庫實現有漏洞,這個庫代碼原本是COMOS實現的, BSC chain直接使用了這個庫。

IVAL tree是用來校驗,驗證發送給幣安跨鏈橋消息的合法性的。

一般情況下, IAVL樹會拒絕黑客偽造的消息,然而,攻擊者在IAVL驗證過程中發現了了漏洞,這使他能夠欺騙IAVL樹接受任意消息。黑客通過精心構造消息,從而跨鏈橋中提取了2MBNB。

關於IAVL tree ,顧名思義,是一個avl tree ( named after inventors Adelson-Velsky and Landis )的實現,是自平衡的二叉搜索樹。這種數據結構的目的是為鍵值對(比如存儲賬戶餘額)提供持久存儲,以便可以計算確定性的默克爾根哈希。

黑客在跨鏈橋合約裡調用了handlePackage函數,再調用預編譯的合約用來驗證MerkleProof的合法性。

BSC Chain跨鏈橋被黑分析

圖2預編譯的校驗合約

何為預編譯?

預編譯在這裡類似操作系統的syscall的作用,當操作系統識別到syscallnum(num類似這裡的0x 65 )的時候,就會執行相應的系統調用,正常情況下合約地址是在合約部署的時候生成的,而這裡直接寫死了0 x65 ,當BSC L1發現這個地址的時候,就會直接去調用MerkleProof的過程,也就是去調用IVAL Tree的代碼。

一句話概括本次攻擊過程

黑客通過部署合約,調用BSC跨鏈橋合約的handlePackage函數

(https://bscscan.com/address/0x0000000000000000000000000000000000002000#code#L1082 )偽造proof數據,使得IVAL tree校驗成功,最終使得跨鏈橋向黑客轉移了2M BNB。

BSC Chain跨鏈橋被黑分析

圖3 handlePackage函數

最後

Samczsun已經對具體的漏洞細節進行了一些推測,但是目前尚不能完全確認所有細節正確,Numen 安全實驗室正在分析調查,至於更多攻擊細節,我們會陸續公佈