深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡?

2022年10月08日17:51:28 科技 1248

事件背景

北京時間2022年10月7日凌晨,BNB Chian跨鏈橋BSC Token Hub遭遇攻擊。黑客利用跨鏈橋漏洞分兩次共獲取200萬枚BNB,價值約5.66億美元。

漏洞分析

BSCTokenHub是BNB信標鏈(BEP2)和BNB鏈(BEP20 或 BSC)之間的跨鏈橋。BNB鏈使用預編譯合約0x65驗證BNB信標鏈提交的IAVL的Proof,但BNB鏈對提交的Proof邊界情況處理不足,它僅考慮了Proof只有一個Leaf的場景,對多個Leaves的處理邏輯不夠嚴謹。黑客構造了一個包含多Leaves的Proof數據,繞過BNBChain上的校驗,從而在BNB鏈造成了BNB增發。

以其中一次攻擊交易為例:0xebf83628ba893d35b496121fb8201666b8e09f3cbadf0e269162baa72efe3b8b

黑客構造輸入數據payload和proof,輸入參數通過validateMerkleProof校驗,返回值為true。

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

在後續IApplication(handlerContract).handleSynPackage處理中,合約給黑客增發100萬個BNB。

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

函數調用過程

交易首先調用CrossChain合約0x2000的handlePackage函數:

handlePackage會進一步調用MerkleProof.ValidateMerkleProof對輸入的proof進行校驗:

MerkleProof相關代碼可以看到,實際的驗證邏輯是使用預編譯合約0x65完成:https://github.com/bnb-chain/bsc-genesis-contract/blob/master/contracts/MerkleProof.sol#L66

系統預編譯合約0x65對應iavlMerkleProofValidate功能:https://github.com/bnb-chain/bsc/blob/f3fd0f8bffb3b57a5a5d3f3699617e6afb757b33/core/vm/contracts.go#L81

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

系統合約0x65實現代碼如下,主要邏輯為使用DecodeKeyValueMerkleProof解碼輸入參數,並調用Validate進行校驗:

https://github.com/bnb-chain/bsc/blob/master/core/vm/contracts_lightclient.go#L106

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

其中kvmp.Validate()實現代碼如下:https://github.com/bnb-chain/bsc/blob/master/core/vm/lightclient/types.go#L220-L234

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

DefaultProofRuntime構造函數使用IAVL庫進行Proof的驗證:

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

IAVL代碼問題

IAVL的Proof校驗過程中,Hash計算存在漏洞,導致黑客可以在Proof添加數據,但計算Hash時並沒有用到添加的數據。詳細分析如下:

在len(pin.Left)不為0的分支中,計算Hash並沒有使用pin.Right數據。黑客利用該處漏洞構造數據,添加proof.LeftPath[1].Right數據,但是該數據並不參與Hash計算。https://github.com/cosmos/iavl/blob/master/proof.go#L79-L93

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

根據上述分析,正常數據組織結構如下,proof.LeftPath[1].Right為空值,計算得到正確的Hash。

  • proof.LeftPath = len(2)
  • proof.LeftPath[0]是一個正常數據,proof.LeftPath[1].Left是一個正常數據,proof.LeftPath[1].Right空值
  • proof.InnerNodes = len(0)
  • proof.Leaves = len(1),proof.Leaves[0]是一個正常數據

黑客構造攻擊數據結構如下,添加proof.LeftPath[1].Right數據,且該數據不參與Hash計算。

  • proof.LeftPath = len(2)
  • proof.LeftPath[0]是一個正常數據,proof.LeftPath[1].Left是一個正常數據,proof.LeftPath[1].Right是一個偽造數據
  • proof.InnerNodes = len(1), InnerNodes[0]=nil
  • proof.Leaves = len(2),proof.Leaves[0]是一個正常數據,proof.Leaves[1]是一個偽造數據
  • 且proof.LeftPath[1].Right = COMPUTEHASH(proof.Leaves[1])

