Move語言引用安全模塊發現新整數溢出漏洞

robot
摘要生成中

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

近期,在深入研究Move語言時發現了一個新的整數溢出漏洞。這個漏洞存在於引用安全驗證模塊中,其觸發過程較爲有趣。本文將對這個漏洞進行深入分析,同時介紹相關的Move語言背景知識。

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

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

引用安全驗證模塊主要負責檢查是否存在懸空引用、可變引用訪問是否安全、全局存儲引用訪問是否安全等。驗證過程從analyze_function函數開始,對每個基本塊進行驗證。

在Move語言中,基本塊是指除入口和出口外沒有分支指令的代碼序列。系統通過遍歷字節碼,查找所有分支指令和循環指令序列來確定基本塊。

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

Move語言支持兩種引用類型:不可變引用(&)和可變引用(&mut)。引用安全模塊會掃描函數中各基本塊的字節碼指令,判斷所有引用操作是否合法。驗證過程使用AbstractState結構體,包含borrow graph和locals兩個組件,用於確保函數中引用的安全性。

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

在驗證過程中,系統會執行基本塊代碼生成post state,然後將pre state和post state合並更新塊狀態。如果狀態發生變化且存在循環,則會重復執行該基本塊,直到post state等於pre state或出現錯誤。

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

漏洞出現在join_函數中。當參數長度加上局部變量長度超過256時,由於使用u8類型迭代locals,會導致整數溢出。雖然Move語言有校驗locals個數的過程,但只檢查了局部變量數量,未包括參數長度。

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

這個整數溢出可能導致拒絕服務攻擊。攻擊者可以構造一個循環代碼塊,利用溢出改變塊的state。當再次執行execute_block函數時,如果指令需要訪問的索引在新的AbstractState locals map中不存在,就會導致系統崩潰。

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

爲了演示這個漏洞,我們可以構造一個包含無條件分支指令的基本塊。通過設置適當的參數和局部變量數量,可以使locals map長度溢出爲8。在第二次執行時,嘗試訪問不存在的offset就會導致panic。

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

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

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

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

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

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

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

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

這個漏洞提醒我們,即使是經過精心設計的語言也可能存在安全隱患。對Move語言來說,建議在運行時增加更多的檢查代碼,以防止意外情況發生。目前Move主要在verify階段進行安全檢查,但一旦驗證被繞過,可能會引發更嚴重的問題。

作爲Move語言安全研究的先行者,我們將繼續深入探索相關安全問題,爲Move生態系統的健康發展貢獻力量。

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

MOVE-1.31%
查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 6
  • 分享
留言
0/400
TokenUnlockervip
· 13小時前
咋又是整数溢出呐
回復0
熊市种菜人vip
· 20小時前
move又出事了啊
回復0
RunWithRugsvip
· 08-02 18:07
咋又出安全漏洞了
回復0
测试网薅毛狂人vip
· 08-02 18:07
又有攻击面了 好耶
回復0
Just Another Walletvip
· 08-02 18:02
又出事了 审核背锅
回復0
LiquidityNinjavip
· 08-02 18:01
又得修复 move呵呵
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)