作者:秦曉峰原文: 《解析:約5.66億美元BNB被盜全過程》
北京時間今天上午, 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))返回一個固定值(指定塊的哈希值:110217401)。
通過查看implementation,我們可以發現,操縱根哈希是不可能的,或者至少非常困難。這意味著我們需要我們的輸入值等於其中一個提交id。
“multistore”操作的輸入值是“iavl:v”操作的輸出值。這意味著我們想以某種方式控制這裡的根變量,同時仍然通過值驗證。
(12)那麼如何計算根哈希?它發生在一個名為COMPUTEHASH 的函數中。在非常高的層次上,它遞歸地遍歷每條路徑和葉節點並進行大量的哈希運算。
https://github.com/cosmos/iavl/blob/de0740903a67b624d887f9055d4c60175dcfa758/proof_range.go#L237-L290
實際上實現細節並不重要,重要的是,由於哈希函數的工作方式,我們基本上可以肯定地說,任何(path, nleaf)對都會產生唯一的哈希。如果我們想偽造證據,這些就得保持不變。
查看證明在合法交易中的佈局方式,我們看到它的路徑很長,沒有內部節點,只有一個葉節點,這個葉節點包含我們惡意載荷的哈希值!如果我們不能修改這個葉節點,那麼我們需要添加一個新的葉節點。
當然,如果我們添加一個新的葉節點,我們還需要添加一個新的內部節點來匹配。
現在我們只需要面對最後一個障礙。我們如何真正讓COMPUTEHASH 返回我們想要的根哈希?好吧,請注意,最終我們將需要一個包含非零右哈希的路徑。當我們找到一個匹配時,我們斷言它與中間根哈希匹配。
讓我們稍微檢測一下代碼,這樣我們就可以弄清楚我們需要什麼哈希,然後剩下的就是把它們放在一起,我們將採用合法證明並對其進行修改,以便:
1)我們為偽造的有效負載添加一個新葉節點;
2)我們添加一個空白內部節點以滿足證明者;
3)我們調整我們的葉節點以使用正確的根哈希提前退出
https://gist.github.com/samczsun/8635f49fac0ec66a5a61080835cae3db…
值得注意的是,這不是攻擊者使用的確切方法。他們的證明路徑要短得多,我不確定他們究竟是如何生成的。但是,漏洞利用的其餘部分是相同的,我相信展示瞭如何從頭開始構建它是有價值的。
總之,幣安跨鏈橋驗證證明的方式存在一個錯誤,該錯誤可能允許攻擊者偽造任意消息。幸運的是,這裡的攻擊者只偽造了兩條消息,但損害可能要嚴重得多。