比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads
首頁 > DAI > Info

BSP:Numen Cyber獨家發現Move語言又一高危漏洞_MOVE

Author:

Time:1900/1/1 0:00:00

之前我們發現了一個Aptos Move VM的嚴重漏洞,經過深入研究,我們發現了另外一個新的整數溢出漏洞,這次一的漏洞觸發過程相對更有趣一點, 下面是對這個漏洞的深入分析過程,里面包含了很多Move語言本身的背景知識.通過本文講解相信你會對move語言有更深入的理解。 

眾所周知,Move 語言在執行字節碼之前會驗證代碼單元。驗證代碼單元的過程,分為4步。這個漏洞就出現在 reference_safety 的步驟中。 

如上面代碼所示, 此模塊定義了用于驗證過程主體的引用安全性的轉移函數。其檢查包括(但不限于)驗證沒有懸空引用、對可變引用的訪問是否安全、對全局存儲引用的訪問是否安全。 

下面是引用安全驗證入口函數, 它將調用analyze_function. 

在analyze_function中,函數將對每一個基本塊進行驗證,那么什么是基本塊呢? 

在代碼編譯領域,基本塊是一個代碼序列,除了入口之外沒有分支指令,除了出口之外沒有分支指令。 

在Move 語言中, 基本塊是通過遍歷字節碼、查找所有分支指令以及循環指令序列來確定的。以下是核心代碼: 

Numen發布微軟漏洞解析,黑客可通過該漏洞獲取Windows完全控制權:6月9日消息,安全機構 Numen Cyber Labs 發布微軟 win32k 提權漏洞解析。Numen 表示,該漏洞系 win32k 提權漏洞,是微軟 Windows 系統層面的漏洞。通過該漏洞,黑客可獲取 Windows 的完全控制權。

Numen 指出,win32k 漏洞歷史眾所周知。但在最新的 windows11 預覽版中,微軟已經在嘗試使用 Rust 重構該部分內核代碼。未來該類型的漏洞在新系統可能被杜絕。

此前報道,5 月,微軟發布的補丁更新解決了 38 個安全漏洞,其中包括一個零日漏洞。[2023/6/9 21:25:55]

接下來,我們來分享一個move ir代碼基本塊的例子, 如下所示, 它 3 個基本塊。分別由分支指令:BrTrue,Branch,Ret確定。 

參考Rust語言的思想,Move 支持兩種類型的引用類型。不可變引用&(例如&T)和可變引用&mut(例如&mut T)。你可以使用不可變 (&) 引用從結構中讀取數據,使用可變 (&mut)引用 修改它們。通過使用恰當的引用類型,有助于維護安全性以及識別讀取模塊。這樣可以讓讀者清晰地知道此方法是更改值還是僅讀取。 下面是官方Move教程中的示例: 

數字資產銀行Sygnum獲得阿布扎比全球市場金融服務監管局原則性批準:金色財經報道,數字資產銀行Sygnum宣布獲得阿布扎比全球市場(ADGM) 金融服務監管局 (FSRA) 原則性批準,將在中東地區開設辦事處,同時推出加密原生數字資產銀行、資產管理、代幣化和 B2B 銀行服務,其目標客戶包括阿聯酋區塊鏈公司,本地加密貨幣基金會和項目并為傳統機構投資者和富裕人士提供加密資產敞口。(crowdfundinsider)[2022/11/26 20:47:41]

在示例中,我們可以看到mut_ref_t是 t 的可變引用。 

所以在Move 引用安全模塊中,嘗試通過以函數為單元,掃描函數中的基本塊中的字節碼指令驗證判斷所有引用操作是否合法。 

下圖顯示了驗證引用安全性的主要流程。 

這里的state是AbstractState結構體, 它包含了borrow graph 和locals ,他們共同用于確保引用函數中的引用安全性。 

這里borrow graph是用來表示局部變量引用之間關系的圖。 

瑞士加密銀行Sygnum在新加坡獲得金管局原則上批準,將擴大當地服務:3月8日消息,瑞士加密貨幣銀行Sygnum的子公司Sygnum Singapore在獲得地方當局新的監管批準后,正在擴大服務。

該公司周二宣布,Sygnum Singapore獲得了新加坡金管局(MAS)的原則上批準,可在資本市場服務(CMS)許可下提供三項額外的合規活動。CMS許可證最初于2019年授予,允許Sygnum Singapore進行資產管理活動。

最新的原則上監管批準對Sygnum Singapore進行了升級,使其能夠提供新的工具,如提供企業金融咨詢服務、處理代幣化資本市場產品和數字資產,以及提供資產和證券型代幣的托管服務。(Cointelegraph)[2022/3/8 13:44:40]

