解讀黑客如何從 Solana Wormhole 中盜取 8萬 ETH

編輯: ADAC
2月2日,一名黑客設法通過 Solana-Ethereum bridge Wormhole,從 Solana 中竊取了 80,000 枚以太幣 (ETH)。黑客是如何做到的?

Solana 區塊鏈最嚴重的黑客攻擊之一

對 Solana 區塊鏈最嚴重的黑客攻擊之一於2月2日周三發生了,當時一名黑客設法將 80,000 ETH(在撰寫本文時市值超過 2.14 億美元),通過 Wormhole Bridge (一項提供在不同區塊鏈之間轉移資金能力的服務) 從 Solana 系統轉移到 ETH 區塊鏈中。

黑客通過單筆交易將 80,000 ETH 從以太坊上的 Wormhole 智能合約中轉移出來, “雖然這很戲劇化,但這筆交易只是一系列有趣事件的結束。我不得不開始逆向工作,以弄清楚這是怎麼可能的,” 化名 @smartcontracts 在 Twitter 中寫道。

Guardians 簽署了虛假轉讓

在這種情況下,Wormhole 是以太坊上所謂的橋樑,即智能合約,它提供了一種在不同區塊鏈之間移動加密資產的方法。根據智能合約,從高維度來看,Wormhole 有一組特別的 guardians(守護者),它們負責簽署區塊鏈之間的轉移。

而這次守護者以某種方式簽署了這筆 80,000 ETH 的轉賬,就好像它是 100% 合法的一樣。

提取 80,000 ETH 的交易實際上是攻擊者將 80,000 ETH 從 Solana 轉移到以太坊。我最初認為合約可能錯誤驗證了轉賬上的簽名,但簽名卻已完全簽出。

根據智能合約,第一個突破和部分解釋來自於 Solana 上的一筆交易,該交易不知何故鑄造了 120,000 個 Wormhole ETH,將 ETH 包裹在 Solana 上。由於黑客能在 Solana 上鑄造 Wormhole ETH,因此他能夠正確地將其撤回到以太坊。

“Solana 有點奇怪”

檢查黑客的交易歷史,有一筆交易是發生在 120,000 Wormhole ETH 鑄造之前的。在這筆交易中,黑客只鑄造了 0.1 個 Wormhole ETH,就好像黑客在用小額測試該功能一樣。

對黑客交易歷史的進一步檢查顯示,黑客確實從以太坊向 Solana 存入了 0.1 ETH。儘管攻擊者沒有在以太坊的 Wormhole 智能合約中存入 120,000 ETH,但這筆存款有一些有趣的地方。

正如 @smartcontract 在他的推文中解釋的那樣,在 Solana 上鑄造 Wormhole ETH 的交易觸發了一個名為 “complete_wrapped” 的 Wormhole 智能合約功能。此函數採用的參數之一是“傳輸消息”,基本上是由 bridge 的 guardians 簽名的消息,說明要鑄造哪個代幣以及鑄造多少。

“重要的是這些 “傳輸消息”合約是如何創建的,這產生了 0.1 ETH 傳輸消息的交易”, @smartcontract 在推文中寫道。

誰在檢查 “檢查者”?

這個“傳輸消息”合約是通過觸發一個名為 “post_vaa” 的函數創建的。最重要的是 post_vaa 通過檢查監護人的簽名來檢查消息是否有效。 @smartcontracts 說,這部分看起來很合理,但正是這個簽名檢查步驟破壞了一切。

“post_vaa” 函數實際上並不檢查簽名,相反,以典型的 Solana 方式,通過調用 “verify_signatures” 函數創建了另一個智能合約, “verify_signatures” 函數的輸入之一是 Solana 內置“系統”程序,其中包含合約可以使用的各種實用程序。

在“verify_signatures”中,Wormhole 程序嘗試檢查在觸發此函數之前發生的執行是否已執行 Secp256k1 簽名驗證函數。

“這個驗證功能是一個內置工具,應該驗證給定的簽名是否正確。所以簽名驗證已經外包給了這個程序。但這就是錯誤所在,” @smartcontract在推文說。

Wormhole 合約使用函數 load_instruction_at 來檢查是否首先調用了 Secp256k1 函數,但是 load_instruction_at 函數最近被棄用了,因為它不檢查它是否針對實際系統地址而執行。

遊戲結束

根據智能合約,調用者應該向正在執行的程序提供系統地址作為輸入,但黑客提供了不同的系統地址。 這是該系統地址被用作合法存款 0.1 ETH 的“verify_signatures”的輸入:

Correct system address input

圖片:正確的系統地址輸入

System address input

圖片:錯誤的系統地址輸入

“使用這個‘假’系統程序,攻擊者可以有效地謊報簽名檢查程序被執行的事實。根本沒有檢查簽名!”  @smartcontracts 續說:

“在那之後,遊戲就結束了。攻擊者讓 guardians 看起來像是在 Solana 上的 Wormhole 中籤署了 120K 的存款,即使他們沒有。黑客現在需要做的就是通過將其資金撤回以太坊來使其成為現實。然後一次提取 8萬 ETH + 1萬 ETH(ETH bridge 上的所有東西)。”

🌈一按加入ADAC Telegram社區🌈即時交流 Web3研究💬

你可能感興趣