# 微軟Windows系統嚴重漏洞分析:可能危及Web3生態安全上個月微軟發布的安全補丁中修復了一個正被黑客利用的Windows提權漏洞。這個漏洞主要影響早期Windows系統版本,Windows 11似乎不受影響。本文將分析在當前安全防護不斷加強的背景下,攻擊者如何繼續利用這類漏洞。我們的分析是基於Windows Server 2016完成的。## 漏洞背景這是一個0day漏洞,即尚未公開和修復的漏洞。黑客可以在用戶不知情的情況下利用它進行攻擊,破壞性極大。通過這個Windows系統級別的漏洞,黑客可以獲取系統的完全控制權。這可能導致個人信息泄露、系統崩潰、數據丟失、財務損失等嚴重後果。對於Web3用戶來說,私鑰和數字資產可能被盜。從更廣泛的角度看,這個漏洞甚至可能影響整個基於Web2基礎設施的Web3生態系統。## 補丁分析 分析補丁代碼,問題似乎出在一個對象的引用計數被多處理了一次。通過查看早期源碼注釋,我們發現以前的代碼只鎖定了窗口對象,沒有鎖定窗口中的菜單對象,這可能導致菜單對象被錯誤引用。## 漏洞復現分析漏洞函數上下文,我們發現傳入xxxEnableMenuItem()的菜單通常已在上層函數被鎖定,這裏究竟要保護哪個菜單對象存在疑問。進一步分析發現,xxxEnableMenuItem中MenuItemState函數返回的菜單有兩種可能:窗口主菜單或子菜單(甚至子子菜單)。我們構造了一個特殊的四層菜單結構來觸發漏洞,這些菜單需要滿足一些特定條件以通過函數中的檢測。關鍵是在xxxRedrawTitle返回用戶層時,刪除某些菜單間的引用關係,釋放特定菜單對象。這樣在xxxEnableMenuItem函數返回點時,即將引用的菜單對象就已無效。## 漏洞利用在開發漏洞利用程序(exp)時,我們主要考慮了兩種方案:1. 執行shellcode代碼:參考早期的類似漏洞,但在新版Windows中可能存在一些障礙。2. 利用讀寫原語修改token地址:這種方法近期仍有公開exp可參考,對桌面堆內存布局和讀寫原語有較好的通用性。我們選擇了第二種方案,將整個利用過程分爲兩步:如何利用UAF漏洞控制cbwndextra的值,以及如何穩定地實現讀寫原語。關鍵是找到一個可以由我們構建的地址結構中能夠被任意寫入數據的位置。我們最終選擇了通過xxxRedrawWindow函數中的一個標志位AND操作來實現。爲了實現穩定的內存布局,我們設計了至少三個連續的0x250字節HWND對象,釋放中間的對象,用HWNDClass對象佔用。前後的HWND對象分別用於通過函數檢驗和實現最終的讀寫原語。我們還通過泄露的內核句柄地址來精確判斷對象是否按預期排列。讀寫原語方面,我們使用GetMenuBarInfo()實現任意讀,使用SetClassLongPtr()實現任意寫。## 結論1. 微軟正在嘗試用Rust重構win32k相關代碼,未來此類漏洞可能在新系統中被杜絕。2. 這類漏洞的利用過程相對簡單,主要依賴桌面堆句柄地址的泄露。如果不徹底解決這個問題,老舊系統將持續面臨安全隱患。3. 該漏洞的發現可能得益於更完善的代碼覆蓋率檢測技術。4. 對於漏洞利用檢測,除了監控關鍵函數,還應該關注異常的內存布局和數據讀寫行爲。
Windows系統漏洞威脅Web3生態安全 專家深度分析利用機制
微軟Windows系統嚴重漏洞分析:可能危及Web3生態安全
上個月微軟發布的安全補丁中修復了一個正被黑客利用的Windows提權漏洞。這個漏洞主要影響早期Windows系統版本,Windows 11似乎不受影響。
本文將分析在當前安全防護不斷加強的背景下,攻擊者如何繼續利用這類漏洞。我們的分析是基於Windows Server 2016完成的。
漏洞背景
這是一個0day漏洞,即尚未公開和修復的漏洞。黑客可以在用戶不知情的情況下利用它進行攻擊,破壞性極大。
通過這個Windows系統級別的漏洞,黑客可以獲取系統的完全控制權。這可能導致個人信息泄露、系統崩潰、數據丟失、財務損失等嚴重後果。對於Web3用戶來說,私鑰和數字資產可能被盜。從更廣泛的角度看,這個漏洞甚至可能影響整個基於Web2基礎設施的Web3生態系統。
補丁分析
分析補丁代碼,問題似乎出在一個對象的引用計數被多處理了一次。通過查看早期源碼注釋,我們發現以前的代碼只鎖定了窗口對象,沒有鎖定窗口中的菜單對象,這可能導致菜單對象被錯誤引用。
漏洞復現
分析漏洞函數上下文,我們發現傳入xxxEnableMenuItem()的菜單通常已在上層函數被鎖定,這裏究竟要保護哪個菜單對象存在疑問。
進一步分析發現,xxxEnableMenuItem中MenuItemState函數返回的菜單有兩種可能:窗口主菜單或子菜單(甚至子子菜單)。
我們構造了一個特殊的四層菜單結構來觸發漏洞,這些菜單需要滿足一些特定條件以通過函數中的檢測。關鍵是在xxxRedrawTitle返回用戶層時,刪除某些菜單間的引用關係,釋放特定菜單對象。這樣在xxxEnableMenuItem函數返回點時,即將引用的菜單對象就已無效。
漏洞利用
在開發漏洞利用程序(exp)時,我們主要考慮了兩種方案:
執行shellcode代碼:參考早期的類似漏洞,但在新版Windows中可能存在一些障礙。
利用讀寫原語修改token地址:這種方法近期仍有公開exp可參考,對桌面堆內存布局和讀寫原語有較好的通用性。
我們選擇了第二種方案,將整個利用過程分爲兩步:如何利用UAF漏洞控制cbwndextra的值,以及如何穩定地實現讀寫原語。
關鍵是找到一個可以由我們構建的地址結構中能夠被任意寫入數據的位置。我們最終選擇了通過xxxRedrawWindow函數中的一個標志位AND操作來實現。
爲了實現穩定的內存布局,我們設計了至少三個連續的0x250字節HWND對象,釋放中間的對象,用HWNDClass對象佔用。前後的HWND對象分別用於通過函數檢驗和實現最終的讀寫原語。
我們還通過泄露的內核句柄地址來精確判斷對象是否按預期排列。讀寫原語方面,我們使用GetMenuBarInfo()實現任意讀,使用SetClassLongPtr()實現任意寫。
結論
微軟正在嘗試用Rust重構win32k相關代碼,未來此類漏洞可能在新系統中被杜絕。
這類漏洞的利用過程相對簡單,主要依賴桌面堆句柄地址的泄露。如果不徹底解決這個問題,老舊系統將持續面臨安全隱患。
該漏洞的發現可能得益於更完善的代碼覆蓋率檢測技術。
對於漏洞利用檢測,除了監控關鍵函數,還應該關注異常的內存布局和數據讀寫行爲。