
摘要
Windows Defender Application Control(WDAC) 是一項強大的安全功能,目的為限制 Windows 系統上可執行的應用程式和程式碼,通常基於程式碼簽署政策(Code signing policies)。雖然對許多形式的惡意軟體和未經授權的軟體有效,但高級攻擊者不斷尋求繞過(Bypass)方法。本報告分析了一種利用 Microsoft 的 WinDbg Preview 除錯器的可信狀態來執行任意未簽署程式碼,從而繞過 WDAC 政策的技術。該技術的核心在於利用 WinDbg 的能力,從其自身可信程序環境中載入不受信任的程式碼(具體來說,是除錯器擴展 DLL)。本報告詳細介紹了此繞過的技術基礎,檢視了漏洞利用架構,並討論了對系統安全的影響。

1. 簡介
在當今的網路安全環境中,像 Windows Defender Application Control (WDAC) 這樣的應用程式控制機制是重要的防禦層。WDAC 允許管理員定義嚴格的政策,決定哪些軟體可以在終端設備(Endpoints)上執行,通常依賴於來自可信發行者的加密簽署可執行檔和程式庫。這大大提高了攻擊者的門檻,阻止了未經授權的腳本(Scripts)、可執行檔,甚至是合法但有漏洞的應用程式的執行。然而,沒有一種安全控制是萬無一失的,攻擊者不斷探尋弱點,經常針對可信程序或系統功能,誘使其執行惡意 Payload。
本報告調查了一種最近分析中記錄的特定 WDAC 繞過技術 1,該技術利用了 Microsoft 的 WinDbg Preview 除錯器所固有的信任。由於其在系統和應用程式除錯中的關鍵角色,WinDbg Preview 由 Microsoft 簽署,通常在預設或常見的 WDAC 政策下被信任。該技術展示了如何濫用這種可信狀態來載入和執行任意不受信任的程式碼,繞過 WDAC 旨在執行的控制。後續章節將提供 WDAC 和 WinDbg Preview 的背景,深入分析繞過方法的技術細節,探討其實現細節,並考慮其安全影響。
2. 背景:Windows Defender 應用程式控制 (WDAC)
Windows Defender Application Control (WDAC),前身為程式碼完整性政策(Code Integrity policies),是一項安全功能,強制控制系統上允許執行的程式碼。WDAC 政策規定了可執行檔、腳本、MSI 安裝程式和驅動程式啟動的條件。這些政策基於多種標準,最常見的有:
- 發行者規則(Publisher Rules): 允許由特定軟體發行者簽署的程式碼。
- 路徑規則(Path Rules): 允許從指定檔案路徑執行。
- 雜湊規則(Hash Rules): 根據檔案的加密雜湊允許特定版本的檔案。
- 檔案屬性(File Attributes): 依據原始檔案名稱、產品名稱或版本的規則。
WDAC 在 Windows 核心中以低層次運作,設計上高度抗干擾。其主要功能是確保只有授權且可驗證的程式碼執行,通過阻止惡意軟體、未簽署工具或有漏洞的應用程式的執行,大幅降低攻擊面。預設情況下,許多系統可能未強制執行嚴格的 WDAC 政策,但企業和注重安全的用戶越來越常部署它們以增強保護。WDAC 的一個關鍵特徵是其依賴程式碼簽署;由 Microsoft 或其他明確信任的實體簽署的程式碼通常被允許執行,這是本報告討論的繞過基礎。
3. 背景:WinDbg Preview
WinDbg Preview 是 Windows 除錯器的現代版本,是一個由 Microsoft 開發的強大多用途除錯器。它被開發者、系統管理員和安全研究人員廣泛用於除錯應用程式、驅動程式和 Windows 核心本身。WinDbg 提供了廣泛的功能,包括:
- 附加到執行中的程序或啟動新程序。
- 設置斷點並逐步執行程式碼。
- 檢查和修改記憶體、暫存器(Registers)和系統結構。
- 載入除錯器擴展 (DLL) 以新增自訂命令和分析能力。
- 執行Crash dumps的後期除錯(Post-mortem debugging)。
鑑於其在檢查和操作執行程序及系統狀態中的關鍵功能,WinDbg 需要相當大的權限。因此,它由 Microsoft 簽署,被 Windows 作業系統視為可信應用程式,更重要的是,被信任 Microsoft 簽署二進位檔案的 WDAC 政策視為可信。這種可信狀態是所述繞過技術所利用的漏洞。
4. 繞過技術分析
利用 WinDbg Preview 的 WDAC 繞過技術的核心在於濫用 WDAC 政策對除錯器的隱式信任 1。因為 WinDbg Preview (
windbg.exe
) 由 Microsoft 簽署,WDAC 通常允許其執行和操作。繞過機制利用 WinDbg 的合法功能來載入和執行 WDAC 原本會阻止的任意程式碼,若由不受信任的程序嘗試執行。
所述的主要方法涉及使用 WinDbg 的能力來載入 除錯器擴展 。除錯器擴展是動態連結程式庫 (DLL),它們匯出特定功能,允許在除錯器環境中載入和互動。這些擴展提供針對特定除錯任務的自訂命令和功能。關鍵點在於,作為可信程序的 WinDbg,被 WDAC 允許載入 DLL。
繞過的運作方式如下:
-
攻擊者執行 WinDbg Preview。由於
windbg.exe
由 Microsoft 簽署,WDAC 允許此操作 1。 - 攻擊者將 WinDbg 附加到目標程序,該程序甚至可以是另一個 WinDbg 實例或僅用於承載除錯器的簡單程序。附加到程序是 WinDbg 的合法功能,被 WDAC 允許。
-
攻擊者使用除錯器命令,具體為
.load
,從檔案系統載入任意 DLL 到除錯器程序的位址空間(或根據命令的環境和目標,載入被除錯的程序) 1。文章專注於在除錯器本身內作為擴展載入它。 - 攻擊者提供的 DLL 檔案 不 需要由 WDAC 簽署或信任 1。它可以是偽裝成除錯器擴展的惡意 Payload。
-
當 WinDbg 處理
`.load`
命令時,它執行必要的操作(例如內部呼叫LoadLibrary
)來載入指定的 DLL。由於LoadLibrary
呼叫原來是可信的windbg.exe
程序,WDAC 看到可信程序執行標準操作 ,無論 DLL 的信任狀態如何,都允許 DLL 載入1。 -
一旦惡意 DLL 載入,其入口點(例如,
DllMain
或 WinDbg 擴展預期的初始化例程)由 WinDbg 執行 1。這允許攻擊者的程式碼在 WinDbg 程序的高度可信環境中執行,有效繞過 WDAC 對惡意 DLL 本身的控制。
這種技術代表了“可信程序呼叫不受信任程式碼”漏洞的經典範例。WDAC 正確識別
windbg.exe
為可信並允許其操作。在這種情況下,它
不會
重新評估由可信程序從程序記憶體空間內通過像
.load
這樣的除錯器命令觸發的內部載入器機制載入的 DLL 的信任。
雖然文章主要強調用於載入除錯器擴展的
.load
命令 1,但除錯器的固有能力表明其他利用相似原理的潛在方法。除錯器有能力讀寫程序記憶體(
ReadProcessMemory
、
WriteProcessMemory
)、修改暫存器狀態、設置指令指標(Instruction Pointers),以及創建執行緒(通過除錯器 API 等效於
CreateRemoteThread
)。攻擊者可能使用這些原語(Primitives)來:
- 直接將 Shellcode 注入除錯器的記憶體空間或被除錯程序的記憶體空間。
-
將惡意 DLL 寫入磁碟(如果尚未存在),將其路徑寫入記憶體,然後操縱程序以在該路徑上呼叫
LoadLibrary
。 -
在目標程序中創建遠程執行緒(文章中提到
NtCreateThreadEx
在斷點的環境中 1)以執行注入的程式碼或載入的 DLL 函數。
然而,從攻擊者的角度來看,
.load
命令技術特別優雅,因為它利用了標準、記錄在案的除錯器功能,專為載入外部程式碼模組(擴展)而設計。
5. 技術細節與實現
這種繞過的實現直接依賴於通過其命令介面或腳本功能與 WinDbg Preview 互動。關鍵命令是
.load
1。例如,要載入位於
C:\temp
的假設惡意除錯器擴展名為
malicious_ext.dll
,攻擊者將執行以下命令:
.load c:\temp\malicious_ext.dll1
WinDbg 隨後會嘗試載入此 DLL。如果成功,
malicious_ext.dll
中的程式碼將以
windbg.exe
的權限和信任級別執行。
文章還展示了其他典型的除錯器命令,說明了攻擊者可用的環境和能力:
-
!process 0 0
:顯示所有執行程序的資訊 1。這用於識別目標程序 ID。 -
.reload
:重新載入符號資訊 1。雖然不是 繞過 的直接部分,但這是可靠互動和分析所需的標準除錯器命令,表明攻擊者在功能性除錯環境中操作。 -
lm m ntdll
:列出載入的模組,特別是ntdll.dll
1。同樣,這是一個檢查載入模組的標準命令,展示了攻擊者查詢程序狀態的能力。 -
bp nt!NtCreateThreadEx
:在NtCreateThreadEx
核心函數上設置斷點 1。這展示了攔截系統呼叫的能力,這是一個強大的原語, 可能 用於注入技術(雖然文章將其用作除錯器控制的示例,而非主要繞過方法)。 -
k
:顯示當前呼叫堆疊 1。 -
g
:繼續執行 1。 -
dd
和ed
:分別顯示和編輯記憶體 1。這些命令突顯了除錯器讀寫程序記憶體的能力,這是大多數程式碼注入技術的基礎。
從攻擊者的角度來看,
漏洞利用架構
涉及協調這些步驟:啟動 WinDbg,附加到程序,並使用指向其惡意 DLL 路徑的
.load
命令發出指令。從系統的角度來看,架構涉及可信的
windbg.exe
程序呼叫 Windows 載入器 API(例如
LoadLibrary
)來載入指定的 DLL 檔案。WDAC 攔截此載入操作,但看到呼叫者是
windbg.exe
,因此允許它,從而允許不受信任的 DLL 映射到記憶體並執行。
這種技術要求攻擊者有能力執行 WinDbg Preview 並將惡意 DLL 放置在檔案系統上。根據系統設定,放置 DLL 可能需要繞過其他控制(例如檔案系統寫入限制),但繞過具體針對 WDAC 施加的 執行 限制。
6. 影響與緩解措施
這種基於 WinDbg Preview 的繞過技術具有重要的安全影響。它表明即使有 WDAC 政策存在,像除錯器這樣的高權限和可信應用程式如果其功能可被用來執行任意程式碼,也可能引入漏洞。獲得執行 WinDbg 能力的攻擊者可能通過將其工具和 Payload 作為除錯器擴展或通過其他除錯器原語載入,完全繞過 WDAC。
只使用 WDAC 日誌檢測此特定技術可能具有挑戰性,因為日誌可能顯示
windbg.exe
執行並執行標準操作,如模組載入,而不是將不受信任的 DLL 本身標記為被阻止執行。行為監控至關重要。安全監控系統應尋找:
-
在終端設備上不尋常的
windbg.exe
執行,特別是在通常不用於開發或除錯的系統上。 - WinDbg Preview 附加到不尋常或敏感的程序。
- WinDbg Preview 從非標準或可疑檔案路徑載入除錯器擴展。
- WinDbg 活動與從 WinDbg 程序環境發起的後續惡意行為的關聯。
針對此特定繞過的緩解措施可能包括:
-
最小權限原則:
嚴格限制哪些用戶和帳戶有權執行 WinDbg Preview。部署僅允許授權人員或系統執行
windbg.exe
的 WDAC 政策。 - 更嚴格的 WDAC 政策: 雖然具有挑戰性,管理員可能探索高級 WDAC 政策,實現雜湊規則以阻止已知的惡意 DLL,即使由可信程序載入。這需要事先了解惡意 DLL 並增加顯著的管理開銷。或者,政策可以限制像 WinDbg 這樣的受信任應用程式允許從何處載入 DLL。
-
除錯器擴展的應用程式白名單:
如果在 WinDbg 設定或通過輔助控制中可行,限制允許的特定除錯器擴展 DLL(通過
.load
載入的.dll
檔案),可能使用雜湊或簽署。 - 終端檢測與回應 (EDR): 實現能夠監控程序行為的複雜 EDR 解決方案,包括程序間通信、模組載入詳情(包括簽署者和路徑)以及執行緒創建,以檢測從像 WinDbg 這樣的受信任程序發起的可疑活動。
7. 結論
使用 WinDbg Preview 的 WDAC 繞過技術分析突顯了應用程式控制中的一個基本挑戰:管理高權限和可信軟體的能力。通過利用
windbg.exe
的可信狀態,攻擊者可以使用其合法功能,特別是除錯器擴展的
.load
命令,來執行 WDAC 原本會阻止的任意未簽署程式碼。這種技術表明,雖然 WDAC 是一種強大的防禦,但了解通過可信二進位檔案進行繞過的潛在可能性對於構建全面的安全態勢至關重要。有效的緩解措施不僅需要強大的應用程式控制政策,還需要對像除錯器這樣強大工具的嚴格存取控制,以及檢測其濫用的先進行為監控能力。