BitsLab 旗下 TonBit 發現 TON VM 核心漏洞:漏洞根本原因以及緩解措施詳細闡述

本報告詳細分析了 TON 虛擬機中存在的核心 DoS 漏洞的技術細節、根本原因及其可能的攻擊方式,同時展示了 TonBit 團隊提出的高效解決方案。

近期,TON 網絡的虛擬機系統迎來了一次重大安全升級。BitsLab 旗下的安全團隊 TonBit 成功發現並協助修復了一個可能導致 TON 虛擬機資源耗盡的核心漏洞。這一漏洞利用虛擬機在處理 Continuation 嵌套時的遞歸機制,可能被惡意合約濫用,造成系統崩潰和網絡不穩定。

如果該漏洞被惡意利用,不需要消耗一個 TON,就可能讓所有驗證節點宕機,直接威脅網絡的可用性。在此次事件中,TonBit 憑藉其出色的技術能力快速定位漏洞,並通過調整虛擬機的內部控制流機制,提出了以迭代替代遞歸的創新解決方案,成功為 TON 用戶打造了一個更加安全的生態環境。TON 官方團隊在其最新的更新公告中特別緻謝 TonBit 對生態安全的卓越貢獻。

在以下這份詳細的安全報告中,我們將深入剖析此次漏洞的成因、技術細節及解決方案。報告詳細描述了漏洞如何利用 Continuation 的深度嵌套構建觸發資源耗盡攻擊的遞歸鏈條,以及惡意合約如何通過擴展調用棧來耗盡主機的棧空間。同時,我們還將介紹 TonBit 團隊如何通過消除遞歸鏈條的設計缺陷,改用協作迭代機制,協助徹底解決這一問題。此次修復不僅顯著提升了 TON 網絡的穩定性,還為區塊鏈行業的底層安全提供了重要參考。

案例研究:TON VM中的DoS漏洞及相關緩解措施

簡介

本報告描述了TON虛擬機中的一個 DoS(拒絕服務)漏洞以及解決該問題的緩解措施。該漏洞是由於虛擬機在合約執行過程中處理Continuation嵌套的方式引起的。該漏洞允許惡意合約通過創建Continuation,並以特定方式進行深度嵌套,從而在評估過程中觸發深層遞歸,耗盡主機的棧空間並使虛擬機停止運行。為了緩解該問題,虛擬機對Continuation和控制流的處理進行了修改。現在,虛擬機不再通過Continuation鏈進行順序尾調用,而是主動迭代鏈條。這種方法確保了只使用恆定的主機棧空間,防止棧溢出。

概要

根據官方文檔,TON VM是一個基於棧的虛擬機,採用Continuation-Passing Style(CPS,Continuation傳遞風格)作為其控制流機制,用於內部流程和智能合約。控制流寄存器對合約是可訪問的,從而提供了靈活性。

TVM中的Continuation理論上可以分為三類:

OrdCont(即vmc_std),包含需要執行的TON ASM片段,是TVM中的一級對象。合約可以在運行時顯式創建它們並傳遞,以實現任意的控制流。

非普通Continuation(Extraordinary continuations),通常包含OrdCont作為組件,通過顯式迭代原語和特殊隱式操作創建,用於處理相應的控制流機制。

額外的ArgContExt,封裝其他Continuation以保存控制數據。

在合約執行過程中,虛擬機進入主循環,每次解碼合約片段的一個字,並將相應的操作分派到合適的處理程序。普通處理程序在執行相應操作後立即返回。

相對而言,迭代指令會使用提供的Continuation作為組件創建一個非普通Continuation,並在適當的上下文中跳轉到非普通Continuation。非普通Continuation本身在跳轉時實現邏輯,並根據條件跳轉到某個組件。例如,使用WHILE指令時,我們可以在圖1中演示這一過程(省略了可能的跳出)。

圖1:非普通Continuation邏輯

根本原因

在存在漏洞的虛擬機版本中,這些跳轉會導致連續的動態尾調用,這要求主機棧為每次跳轉維護一個棧幀(如圖2所示)。

以WhileCont為例,其他部分為簡潔起見省略。

圖2:三重跳轉遞歸以深入嵌套

理想情況下,這不會構成問題,因為組件通常表示為OrdCont,其跳轉只會保存當前上下文,然後指示虛擬機執行它所持有的片段,先於剩餘的合約片段執行,並不會引入更多遞歸。然而,非普通Continuation在理論上設計允許其組件通過TVM中的cc(c0)寄存器(即上文的set_c0分支)訪問。因此,合約可以濫用此功能來執行深度遞歸(稍後描述)。相比於更改此常規功能的實現,直接在非普通Continuation的跳轉過程中消除遞歸更為清晰且容易。