從上圖中可以看到, 這里有一個pre state ,其包含locals 和borrow graph (L ,BG)。然后執行了basic block 生成一個post state (L’, BG’)。然后將前后的state合并以更新塊狀態并將該塊的后置條件傳播到后續塊。這就像 V8 turbofan中的Sea of Nodes 思想。 

下面的代碼是上圖對應的主循環。首先, 執行塊代碼(如果執行指令不成功,將返回 AnalysisError)然后嘗試通過join_result是否更改,來合并pre state和post state。如果更改并且當前塊本身包含一個后向的邊指向自己(這意味著有一個循環)將跳回到循環的開頭, 在下一輪循環仍將執行此基本塊,直到post state等于pre state或因某些錯誤而中止。 

新加坡加密交易所Coinhako獲SBI、Sygnum、Azimut投資:12月7日消息, 根據今天發布的一份聲明,總部位于新加坡的加密貨幣交易平臺Coinhako獲得了SBI-Sygnum-Azimut Digital Asset Opportunity基金的支持,這輪融資獲得了3倍超額認購。該基金是一個風險投資基金,由日本SBI集團、瑞士數字資產銀行Sygnum Bank和意大利Azimut(歐洲主要獨立資產管理公司)共同管理。此次投資的具體金額未予披露。Coinhako的聲明稱,該公司將利用新資金向東南亞地區以及機構和高凈值客戶細分市場擴張。[2021/12/7 12:56:53]

因此在引用安全模塊,如何判斷 join的結果是否改變? 

通過上面的代碼,我們可以通過判斷locals和borrow關系是否發生變化來判斷join結果是否發生變化。 這里的 join_ 函數用于更新本地變量和 borrow關系圖 。 

下面是join_ 函數代碼,第 6 行是初始化一個新的 locals Map 對象。 第 9 行迭代 locals 中的所有索引,如果pre state與 post state都值為 None,則不要插入到新的 locals 映射中,如果 pre state 有值,post state為None,則需要釋放 brow_graph id ,意味著這里消除該值的借用關系, 反之亦然。特別的,當pre state與 post state 兩個值都存在且相同時,像第30-33行一樣將它們插入到新的map中,然后在第38行合并 borrow graph。 

SBI子公司向Sygnum投資3000萬美元:2月17日消息,持有瑞士銀行業牌照的Sygnum周二表示,已從SBI的子公司SBI Digital Asset Holdings獲得3,000萬美元的投資,這將用于幫助SBI擴大客戶群并拓展新的市場歐洲和亞洲,截至2021年1月,該公司的資產已超過5億美元。(CoinDesk)[2021/2/17 17:23:31]

通過上面代碼,我們可以看到 self.iter_locals() 是locals變量的個數。 請注意,此局部變量不僅包括函數的真實局部變量,還包括參數。 

在這里我們已經覆蓋了所有與漏洞相關的代碼,你找到漏洞了嗎?

如果你沒有發現漏洞也沒關系,下面我會詳細說明漏洞觸發過程。 

首先在下面的代碼中,如果參數長度添加局部長度大于 256。這似乎沒有問題? 

當函數 join_() 中是 function_view.parameters().len() 和 function_view.locals().len() 組合值大于 256,由于語句 for local in self.iter_locals()中 local 是 u8類型,此時執行此語句對造成溢出。 

開發者似乎只檢查了 Move Modules代碼中的 locals+parameter 長度,而忽略了script。 

通過上面的介紹,我們知道有一個主循環來掃描代碼塊,然后調用execute_block函數,之后會合并執行前后的state,當move代碼中存在循環,則會跳轉到代碼塊開始,再次執行基本塊。 因此,如果我們制造一個循環代碼塊并利用溢出改變塊的state,使 AbstractState 對象中的新的locals map與之前不同,當再次執行 execute_block 函數時,在分析basic block中字節碼指令序列的時候會訪問新的locals map,這時候如果指令中需要訪問的索引在新的AbstractState locals map中不存在,將導致DoS。 

在審核代碼后,我發現在 reference safety模塊中,MoveLoc/CopyLoc/FreeRef 操作碼,我們可以實現這個目標。 

這里讓我們看一下文件路徑中execute_block函數調用的copy_loc函數作為一個說明: 

move/language/move-bytecode-verifier/src/reference_safety/abstract_state.rs 

在第287行,代碼嘗試通過LocalIndex作為參數獲取本地值,如果LocalIndex不存在會導致panic,想象一下當節點執行滿足上述條件代碼的時候,會導致整個節點崩潰。 

