Move語言引用安全模塊發現整數溢出漏洞 或致DoS攻擊

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

近期,在對Move語言進行深入研究時,我們發現了一個新的整數溢出漏洞。這個漏洞存在於引用安全驗證過程中,其觸發過程頗爲有趣。本文將深入分析這個漏洞,並探討Move語言的一些背景知識。

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

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

引用安全驗證的入口函數會調用analyze_function,對每個基本塊進行驗證。基本塊是指除入口和出口外沒有分支指令的代碼序列。Move語言通過遍歷字節碼,查找所有分支指令和循環指令序列來識別基本塊。

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

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

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

漏洞出現在join_函數中。當參數長度加上局部變量長度超過256時,由於iter_locals()函數返回u8類型的迭代器,會導致整數溢出。雖然Move有校驗locals個數的過程,但在check bounds模塊中只校驗了locals,沒有包括參數長度。

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

這個整數溢出可能導致拒絕服務(DoS)攻擊。當存在循環代碼塊並利用溢出改變塊的state時,新的locals map與之前不同。再次執行execute_block函數時,如果指令需要訪問的索引在新的AbstractState locals map中不存在,將導致DoS。

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

我們提供了一個可在git中重現的PoC。該PoC中的代碼塊包含一個無條件分支指令,每次執行最後一條指令時都會跳回第一條指令,從而多次調用execute_block和join函數。

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

這個漏洞說明即使是像Move這樣注重安全的語言也可能存在安全隱患。代碼審計的重要性不言而喻,程序員難免會有疏忽。作爲Move語言安全研究的領導者,我們將繼續深入研究Move的安全問題。

我們建議Move語言設計者在運行時增加更多的檢查代碼,以防止意外情況發生。目前Move主要在verify階段進行安全檢查,但這可能還不夠。一旦驗證被繞過,運行階段缺乏足夠的安全加固可能導致更嚴重的問題。

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語言又一高危漏洞

MOVE1.64%
查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 5
  • 轉發
  • 分享
留言
0/400
Gas Fee Whisperervip
· 23小時前
move又崩啦
回復0
止损艺术家vip
· 08-16 03:33
又是自己人挖的洞叭
回復0
Liquidation_Watchervip
· 08-16 03:31
又双叒出漏洞了
回復0
ZK证明爱好者vip
· 08-16 03:28
这个bug玩大了
回復0
佛系矿工ervip
· 08-16 03:08
有毒咯,move又要打修补丁了
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)