🎉 攢成長值,抽華爲Mate三折疊!廣場第 1️⃣ 2️⃣ 期夏季成長值抽獎大狂歡開啓!
總獎池超 $10,000+,華爲Mate三折疊手機、F1紅牛賽車模型、Gate限量週邊、熱門代幣等你來抽!
立即抽獎 👉 https://www.gate.com/activities/pointprize?now_period=12
如何快速賺成長值?
1️⃣ 進入【廣場】,點擊頭像旁標識進入【社區中心】
2️⃣ 完成發帖、評論、點讚、發言等日常任務,成長值拿不停
100%有獎,抽到賺到,大獎等你抱走,趕緊試試手氣!
截止於 8月9日 24:00 (UTC+8)
詳情: https://www.gate.com/announcements/article/46384
#成长值抽奖12期开启#
Move語言引用安全模塊發現新整數溢出漏洞
Move語言引用安全模塊中發現新的整數溢出漏洞
近期,在深入研究Move語言時發現了一個新的整數溢出漏洞。這個漏洞存在於引用安全驗證模塊中,其觸發過程較爲有趣。本文將對這個漏洞進行深入分析,同時介紹相關的Move語言背景知識。
Move語言在執行字節碼之前會對代碼單元進行驗證,整個驗證過程分爲4個步驟。本次發現的漏洞出現在reference_safety步驟中。
引用安全驗證模塊主要負責檢查是否存在懸空引用、可變引用訪問是否安全、全局存儲引用訪問是否安全等。驗證過程從analyze_function函數開始,對每個基本塊進行驗證。
在Move語言中,基本塊是指除入口和出口外沒有分支指令的代碼序列。系統通過遍歷字節碼,查找所有分支指令和循環指令序列來確定基本塊。
Move語言支持兩種引用類型:不可變引用(&)和可變引用(&mut)。引用安全模塊會掃描函數中各基本塊的字節碼指令,判斷所有引用操作是否合法。驗證過程使用AbstractState結構體,包含borrow graph和locals兩個組件,用於確保函數中引用的安全性。
在驗證過程中,系統會執行基本塊代碼生成post state,然後將pre state和post state合並更新塊狀態。如果狀態發生變化且存在循環,則會重復執行該基本塊,直到post state等於pre state或出現錯誤。
漏洞出現在join_函數中。當參數長度加上局部變量長度超過256時,由於使用u8類型迭代locals,會導致整數溢出。雖然Move語言有校驗locals個數的過程,但只檢查了局部變量數量,未包括參數長度。
這個整數溢出可能導致拒絕服務攻擊。攻擊者可以構造一個循環代碼塊,利用溢出改變塊的state。當再次執行execute_block函數時,如果指令需要訪問的索引在新的AbstractState locals map中不存在,就會導致系統崩潰。
爲了演示這個漏洞,我們可以構造一個包含無條件分支指令的基本塊。通過設置適當的參數和局部變量數量,可以使locals map長度溢出爲8。在第二次執行時,嘗試訪問不存在的offset就會導致panic。
這個漏洞提醒我們,即使是經過精心設計的語言也可能存在安全隱患。對Move語言來說,建議在運行時增加更多的檢查代碼,以防止意外情況發生。目前Move主要在verify階段進行安全檢查,但一旦驗證被繞過,可能會引發更嚴重的問題。
作爲Move語言安全研究的先行者,我們將繼續深入探索相關安全問題,爲Move生態系統的健康發展貢獻力量。