下面是你可以在git里面重現的PoC:

commit:add615b64390ea36e377e2a575f8cb91c9466844

thread 'regression_tests::reference_analysis::PoC' panicked at 'called `Option::unwrap()` on a `None` value', language/move-bytecode-verifier/src/reference_safety/abstract_state.rs:287:39 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 

我們可以看到PoC中代碼塊存在一個basic block,分支指令是一個無條件分支指令,每次執行最后一條指令時,branch(0) 將跳回第一條指令,因此這個代碼塊將多次調用 execute_block 和 join 函數。

1.在第一次執行完 execute_block 函數,當這里設置 parameters 為SignatureIndex(0),locals為SignatureIndex(0)會導致num_locals為132*2=264。 所以在執行join_函數下面這行代碼之后  

將會導致新的locals map長度為8. 

2.在第二次執行execute_block函數時,執行move代碼第一條指令copyloc(57),57是locals需要壓入棧的offset,但是這次locals只有長度8,offset 57不存在,所以會導致 get(57).unwrap() 函數返回 none ,最后導致panic。 

以上就是這個漏洞的來龍去脈。首先這個漏洞說明沒有絕對安全的代碼, Move語言在代碼執行之前確實做了很好的靜態校驗,但是就像這個漏洞一樣,可以通過溢出漏洞完全繞過之前的邊界校驗。再者代碼審計很重要,程序員難免會疏忽。作為Move語言安全研究的領導者,我們將繼續深挖Move的安全問題。第三點,對于Move語言,我們建議語言設計者在move運行時增加更多的檢查代碼,以防止意外情況的發生。目前move語言主要是在verify階段進行一系列的安全檢查,但我覺得這還不夠,一旦驗證被繞過,運行階段沒有過多的安全加固,將導致危害進一步加深,引發更嚴重的問題。最后,我們還發現了Move語言的另一個漏洞,后續會繼續分享給大家。 

參考資料 

https://github.com/move-language/move 

https://github.com/MystenLabs/awesome-move 

https://move-language.github.io/move/ 

Numen Cyber

企業專欄

閱讀更多

金色早8點

金色財經

去中心化金融社區

CertiK中文社區

虎嗅科技

區塊律動BlockBeats

念青

深潮TechFlow

Odaily星球日報

騰訊研究院

Tags:BSPNBSLOCMOVEBSPAY幣NBS價格blockchaininfo登不上MOVEY價格

DAI
NFT:全面解讀“ Listen To Earn”新玩法_TEND價格

備受矚目的古典音樂NFT平臺KOLO.Market自強勢殺入市場以來,受到廣大古典音樂愛好者以及幣圈玩家的熱捧.

1900/1/1 0:00:00
BSP:無聊猿暴跌 是FTX余震還是NFT市場暴雷前兆?_BSPAY價格

FTX事件堪稱加密世界的“雷曼時刻”。事件的發展速度和影響范圍已經遠遠超出了此前的想象。不論是從傳統的中心化交易所(CEX),還是各類投資基金,均受到了此次FTX事件的連續暴擊,危機已經開始蔓延.

1900/1/1 0:00:00
區塊鏈:晚間必讀 | 淺析美債暴跌是否會導致USDC/USDT暴雷?_Polychain Monsters Genesis

最近由 FTX 暴雷引發的加密市場崩潰揭示了 Web3 項目商業模式和代幣設計的脆弱性。本文不會就某個失敗項目展開具體分析,而是關注 Web3 代幣經濟在下一個采用周期中變得足夠成熟的必要條件.

1900/1/1 0:00:00
BSP:揭秘2022年六大加密騙術_NBS

本文來自幣安安全合作伙伴 HashDit ,原文作者:Sebastian Lim自去年起,加密詐騙案件就屢增不減.

1900/1/1 0:00:00
FTX:加密風投反思 FTX 崩盤:如何優化投資管理機制、避免為 FOMO 買單?_PEPECOIN

作者:flowie,ChainCatcher“ 上一輪加密牛市中,風險投資機構倉促完成交易,而缺乏盡調“,這是 FTX 發生大面積擠兌前一天.

1900/1/1 0:00:00
QUO:重新想象區塊鏈:創造自主世界_區塊鏈

應用層需要本質上的創新,不是在本來已經有的模式上做增量,而是全新的,不同的,乍一看非常nerd的東西。Defi和NFT是在L1孱弱的處理能力的限制下,發展出的低計算量,高價值的應用.

1900/1/1 0:00:00
ads