通過反覆使用已獲得的非普通Continuation來構建上一級的非普通Continuation,可以通過迭代創建一個深度嵌套的Continuation。這些深度嵌套的Continuation在評估時,可能會耗盡主機的可用棧空間,導致操作系統發出SIGSEGV信號並終止虛擬機進程。

圖3提供了嵌套過程的概念驗證(PoC)。

圖3:嵌套過程

我們看到每次迭代中,主體都擴展了一個WhileCont{chkcond=true}。通過執行上一次迭代中生成並保存的cc,會得到一個類似這樣的調用棧:

可以看出,棧空間與嵌套級別(即迭代次數)呈線性依賴關係,這表明可能會導致棧空間耗盡。

關於在實際環境中的利用

在實際的區塊鏈中,燃料費限制使得惡意合約的構建相當困難。由於嵌套過程的線性複雜性(TVM設計有效地防止了通過自引用進行更廉價的構建),開發出實際可行的惡意合約並非易事。具體來說,一層嵌套會生成一個調用序列,在調試二進制文件中消耗三個主機棧幀(320字節),而在發佈二進制文件中消耗兩個(256字節,後兩個調用內聯為一個)。對於運行在現代POSIX操作系統上的驗證節點,默認棧大小為8MiB,這足以支持發佈二進制文件中超過30,000層的嵌套。儘管仍然可以構建一個能夠耗盡棧空間的合約,但這比上一節的示例要困難得多。

緩解措施

該補丁修改了在Continuation嵌套情況下跳轉的行為。我們可以看到Continuation跳轉的簽名發生了變化。

以 UntilCont為例,其他部分為簡潔起見省略。

不再調用 VmState::jump來跳轉到下一個Continuation,這意味著在每個Continuation上遞歸執行三重跳轉並等待返回值向後傳播。現在,Continuation跳轉僅解析Continuation的下一級,然後將控制權交還給虛擬機。

虛擬機通過協作的方式迭代解析每一層級的 continuation,直到遇到一個 NullRef,表明鏈的解析已完成(如在 OrdCont或 ExuQuitCont中實現)。在這一迭代過程中,主機棧上始終只分配一個 continuation 跳轉,從而保證棧的使用保持恆定。

結論

對於需要高可用性的服務,遞歸的使用可能成為潛在的攻擊向量。在涉及用戶定義的邏輯時,強制遞歸終止可能具有挑戰性。此DoS漏洞展示了在資源受限情況下(或其他限制條件下)正常功能被意外濫用的極端案例。如果遞歸依賴於用戶輸入,類似問題可能會發生,這在虛擬機的控制流原語中十分常見。

本報告詳細分析了 TON 虛擬機中存在的核心 DoS 漏洞的技術細節、根本原因及其可能的攻擊方式,同時展示了 TonBit 團隊提出的高效解決方案。通過將虛擬機的遞歸跳轉機制調整為迭代處理,TonBit 成功提出了修復漏洞的解決方案,協助修復了這一可能導致網絡癱瘓的核心漏洞,為 TON 生態提供了更加穩健的安全保障。本次事件不僅體現了 TonBit 在區塊鏈底層技術安全領域的深厚積累,也展現了其作為 TON 官方 Security Assurance Provider (SAP)的重要角色。

作為 TON 生態不可或缺的安全合作伙伴,TonBit 始終在保護區塊鏈網絡穩定性和用戶資產安全方面走在行業前沿。從漏洞發現到解決方案設計,TonBit 憑藉其強大的技術能力和對區塊鏈發展的深刻理解,為 TON 網絡的長期發展奠定了堅實基礎。同時,TonBit 團隊也在網絡安全架構、用戶數據保護以及區塊鏈應用場景的安全性提升等領域持續發力。未來,TonBit 將繼續以創新驅動安全技術進步,為 TON 生態以及整個區塊鏈行業的健康發展提供源源不斷的支持和保障。這次漏洞發現以及協助修復工作獲得了 TON 官方的高度認可,進一步鞏固了 TonBit 在區塊鏈安全領域的行業地位,也展現了其對推動去中心化生態發展的堅定承諾。

TonBit 官網:

TonBit 官方Twitter:

Telegram:

Linkedin:

Blog: #blogs

Telegram 審計需求聯繫:@starchou

查看原文
本頁面內容僅供參考,非招攬或要約,也不提供投資、稅務或法律諮詢。詳見聲明了解更多風險披露。
  • 讚賞
  • 留言
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate.io APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)