Move語言整數溢出漏洞揭祕:字節碼驗證中的隱患

robot
摘要生成中

Move語言整數溢出漏洞分析

在對Move語言進行深入研究後,我們發現了一個新的整數溢出漏洞。這個漏洞出現在Move語言字節碼驗證過程的引用安全性檢查階段。本文將詳細分析這個漏洞的觸發過程,並探討Move語言的一些核心概念。

Move語言字節碼驗證流程

Move語言在執行字節碼之前會進行代碼驗證,分爲4個步驟。本次漏洞出現在reference_safety步驟中。該步驟主要負責驗證引用的安全性,包括檢查是否存在懸空引用、可變引用訪問是否安全等。

驗證過程首先會識別代碼中的基本塊。基本塊是指除入口和出口外沒有分支指令的代碼序列。Move通過遍歷字節碼,查找所有分支指令和循環指令來確定基本塊。

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

Move中的引用安全

Move支持兩種引用類型:不可變引用(&)和可變引用(&mut)。引用安全模塊會掃描函數中每個基本塊的字節碼指令,驗證所有引用操作是否合法。

驗證過程使用AbstractState結構體來表示狀態,包含borrow graph和locals。驗證時會比較執行前後的狀態,並合並更新塊狀態。

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

漏洞分析

漏洞出現在join_函數中。該函數用於合並執行前後的狀態,更新locals map和borrow graph。問題在於locals迭代器返回u8類型,當參數長度和局部變量長度之和超過256時會發生溢出。

雖然Move有校驗locals個數的過程,但只校驗了局部變量數量,沒有包括參數長度。

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

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

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

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

漏洞利用

利用這個溢出可以改變基本塊的狀態。在循環代碼中,每次執行基本塊後狀態會發生變化。當再次執行時,如果指令訪問的索引在新的locals map中不存在,就會導致panic,從而實現DoS攻擊。

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

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

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

PoC演示

提供了一個可復現的PoC代碼,通過設置特定的參數和局部變量數量,觸發整數溢出,導致程序崩潰。

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

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

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

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

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

總結

這個漏洞再次證明了代碼審計的重要性。對於Move語言,建議在運行時增加更多安全檢查,而不僅僅依賴驗證階段的檢查。我們將繼續深入研究Move語言的安全問題,爲其發展貢獻力量。

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

查看原文
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 讚賞
  • 5
  • 分享
留言
0/400
薛定谔的纸手vip
· 07-09 07:32
move又寄了? 玩脱了玩脱了
回復0
码农韭菜vip
· 07-08 16:28
菜鸟被割
回復0
治理提案狂vip
· 07-08 06:09
早说了参数校验不能光写在文档里
回復0
Degen Whisperervip
· 07-08 06:07
溢出有点吓人吧
回復0
ApeWithAPlanvip
· 07-08 05:48
move宁又出事了
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)