IAVL的Proof校驗代碼如下,主體邏輯為COMPUTEHASH遞歸調用。由於lpath.Right也為黑客輸入數據,使得黑客構造的數據能夠通過bytes.Equal(derivedRoot, lpath.Right)的校驗,並返回上一輪COMPUTEHASH通過proof.Leaves[0]計算的結果,該結果為正常數值,從而繞過了IAVL的Proof校驗。

https://github.com/cosmos/iavl/blob/master/proof_range.go#L222-L309

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

黑客攻擊構造的數據中,包括了IAVL:V和multistore相關數據,multistore數據也是基於IAVL進行操作,原理是一樣的,不再進行詳細分析。

這次IAVL Proof暴露的問題在於,數據局部的變化無法反應到整體,使得校驗發生錯誤。在Cosmos生態中,IBC使用 ICS23來做數據的校驗處理,ICS23與IAVL Proof校驗不同點在於,ICS23會對所有的「葉子節點」的值進行數據校驗,最後計算得出的根Hash再與鏈上數據進行校驗,OKC採用的是ICS23的Prove,因此不存在BNBChain這次遇到的安全漏洞。

測試驗證代碼

利用黑客攻擊交易數據,基於BNBChain單元測試代碼,增加了基於黑客攻擊交易的測試用例,可以完整復現黑客的攻擊交易。單元測試代碼利用iavlMerkleProofValidate.Run介面驗證輸入數據,即相當於調用預編譯合約。https://github.com/BananaLF/bsc/blob/bsc-hack/core/vm/contracts_lightclient_test.go#L99-L100

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

利用黑客攻擊交易數據,構造新的payload數據為value := []byte(「okc test hack」),並對proof相應數據進行了修改,即修改proof.LeftPath[1].Right和proof.Leaves[1]對應的數據,新構造的數據可以通過okcIavlMerkleProofValidate校驗,即修改了黑客數據也能通過校驗。另外,如下單元測試代碼對原始黑客數據和修改後的數據兩種case都進行了校驗,且校驗都能成功,從而說明如下測試代碼利用本文所述漏洞成功進行了復現。https://github.com/BananaLF/bsc/commit/697c5cd73a755a7c93c0ed6c57d069e17f807958

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

深扒BSC攻擊始末,憑空增發200萬BNB的「奧秘」在哪裡? - 天天要聞

事件過程

1)北京時間2022年10月6日7點27分黑客使用ChangeNOW服務轉入了100多個BNB到BSC鏈上,作為起始攻擊資金:0xa84f85e1afc3e1b8ed5111ba16e11325f8fc5d6081cb6958becd6a333f6d0d1d

2)北京時間2022年10月7日0點55分黑客調用系統RelayerHub合約 0x1006 進行註冊,成為relayer:0xe1fe5fef26e93e6389910545099303e4fee774427d9e628d2aab80f1b53396d6

3)黑客使用Bsc跨鏈橋的漏洞執行了兩次,總共從裡面盜取了200萬個BNB:

北京時間2022年10月7日2點26分:https://www.oklink.com/zh-cn/bsc/tx/0xebf83628ba893d35b496121fb8201666b8e09f3cbadf0e269162baa72efe3b8b

北京時間2022年10月7日4點43分:https://www.oklink.com/zh-cn/bsc/tx/0x05356fd06ce56a9ec5b4eaf9c075abd740cae4c21eab1676440ab5cd2fe5c57a

4)黑客使用Venus的借貸服務,抵押了90萬個BNB,從裡面借走了5000 萬 USDT、6250萬 BUSD和3500萬USDC。

5)黑客使用Stargate跨鏈橋,將資產轉移到ETH,AVAX,FTM等網路上,總計轉出資產約為9000萬美金。

6)北京時間2022年10月7日6點19分,幣安暫停BNBChain鏈。

