作者:BitsLab

BitsLab 旗下 TonBit 再次於 TON 虛擬機(TVM)深層代碼裏挖出一枚“隱形炸彈”——RUNVM 指令非原子狀態遷移漏洞。攻擊者可藉助子虛擬機耗盡 gas 的瞬間,污染父虛擬機的庫(libraries)並誘發後續調用失敗,最終導致依賴庫完整性的合約出現異常行爲。

下面我們保留技術細節原文,爲開發者呈現漏洞發現與驗證的完整過程,幫助社區深入理解該問題,並提高對類似風險的防範意識。

以下是漏洞詳述:

TVM 中的 RUNVM 指令可能污染調用者狀態並導致庫不可用。在 'RUNVM' 指令代碼中發現新的漏洞。該漏洞允許污染調用者的狀態。相關代碼片段如下:

上述代碼負責啓動子虛擬機。其功能是將當前VmState中的'log'和'libraries'移動到新的VmState對象'new_state'中,然後用'new_state'替換當前VmState。

問題在於該操作並非真正的原子操作。在執行'*this = std::move(new_state);'語句之前,虛擬機可能因gas耗盡而中止進程,導致'new_state'未能成功替換當前狀態。此時'libraries'可能已被移出,使得子虛擬機的庫處於被清除(移動)狀態。

由於RUNVM指令通過isolate_gas參數實現了子虛擬機與父虛擬機之間的gas消耗隔離,這會引發以下場景:

即使子虛擬機觸發gas耗盡異常,父虛擬機仍保留足夠的gas繼續執行。但由於失敗的狀態轉移過程中子虛擬機已經移動/清除了'libraries',導致後續依賴'libraries'的操作都將失敗。這種情況會使得某些假定庫完整性的合約出現預期之外的行爲。

漏洞驗證(PoC驗證)

我們通過以下測試用例成功復現了該漏洞:

關鍵測試修改說明:

爲了便於本地觀察庫狀態,我們修改了NOP指令以強制註冊一個庫條目:

復現步驟:

1)將此測試用例添加到 crypto/test/vm.cpp 文件中

2)運行 test-vm 可執行程序

3)觀察 XLOAD 指令執行時因空庫而拋出的異常

預期行爲:

NOP指令執行後:庫中包含1個條目

RUNVMX指令執行後:儘管父虛擬機繼續運行,但庫變爲空狀態

XLOAD指令執行失敗並拋出異常

這充分證明了非原子性狀態轉移與gas隔離機制共同作用時,會產生違反執行上下文完整性的不一致狀態。

本次發現再次體現了 BitsLab 旗下 TonBit 在 TON 生態安全研究中的深厚實力。我們已第一時間將技術細節與緩解方案提交給 TON 基金會,並協助其完成修復。建議所有開發者在官方補丁發佈後及時更新依賴庫;同時在自研合約中加入更嚴謹的庫完整性驗證與 gas 管理邏輯,以防止類似問題被惡意利用。BitsLab 將繼續秉持“負責任披露”原則,攜手社區共同築牢 Web3 安全防線。

關於BitsLab

BitsLab 是一家致力於守護和構建新興 Web3 生態系統的安全組織,願景是成爲備受行業和用戶尊敬的 Web3 安全機構。旗下擁有三個子品牌:MoveBit、ScaleBit 和 TonBit。

BitsLab 專注於新興生態系統的基礎設施開發與安全審計,覆蓋但不限於 Sui、Aptos、TON、Linea、BNB Chain、Soneium、Starknet、Movement、Monad、Internet Computer 和 Solana 等生態。同時,BitsLab 在審計多種編程語言方面展現了深厚的專業能力,包括 Circom、Halo2、Move、Cairo、Tact、FunC、Vyper 和 Solidity等。

BitsLab 團隊匯聚了多位頂級漏洞研究專家,他們曾多次榮獲國際 CTF 獎項,並在 TON、Aptos、Sui、Nervos、OKX 和 Cosmos 等知名項目中發現了關鍵漏洞。

關於 TonBit

TonBit 作爲 BitsLab 的核心子品牌,是 TON 生態系統內的安全專家和早期建設者。作爲 TON 區塊鏈的主要安全保障提供商,TonBit 專注於全面的安全審計,包括 Tact 和 FunC 語言的審計,確保基於 TON 的項目具備完整性和彈性。迄今爲止,TonBit 已成功審計了包括 Catizen、Algebra、UTonic 等多個知名項目,並發現了多個關鍵漏洞,展現了我們在區塊鏈安全領域的卓越能力。此外,TonBit 還成功舉辦了 TON CTF 比賽,吸引了衆多參與者並收穫了廣泛關注,進一步鞏固了其在 TON 生態中的安全專家地位。未來,TonBit 將繼續爲區塊鏈安全保駕護航,推動技術和生態的持續發展。