Paradigm 研究員 samczsun 在社交媒體上發文表示,鏈上數據及相關程式碼顯示,BSC 跨鏈橋的驗證方式存在BUG,該BUG 可能允許攻擊者偽造任意消息,本文為 samczsun 的駭客技術細解。
(前情提要:BNB Chain後續》將發起「凍結駭客贓款」鏈上投票;幣安燒毀超1億BUSD)
(背景補充:更新》BNB Chain 於13:31 恢復出塊,發布節點更新:封鎖駭客地址、暫停原生跨鏈 )
今天上午, BNB Chian 跨鏈橋BSC Token Hub 遭遇攻擊。駭客利用跨鏈橋漏洞分兩次共獲取200 萬枚BNB,價值約5.66 億美元。(注:BSC Token Hub 是BNB 信標鏈(BEP2)和BNB 鏈(BEP20 或BSC)之間的跨鏈橋。)
消息一出,BNB 價格在2 小時內一度下跌近5%,跌至278.7 美元低點,現報價284 美元,24 小時跌幅4.24%。
根據BNB Chain 的說法,從BSC 提取的資金的初步估計在1 億美元至1.1 億美元之間。並且,Tether 也在第一時間將駭客地址列入黑名單。「感謝社群和我們的內部和外部安全合作夥伴,估計700 萬美元已經被凍結。」
Binance 創辦人CZ 在社交媒體上發文表示,目前幣安已要求所有驗證者暫停BSC 網路,用戶的資金是安全的,對於給用戶帶來的不便深表歉意,並將相應地提供進一步的更新。
針對具體的攻擊方式, Paradigm 研究員 samczsun 在社交媒體上發文表示,鏈上數據及相關程式碼顯示,BSC 跨鏈橋的驗證方式存在BUG,該BUG 可能允許攻擊者偽造任意消息;本次攻擊中,攻擊者偽造資訊通過了BSC 跨鏈橋的驗證,使跨鏈橋向攻擊者地址發送了200 萬枚BNB。
samczsun 分析文章如下:
攻擊者從Binance Bridge 竊取了200 萬BNB(約5.66 億美元)。此後我一直在與多方密切合作致力於揭示這一切如何發生的。
事情的起因是@zachxbt 突然把攻擊者的地址發給了我。當我點擊進去的時候,我看到了一個價值數億美元的帳戶;要麼是有項目rug 跑路,要麼就是正在進行大規模的駭客攻擊。
一開始,我以為@VenusProtocol 又被黑了。然而,很快我就確定了攻擊者「真的」向Venus 存入了超過2 億美元。這時我就需要弄清楚這些資金的來源。
答案是,攻擊者以某種方式說服了幣安跨鏈橋,直接給他們(駭客)發送了1,000,000 BNB,而且是兩次。
要嘛幣安推出Web3 有史以來最大的「禮包」,要嘛攻擊者發現了一個嚴重的漏洞。我首先將攻擊者的交易與合法提款進行比較。我注意到的第一件事是攻擊者使用的高度始終相同——110217401,而合法提款使用的高度要大得多,例如270822321。
我還注意到攻擊者的證明明顯短於合法提款的證明。這兩個事實使我確信,攻擊者已經找到了一種方法來偽造該特定區塊(110217401)的證明。現在,我必須弄清楚這些證明是如何工作的。
在Binance 上,有一個特殊的預編譯合約用於驗證IAVL 樹。如果您對IAVL 樹一無所知,也不要擔心,因為有95% 的內容我都不懂。幸運的是,你和我所需要的只是剩下的5%。
基本上,當你驗證一個IAVL 樹時,你指定了一個「操作」列表。幣安跨鏈橋通常需要兩個操作:「iavl:v」操作和「multistore」操作。以下是它們的實現(implementation):https://github.com/bnb-chain/bsc/blob/46d185b4cfed54436f526b24c47b15ed58a5e1bb/core/vm/lightclient/multistoreproof.go#L106-L125
為了偽造證明,我們需要兩個操作都成功,並且我們需要最後一個操作(multistore))返回一個固定值(指定塊的hash值:110217401)。
通過查看implementation,我們可以發現,操縱根hash是不可能的,或者至少非常困難。這意味著我們需要我們的輸入值等於其中一個提交id。
「multistore」操作的輸入值是「iavl:v」操作的輸出值。這意味著我們想以某種方式控制這裡的根變量,同時仍然通過值驗證。
Paradigm研究員:3分鐘了解5億美元BNB失竊的全過程(12)那麼如何計算根hash?它發生在一個名為COMPUTEHASH 的函數中。在非常高的層次上,它遞歸地遍歷每條路徑和葉節點並進行大量的hash運算。
實際上實現細節並不重要,重要的是,由於hash函數的工作方式,我們基本上可以肯定地說,任何(path, nleaf)對都會產生唯一的hash。如果我們想偽造證據,這些就得保持不變。
查看證明在合法交易中的佈局方式,我們看到它的路徑很長,沒有內部節點,只有一個葉節點,這個葉節點包含我們惡意載荷的hash值!如果我們不能修改這個葉節點,那麼我們需要添加一個新的葉節點。
當然,如果我們添加一個新的葉節點,我們還需要添加一個新的內部節點來匹配。
現在我們只需要面對最後一個障礙。我們如何真正讓COMPUTEHASH 返回我們想要的根hash?好吧,請注意,最終我們將需要一個包含非零右hash的路徑。當我們找到一個匹配時,我們斷言它與中間根hash匹配。
讓我們稍微檢測一下程式碼,這樣我們就可以弄清楚我們需要什麼hash,然後剩下的就是把它們放在一起,我們將採用合法證明並對其進行修改,以便:
- 我們為偽造的有效負載添加一個新葉節點;
- 我們添加一個空白內部節點以滿足證明者;
- 我們調整我們的葉節點以使用正確的根hash提前退出
https://gist.github.com/samczsun/8635f49fac0ec66a5a61080835cae3db
值得注意的是,這不是攻擊者使用的確切方法。他們的證明路徑要短得多,我不確定他們究竟是如何生成的。但是,漏洞利用的其餘部分是相同的,我相信展示瞭如何從頭開始構建它是有價值的。
總之,幣安跨鏈橋驗證證明的方式存在一個錯誤,該錯誤可能允許攻擊者偽造任意消息。幸運的是,這裡的攻擊者只偽造了兩條消息,但損害可能要嚴重得多。
📍相關報導📍
BNBChain 遭駭捲走帳上 5 億美金:時間軸梳理與原因解析