Move語言引用安全驗證中發現新整數溢出漏洞

robot
摘要生成中

Move語言引用安全機制中發現新的整數溢出漏洞

近期,在對Move語言進行深入研究時,我們發現了一個新的整數溢出漏洞。這個漏洞出現在引用安全驗證過程中,涉及到Move語言的一些核心機制。通過分析這個漏洞,我們可以更深入地理解Move語言的設計和實現。

Move語言的驗證過程

Move語言在執行字節碼之前會對代碼單元進行驗證,這個過程分爲4個步驟。本次發現的漏洞出現在reference_safety這一步驟中。

reference_safety模塊定義了用於驗證引用安全性的核心函數。它主要檢查是否存在懸空引用、可變引用訪問是否安全、全局存儲引用訪問是否安全等問題。

驗證過程的入口函數會調用analyze_function來分析每個函數。analyze_function會對函數中的每個基本塊進行驗證。基本塊是指除入口和出口外沒有分支指令的代碼序列。

Numen Cyber獨家發現move語言又一高危漏洞

Move語言中的引用安全

Move語言支持兩種引用類型:不可變引用(&)和可變引用(&mut)。不可變引用用於讀取數據,可變引用用於修改數據。這種設計有助於提高代碼的安全性和可讀性。

引用安全驗證模塊會掃描函數中每個基本塊的字節碼指令,判斷所有引用操作是否合法。驗證過程主要包括:

  1. 執行基本塊代碼
  2. 合並執行前後的狀態
  3. 更新塊狀態
  4. 將後置條件傳播到後續塊

這個過程類似於V8 turbofan中的Sea of Nodes思想。

Numen Cyber獨家發現move語言又一高危漏洞

漏洞分析

漏洞出現在合並執行前後狀態的過程中。當函數參數長度加上局部變量長度大於256時,由於使用u8類型表示局部變量索引,會導致整數溢出。

雖然Move語言有校驗局部變量個數的過程,但這個校驗並不包括參數長度。開發人員似乎意識到需要檢查參數和局部變量的總和,但實際代碼中只檢查了局部變量的個數。

這個整數溢出可能導致拒絕服務攻擊(DoS)。攻擊者可以構造一個循環代碼塊,利用溢出改變塊的狀態。當再次執行基本塊時,如果指令需要訪問的索引在新的狀態中不存在,就會導致程序崩潰。

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

漏洞利用

我們構造了一個概念驗證(PoC)來演示這個漏洞:

  1. 創建一個包含無條件分支指令的基本塊,使其多次執行。
  2. 設置參數和局部變量總數爲264,導致新的局部變量映射長度溢出爲8。
  3. 再次執行基本塊時,嘗試訪問不存在的局部變量索引,引發panic。

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

Numen Cyber獨家發現move語言又一高危漏洞

結論

這個漏洞再次證明了沒有絕對安全的代碼。雖然Move語言在執行前進行了靜態校驗,但仍可能被整數溢出漏洞繞過。

對於Move語言的未來發展,我們建議:

  1. 在運行時增加更多的檢查代碼,防止意外情況發生。
  2. 不要僅依賴驗證階段的安全檢查,還應在運行階段進行安全加固。

作爲Move語言安全研究的先行者,我們將繼續深入研究Move的安全問題,爲其發展貢獻力量。

查看原文
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 讚賞
  • 3
  • 分享
留言
0/400
快照民工vip
· 17小時前
学了五分钟就去提bug了吧
回復0
RadioShackKnightvip
· 17小時前
move 烂泥扶不上墙
回復0
Layer Zero Herovip
· 17小時前
有一说一,move也不过如此
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)