目前,OKLink 多鏈瀏覽器已標記 BNB Chain 被盜案黑客地址(0x489A 開頭),關於此次被盜後續,歐科雲鏈鏈上衛士團隊將進一步追蹤案件細節並及時同步。

科技分類資訊推薦

特斯拉中國宣布:漲價 - 天天要聞

特斯拉中國宣布:漲價

(文/觀察者網周盛明 編輯/高莘)2025年7月1日,特斯拉中國宣布,Model 3長續航全輪驅動版車型售價上漲1萬元,至28.55萬元。 特斯拉中國 在漲價的同時,該車型的續航和加速得到了提升——CLTC續航由713km提升至753km,百公里加速時間由4.4秒提升至3.8秒。值得注意的是,特斯拉Model 3的其他兩個版本售價不變。Model 3後輪驅.
儲能與鋰電領域動態頻出:巨頭競逐、項目簽約與跨界調整並行 - 天天要聞

儲能與鋰電領域動態頻出:巨頭競逐、項目簽約與跨界調整並行

【環球網財經綜合報道】近期,儲能與鋰電領域動態不斷。陽光電源(300274.SZ)與寧德時代(300750.SZ)圍繞第三代儲能電芯定義權展開激烈爭奪。6月,陽光電源發布搭載684Ah電芯的新款儲能系統,電芯由欣旺達供應;寧德時代宣布587Ah電芯於4月投產。當前儲能行業處於二代向三代電芯過渡期,二代容量為314Ah,兩大陣營分化明...
亞馬遜CEO:生成式AI或致員工數量減少,但也將帶來新機遇 - 天天要聞

亞馬遜CEO:生成式AI或致員工數量減少,但也將帶來新機遇

【環球網財經綜合報道】亞馬遜CEO安迪·賈西周一表示,生成式人工智慧的快速推出,意味著公司未來或需更少員工完成計算機可處理的工作,如同每次技術轉型,一些工作將因自動化而用人減少,但也會有新工作產生。東方IC儘管人工智慧會消除部分職位需求,賈西稱亞馬遜仍會在人工智慧、機器人等領域招聘更多員工。不過,本月早...
25萬起售的小米YU7,三分鐘大定20萬台,數據是真的嗎? - 天天要聞

25萬起售的小米YU7,三分鐘大定20萬台,數據是真的嗎?

相信這幾天小米YU7的火爆程度大家都看到了,這款車發布後開啟預定,打開預定通道後不久,小米官方就公布了一個數據,3分鐘大定超20萬台。沒過多久,小米官方又公布了一個更炸裂的數據,小米YU7在1小時內,大定已突破289000萬台。
鄒暉出任格力集團董事長 - 天天要聞

鄒暉出任格力集團董事長

本文來源:時代財經 珠海格力集團官網更新信息顯示,鄒暉已正式出任該集團黨委書記、董事長。公開資料顯示,鄒暉於1982年生,本科學歷。鄒暉曾擔任珠海市人大常委會農村農業工作委員會副主任,後轉任珠海市國資委副主任。此次調整後,格力集團領導班子為:鄒暉擔任集團黨委書記、董事長,王軼任黨委副書記、董事、總裁,吳...
【產業互聯網周報】阿里合伙人名單最新變動:9人已退出;美團在AI投入超百億元;黃仁勛:機器人技術是晶元製造商繼AI之後的最大機遇 - 天天要聞

【產業互聯網周報】阿里合伙人名單最新變動:9人已退出;美團在AI投入超百億元;黃仁勛:機器人技術是晶元製造商繼AI之後的最大機遇

圖片系AI生成【產業互聯網周報是由鈦媒體TMTpost發布的特色產品,將整合本周最重要的企業級服務、雲計算、大數據領域的前沿趨勢、重磅政策及行研報告。】國內資訊北京經信局:北京累計備案上線大模型132款,全國佔比35%在2025全球數字經濟大會新聞發布會上,北京市經濟和信息化局黨組成員、副局長、新聞發言人劉維亮表示,...