🎉 #Gate Alpha 第三届积分狂欢节 & ES Launchpool# 聯合推廣任務上線!
本次活動總獎池:1,250 枚 ES
任務目標:推廣 Eclipse($ES)Launchpool 和 Alpha 第11期 $ES 專場
📄 詳情參考:
Launchpool 公告:https://www.gate.com/zh/announcements/article/46134
Alpha 第11期公告:https://www.gate.com/zh/announcements/article/46137
🧩【任務內容】
請圍繞 Launchpool 和 Alpha 第11期 活動進行內容創作,並曬出參與截圖。
📸【參與方式】
1️⃣ 帶上Tag #Gate Alpha 第三届积分狂欢节 & ES Launchpool# 發帖
2️⃣ 曬出以下任一截圖:
Launchpool 質押截圖(BTC / ETH / ES)
Alpha 交易頁面截圖(交易 ES)
3️⃣ 發布圖文內容,可參考以下方向(≥60字):
簡介 ES/Eclipse 項目亮點、代幣機制等基本信息
分享你對 ES 項目的觀點、前景判斷、挖礦體驗等
分析 Launchpool 挖礦 或 Alpha 積分玩法的策略和收益對比
🎁【獎勵說明】
評選內容質量最優的 10 位 Launchpool/Gate
Windows零日漏洞分析:Web3生態或受重大影響
微軟Windows系統零日漏洞分析:可能造成Web3生態重大影響
上個月微軟的安全更新中修復了一個正在被惡意利用的Windows內核提權漏洞。該漏洞主要影響較早版本的Windows系統,Windows 11似乎不受影響。本文將分析在當前安全防護措施不斷加強的背景下,攻擊者可能如何繼續利用這類漏洞。
我們在Windows Server 2016環境下完成了全部分析工作。
零日漏洞是指尚未被發現和修復的系統漏洞,類似於金融市場中的T+0交易概念。零日漏洞一旦被惡意利用,通常會造成極大危害。本次發現的Windows系統零日漏洞可讓攻擊者獲得系統的完全控制權。
被攻擊者控制系統後果嚴重,包括但不限於個人隱私泄露、系統崩潰數據丟失、財產損失、惡意軟件植入等。對於個人用戶而言,可能導致加密貨幣私鑰被盜、數字資產被轉移;從更大範圍看,該漏洞甚至可能影響整個基於Web2基礎設施的Web3生態。
補丁分析
對補丁進行分析,我們發現問題似乎只是一個對象的引用計數被多處理了一次。由於win32k是較早期的代碼,我們可以找到一些早期的源碼注釋,這些注釋表明之前的代碼只鎖定了窗口對象,沒有鎖定窗口對象中的菜單對象,這可能導致菜單對象被錯誤引用。
漏洞利用概念驗證(PoC)實現
分析漏洞函數上下文,我們發現傳入xxxEnableMenuItem()的菜單通常已在上層函數中被鎖定,那麼這裏究竟是要保護哪個菜單對象?
進一步分析xxxEnableMenuItem中對菜單對象的處理過程,我們發現MenuItemState函數返回的菜單有兩種可能:窗口的主菜單,或菜單的子菜單(甚至子子菜單)。
在PoC中,我們構造了一個特殊的四層菜單結構,相鄰菜單之間是父子關係。這些菜單有一些特定特徵,以通過xxxEnableMenuItem函數中的檢測和判斷。
在xxxRedrawTitle返回用戶層時,我們刪除了菜單C和菜單B的引用關係,成功釋放菜單C。最終,當內核中xxxEnableMenuItem函數返回到xxxRedrawTitle函數時,即將引用的菜單C對象已經無效。
漏洞利用(Exploit)實現
在確定利用思路前,我們通常會進行一些理論上的前期判斷,以避免在不可行的方案上浪費時間。本次漏洞利用主要考慮了兩個方向:
執行shellcode代碼:參考早期的CVE-2017-0263和CVE-2016-0167。但在高版本Windows中,這種方式可能面臨一些難以解決的問題。
利用讀寫原語修改token地址:近年來已有公開的利用方式可供參考。桌面堆內存布局和讀寫原語具有長期通用性。我們主要需要分析如何在UAF內存被重用時首次控制cbwndextra爲特大值。
我們將整個利用過程分爲兩個問題:如何利用UAF漏洞控制cbwndextra值,以及控制cbwndextra值後如何實現穩定的讀寫原語。
最終我們選擇了在xxxRedrawWindow函數中通過標志位的AND 2操作來寫入HWNDClass的cb-extra。這是因爲HWNDClass的cb-extra偏移較小,我們可以通過布局內存來控制前一個對象的內存數據,從而通過xxxRedrawWindow函數中對對象標志的判斷。
爲實現穩定的內存布局,我們設計了至少連續三個0x250字節的HWND對象。釋放中間對象後,用0x250字節的HWNDClass對象佔用該位置。前一個HWND對象的尾部數據用於通過xxxRedrawWindow的標志檢驗,後一個HWND對象的菜單對象和HWNDClass對象用作最終讀寫原語的媒介。
我們盡量保持窗口對象和HWNDClass對象大小一致,並確保窗口對象的擴展數據足夠大。通過堆內存中泄露的內核句柄地址,我們可以精確判斷申請的窗口對象是否按預期順序排列。
在讀寫原語方面,我們使用GetMenuBarInfo()實現任意讀,使用SetClassLongPtr()實現任意寫。除了替換TOKEN的寫入操作依賴第二個窗口的class對象外,其他寫入都利用第一個窗口對象的class對象通過偏移來實現。
總結
win32k現狀:微軟正在嘗試使用Rust重構Windows 11預覽版中的相關內核代碼,未來新系統可能杜絕此類漏洞。
漏洞利用過程相對簡單:除了如何控制第一次寫入需要細心嘗試外,基本不需要使用新的利用技術。該類漏洞嚴重依賴桌面堆句柄地址的泄露。
漏洞發現:推測可能依賴於更完善的代碼覆蓋率檢測。一旦系統API能在目標函數執行路徑中到達最深處的漏洞點,且窗口對象處於多重嵌套引用狀態,該漏洞就可能被模糊測試發現。
其他發現途徑:除了對漏洞觸發函數關鍵點的檢測,針對不常見的內存布局和窗口或窗口類額外數據異常偏移讀寫的檢測也可能是發現同類漏洞的途徑之一。