- RUNVM指令漏洞導致子虛擬機器耗盡gas時造成庫損壞,使父虛擬機器的庫處於清除狀態,儘管繼續執行。
- TonBit透過概念驗證測試展示了漏洞,顯示RUNVM執行後由於庫被清空,XLOAD操作失敗。
- 作為TON的主要安全保證提供商,TonBit遵循負責任的披露實踐,並已向TON基金會提交了緩解計劃。
TonBit安全研究人員發現了TON虛擬機器RUNVM指令中的關鍵非原子狀態轉換漏洞,當子虛擬機器耗盡gas時會破壞庫完整性,可能導致依賴系統的合約失敗。
**合作社論內容,由TonBit提供。所表達的觀點不代表CoinRank。非財務建議。
TonBit在BitsLab旗下,再次在TON虛擬機器(TVM)程式碼中發現了一個"定時炸彈"——RUNVM指令中的非原子狀態轉換漏洞。攻擊者可以在子虛擬機器耗盡gas的瞬間破壞父虛擬機器的庫,並引發後續呼叫失敗,最終導致依賴庫完整性的合約異常執行。下文保留了原始技術細節,以展示完整的發現和驗證過程,幫助開發者深入瞭解問題並提高對類似風險的認識。
以下是漏洞的詳細描述:
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"的後續操作將失敗,因為子虛擬機器已在失敗的狀態轉換期間移動/清除了庫。這導致某些假設庫完整性的合約出現意外行為。
概念驗證:
我們實施了以下測試用例來證明這一漏洞:
測試的關鍵修改:
為了便於本地觀察庫狀態,我們修改了NOP指令以強制註冊庫條目:
重現步驟:
將此測試用例新增到crypto/test/vm.cpp
執行test-vm可執行檔案
觀察XLOAD執行期間由於庫為空的異常。
預期行為:
NOP執行後:庫包含1個條目
RUNVMX執行後,儘管父虛擬機器繼續,但庫變為空
XLOAD失敗並出現異常
這證明了非原子狀態轉換與gas隔離相結合,創造了違反執行上下文完整性的不一致狀態。
這一發現再次突顯了TonBit(BitsLab的子公司)在TON生態系統安全研究方面的深厚專業知識。我們已立即向TON基金會提交技術細節和緩解方案,並協助完成修復。我們建議所有開發者在官方補丁釋出後立即更新其依賴庫;同時,在自定義合約中加入更嚴格的庫完整性檢查和gas管理邏輯,以防止類似問題被惡意利用。BitsLab將繼續堅持"負責任披露"原則,並與社群一起加強Web3安全防線。
關於TONBIT
TonBit是BitsLab的核心子品牌,是TON生態系統中值得信賴的安全專家和早期建設者。作為TON區塊鏈的主要安全保證提供商(SAP),TonBit專門進行全面的安全審計,包括Tact和FunC語言審計,確保TON上構建的專案的完整性和彈性。經TON官方認可,TonBit已成功審計了眾多知名專案,如Catizen、Algebra、UTonic、Ton Batch Sender、TonUp、PixelSwap、Tradoor、Miniton、Thunder Finance等近20個TON專案,展示了其在保護基於TON的解決方案方面的專業expertise。
〈BitsLab的TonBit再次發現TON虛擬機器漏洞:RUNVM指令可能汙染智慧合約執行環境〉這篇文章最早釋出於《CoinRank》。











