2007年7月19日 星期四

深入探索 Windows Vista 核心:第三篇

http://technet.microsoft.com/zh-tw/magazine/2007.04.vistakernel.aspx

‧深入探索 Windows Vista 核心:第三篇

At a Glance:
* 可靠性
* 修復性
* 安全性

這一系列的文章到目前為止所涵蓋的 Windows Vista 核心增強功能,都與處理程序、I/O、記憶體管理、系統啟動、關機和電源管理有關。這是第三篇,也是最後一篇,

我將著重於可靠性、修復性和安全性等領域的功能和改進。

在這一系列的文章中,有一項功能我沒有談到,即使用者帳戶控制 (User Account Control,UAC),它是由數種不同的技術所構成,包括舊版應用程式的檔案系統和登錄虛擬化、同意提高權限來存取管理權限,以及 Windows® Integrity Level 機制,該機制可隔離以管理權限執行的處理程序與使用相同帳戶執行的較低權限處理程序。我將在未來的 TechNet Magazine 中深入探討 UAC 內部資訊。

Windows Vista™ 改進了系統的可靠性,並透過一些新功能和增強功能來提升您診斷系統和應用程式問題的能力。例如,核心的 Windows 事件追蹤 (Event Tracing for Windows,ETW) 記錄程式會保持作用中狀態,並在循環緩衝區中產生檔案、登錄、中斷和其他活動類型的追蹤事件。發生問題時,新的 Windows 診斷基礎結構 (Windows Diagnostic Infrastructure,WDI) 可擷取緩衝區的快照,並在本機上分析它,或將它上載至 Microsoft 支援中心進行疑難排解。

新的 Windows 效能和可靠性監視器可協助使用者了解發生的錯誤 (例如毀損/當機和懸置) 與系統設定變更之間的關係。功能強大的系統修復工具 (System Repair Tool,SRT) 取代了修復主控台,以進行無法開機系統的離線修復。

有三個領域仰賴系統的核心層級變更,因此值得在本篇文章中仔細探索:核心交易管理員 (Kernel Transaction Manager,KTM)、改進的毀損/當機處理,以及舊版的系統。


核心交易管理員


在軟體開發領域中,比較瑣碎的一環是錯誤狀況的處理。尤其是在執行高階作業的過程中,如果應用程式已完成一項或多項子作業而導致檔案系統或登錄變更時,更是如此。例如,應用程式的軟體更新服務可能進行了數項登錄更新、取代了其中一個應用程式可執行檔,然後在嘗試更新第二個應用程式可執行檔時遭到拒絕。如果該服務不想使應用程式處於不一致的狀態,就必須追蹤所做的一切變更,並妥當地進行復原。錯誤修復碼的測試很困難,通常會省略,因此修復碼中的錯誤可能導致前功盡棄。

針對 Windows Vista 撰寫的應用程式,可以利用核心交易管理員結合 NTFS 的新交易支援功能及登錄資訊,輕鬆獲得自動錯誤修復能力。當應用程式想要做一些相關的變更時,可以建立分散式交易協調器 (Distributed Transaction Coordinator,DTC) 交易和 KTM 交易控制碼,或直接建立 KTM 控制碼,並使檔案和登錄機碼的修改與交易產生關聯。如果所有變更都成功完成,應用程式會認可該交易並套用變更,但在這之前,應用程式可隨時回復交易及捨棄變更。

另一項好處是,在交易認可之前,其他應用程式不會看到該交易所做的變更,而且在 Windows Vista 和即將推出的 Windows Server® (代號 "Longhorn") 中使用 DTC 的應用程式,可以與 SQL Server™、Microsoft® 訊息佇列伺服器 (Microsoft Message Queue Server,MSMQ) 及其他資料庫協調其交易。因此,使用 KTM 交易的應用程式更新服務,絕對不會讓應用程式處於不一致狀態。這就是 Windows Update 和系統還原兩項服務都使用交易的原因。

KTM 是交易支援的核心,可讓交易資源管理員 (例如 NTFS) 和系統登錄針對應用程式所做的特定變更進行更新協調。在 Windows Vista 中,NTFS 會使用一個稱為 TxF 的延伸模組來支援交易。系統登錄則使用類似的延伸模組,稱為 TxR。這些核心模式資源管理員會與 KTM 共同協調交易狀態,就像使用者模式資源管理員會使用 DTC 在多個使用者模式資源管理員之間協調交易狀態一樣。其他廠商也可以使用 KTM 來實作他們自己的資源管理員。

TxF 和 TxR 均定義一組新的檔案系統和登錄 API,它們與現有的類似,只不過它們還包括了交易參數。如果應用程式想要在交易中建立檔案,它會先使用 KTM 建立交易,然後將產生的交易控制碼傳遞至要建立新檔案的 API。

TxF 和 TxR 均仰賴一般記錄檔系統 (Common Log File System,CLFS) (%SystemRoot%\System32\Clfs.sys) 的高速檔案系統記錄功能,這是在 Windows Server 2003 R2 所引進的。TxR 和 TxF 在認可交易之前,會使用 CLFS 持續儲存交易狀態的變更。這可讓它們在即使發生電源中斷時,亦可提供交易修復和可靠性。除了 CLFS 記錄檔之外,TxR 還會在 %Systemroot%\System32\Config\Txr 中建立一組相關記錄檔,來追蹤系統登錄檔的交易變更 (如 [圖 1] 所示),並對每一個使用者登錄 Hive 建立個別的記錄檔。TxF 會將每一個磁碟區的交易資料儲存在磁碟區的一個隱藏目錄中,稱為 \$Extend\$RmMetadata。
















圖 1
系統登錄 Hive TxR 記錄檔 (Click the image for a larger view)

增強式毀損/當機支援

當 Windows 發生無法修復的核心模式錯誤時 -- 不論是由於不良的裝置驅動程式、硬體故障或作業系統所造成 -- 它都會在顯示著名的藍色螢幕之後嘗試中止系統,以防止磁碟資料毀損,並將部分或全部實體記憶體寫入毀損傾印檔 (如果已設定這麼做的話)。傾印檔很有幫助,因為您在毀損/當機後重新開機時,Microsoft Online Crash Analysis (OCA) 服務會提議分析該檔來尋找根本原因。您也可以使用 Microsoft Debugging Tools for Windows 自行分析。

不 過在舊版的 Windows 中,要等到工作階段管理員 (%Systemroot%\System32\Smss.exe) 處理程序將分頁檔初始化之後,才能啟用毀損傾印檔的支援。這表示在那之前發生的任何重要錯誤只會導致藍色螢幕的出現,但不會有傾印檔。由於大部分裝置驅動 程式的初始化都是發生在 Smss.exe 啟動之前,因此在開機初期毀損/當機時,會因為無法導致毀損傾印而使原因的診斷變得非常困難。

Windows Vista 會在所有開機啟動裝置驅動程式初始化之後但在載入系統啟動驅動程式之前,將傾印檔支援初始化,以縮減無法產生傾印檔的時間。此變更讓您萬一在開機程序初期 發生毀損/當機,系統也可以記錄毀損傾印檔,讓 OCA 幫助您解決問題。不僅如此,Windows Vista 還會將資料儲存到以 64KB 區塊為單位的傾印檔,而舊版的 Windows 只會使用 4KB 區塊寫入。此變更提供了更大的傾印檔,且寫入速度快了 10 倍。

應 用程式的毀損/當機處理在 Windows Vista 中也進一步獲得改善。在舊版的 Windows 中,當應用程式毀損/當機時,會執行一個無法處理的例外狀況處理常式。此處理常式會啟動 Microsoft 應用程式錯誤報告 (Application Error Reporting,AER) 處理程序 (%Systemroot%\System32\Dwwin.exe) 以顯示對話方塊,指出該程式已毀損/當機,並詢問您是否要將錯誤報告傳送至 Microsoft。不過,如果在毀損/當機期間,該處理程序的主執行緒堆疊受損,當無法處理的例外狀況處理常式執行時,會導致核心終止該處理程序、程式 視窗會立刻消失,而且不會出現錯誤報告對話方塊。

Windows Vista 則是將錯誤處理從毀損/當機處理程序的內容中,轉移至 Windows 錯誤報告 (Windows Error Reporting,WER) 這項新服務。此服務是由服務主機 (Service Hosting) 處理程序內的 DLL (%Systemroot%\System32\Wersvc.dll) 實作。當應用程式毀損/當機時,它仍然會執行無法處理的例外狀況處理常式,但該處理常式會傳送訊息至 WER 服務,而此服務將啟動 WER 錯誤報告處理程序 (%Systemroot%\System32\Werfault.exe) 來顯示錯誤報告對話方塊。如果堆疊已受損且無法處理的例外狀況處理常式毀損/當機,則處理常式會再度執行,並再度毀損/當機,直到耗盡該執行緒的所有堆疊 (臨時記憶體區),此時核心會介入並將毀損/當機通知訊息傳送至該服務。

您 可以在 [圖 2] 和 [圖 3] 中看到這兩種方式的對照,這兩個圖顯示會造成毀損/當機的測試程式 Accvio.exe 在 Windows XP 和 Windows Vista 上的處理程序關係,並在其中用綠色反白的方式標示出錯誤報告的處理程序。新的 Windows Vista 錯誤處理架構表示程式不會在 Microsoft 未有機會取得錯誤報告以協助軟體開發人員改進其應用程式之前自動終止。


圖 2a Windows XP 中的應用程式錯誤處理 (Click the image for a larger view)

圖 2b (Click the image for a larger view)


圖 3a Windows Vista 中的應用程式錯誤處理 (Click the image for a larger view)











圖 3b


磁碟區陰影複製

Windows XP 引進一種技術,叫做磁碟區陰影複製,可產生磁碟區的時間點快照集。製作備份的應用程式可以使用這些快照集來產生一致的備份映像,但快照集通常會隱藏起來,而且只會在製作備份的期間保留。

快 照集實際上並非磁碟區的完整備份,而是磁碟區較早的檢視,其中是由即時磁碟區資料加上上一次產生快照集之後所變更的磁碟區所組成。磁碟區快照集提供者驅動 程式 (%Systemroot\%System32\Drivers\Volsnap.sys) 會監視以磁碟區為目標的作業,並在容許磁區變更之前建立磁區的備份,然後將原始資料儲存在該磁碟區的系統磁碟區資訊目錄內、與快照集相關聯的檔案中。

Windows Server 2003 藉由共用資料夾陰影複製功能,向伺服器的系統管理員以及用戶端系統的使用者公開了快照集的管理。此功能啟用了持續性快照集,讓使用者可透過檔案總管內容對 話方塊上的 [舊版] 索引標籤,存取其位於伺服器檔案共用中的資料夾和檔案的快照集。

Windows Vista 的舊版功能對所有用戶端系統提供此支援,並且會自動建立磁碟區快照集 (通常一天一次),您可以透過檔案總管內容對話方塊,使用共用資料夾之陰影複製所使用的相同介面來存取快照集。這可讓您檢視、還原或複製您可能不小心修改 或刪除的舊版檔案和目錄。雖然在技術上不算是新技術,但磁碟區陰影複製的 Windows Vista 舊版功能實作,在用戶端桌面環境中最佳化 Windows Server 2003 當初的實作。

Windows Vista 也利用磁碟區快照集來統一使用者和系統資料保護機制,避免儲存冗餘的備份資料。當應用程式的安裝或設定變更造成不正確或非預期的行為時,您可以使用 Windows XP 的系統還原功能 (在 Windows NT® 系列作業系統中所引進),將系統檔案和資料還原至建立還原點時的狀態。

在 Windows XP 中,系統還原會使用檔案系統篩選器驅動程式 (可在檔案層級查看變更的一種驅動程式),在系統檔案變更時建立系統檔案的備份。在 Windows Vista 上,系統還原會使用磁碟區快照集。當您使用 Windows Vista 中的系統還原使用者介面回到還原點時,實際上您是在從與還原點相關聯的快照集,將修改過之系統檔案的舊版複製到即時磁碟區。


BitLocker

Windows Vista 是目前最安全的 Windows 版本。其中除了納入 Windows Defender 反間諜軟體引擎之外,Windows Vista 還引進了數種安全性和深度防禦功能,包括 BitLocker™ 完整磁碟區加密、核心模式程式碼的程式碼簽署機制、受保護的處理程序、位址空間隨機載入 (Address Space Load Randomization),以及對 Windows 服務安全性和使用者帳戶控制的改進。

作 業系統只能在作用中狀態下實施其安全性原則,因此,您必須採取其他防護措施,以避免系統的實體安全受到危害,以及避免他人可從作業系統以外的管道存取資 料。像 BIOS 密碼和加密之類的硬體防護機制,是一般用來防止未經授權存取的兩種技術 (尤其是在最可能遺失或遭竊的筆記型電腦上)。

Windows 2000 引進了加密檔案系統 (EFS),在 Windows Vista 的化身中,EFS 還包括許多對舊版實作的改進,其中包括效能的增強、對加密分頁檔的支援,以及將使用者 EFS 金鑰儲存在智慧卡上的功能。不過,您不能使用 EFS 金鑰來保護系統機密區域的存取,例如登錄 Hive 檔案。例如,如果群組原則容許您即使未連接到網域也可以登入筆記型電腦,表示您的網域憑證檢查器已快取在登錄中,所以攻擊者可利用工具取得您的網域帳戶密 碼雜湊,並透過密碼破解程式來取得您的密碼。有了密碼便可以存取您的帳戶和 EFS 檔案 (假設您未將 EFS 金鑰儲存在智慧卡上)。

為 了使整個開機磁碟區 (含有 Windows 目錄的磁碟區) 更容易加密,包括其所有系統檔案和資料,Windows Vista 引進一種完整磁碟區加密功能,稱為 Windows BitLocker 磁碟機加密 (Windows BitLocker Drive Encryption)。與 NTFS 檔案系統驅動程式實作並在檔案層級操作的 EFS 不同,BitLocker 是使用完整磁碟區加密 (FVE) 驅動程式在磁碟區層級進行加密 (%Systemroot%\System32\Drivers\Fvevol.sys),如 [圖 4] 所示。



圖 4 BitLocker FVE 篩選器驅動程式 (Click the image for a larger view)

FVE 是一個篩選器驅動程式,因此,一旦開始啟用 BitLocker,它就會自動查看 NTFS 傳送至磁碟區的所有 I/O 要求,使用指派給該磁碟區的完整磁碟區加密金鑰 (FVEK) 將寫入的區塊加密,並將讀取的區塊解密。根據預設,磁碟區會使用 128 位元 AES 金鑰和 128 位元 Diffuser 金鑰進行加密。因為加密和解密是發生在 I/O 系統的 NTFS 之下,所以 NTFS 會以為磁碟區未加密,NTFS 甚至不需要知道已啟用 BitLocker。不過,如果您嘗試從 Windows 以外讀取磁碟區的資料,它看起來會像是隨機資料。

FVEK 會以磁碟區主要金鑰 (VMK) 加密並儲存在磁碟區的特殊中繼資料區域內。當您設定 BitLocker 時,視系統的硬體功能而定,有一些選項可供您選擇保護 VMK 的方式。如果系統含有符合 1.2 版 TPM 規格的可信賴平台模組 (TPM),並且有相關聯的 BIOS 支援,您就可以使用 TPM 加密 VMK,讓系統使用儲存在 TPM 的金鑰和儲存在 USB Flash 裝置上的金鑰來加密 VMK,或者使用 TPM 儲存的金鑰和您在系統開機時輸入的 PIN 來加密此金鑰。對於沒有 TPM 的系統,BitLocker 可讓您使用儲存在外接式 USB Flash 裝置上的金鑰來加密 VMK。無論如何,您將需要未加密的 1.5GB NTFS 系統磁碟區,即儲存開機管理程式和開機設定資料庫 (BCD) 的磁碟區。

使 用 TPM 的優點是,BitLocker 會使用 TPM 功能來確保它不會將 VMK 解密,如果 BIOS 或系統開機檔在啟用 BitLocker 之後有變更過,它會將開機磁碟區解除鎖定。第一次將系統磁碟區加密之後,每次執行上述任何元件的更新時,BitLocker 便會計算這些元件的 SHA-1 雜湊,並在 TPM 裝置驅動程式 (%Systemroot%\System32\Drivers\Tpm.sys) 的幫助之下,以 TPM 的不同平台設定暫存器 (PCR) 儲存每一個雜湊,稱為度量。然後,它會使用 TPM 密封 VMK,這是使用儲存在 TPM 中的私密金鑰為 VMK 加密的一項作業,而 BitLocker 會把儲存在 PCR 的值連同其他資料一起傳遞至 TPM。然後 BitLocker 會將密封的 VMK 和加密的 FVEK,都儲存在磁碟區的中繼資料區域中。

當系統開機時,它 會測量自己的雜湊和 PCR 載入程式碼,並將雜湊寫入至 TPM 的第一個 PCR。然後,它會雜湊 BIOS 並將該度量儲存在適當的 PCR 中。接著會由 BIOS 雜湊開機程序的下一個元件,即開機磁碟區的主開機記錄 (MBR),此處理程序將繼續進行,直到完成作業系統載入程式的測量為止。每一個後續執行的程式碼片段,各負責測量它載入的程式碼,並將測量結果儲存到 TPM 中的適當暫存器。最後,當使用者選取開機的作業系統時,開機管理程式 (Bootmgr) 會從磁碟區中讀取加密的 VMK,並要求 TPM 將它解除密封。唯有當所有測量結果都與密封的 VMK 一樣時 (包括選用的 PIN),TPM 才能順利將 VMK 解密。

您 可以將此配置想像成一個驗證鏈,即開機程序中的每一個元件都會向 TPM 描述下一個元件。唯有當所有描述都符合其原始描述時,TPM 才會洩露它的秘密。因此,即使磁碟被移到另一個系統中、使用不同的作業系統開機,或開機磁碟區上的未加密檔案可能洩漏時,BitLocker 也會保護加密的資料。


程式碼完整性驗證

以 核心模式裝置驅動程式實作的惡意程式,包括 rootkits 在內,會在與核心相同的特殊權限層級上執行,因此最難以識別和移除。這種惡意程式會修改核心和其他驅動程式的行為,使自己幾乎成了隱形。Windows Vista 核心模式程式碼的程式碼完整性功能,亦稱為核心模式程式碼簽署 (KMCS) 功能,只允許下載由特定憑證授權單位 (CA) 驗證過其資格的開發者所發佈並具備數位簽章的裝置驅動程式。根據預設,在 Windows Vista 64 位元系統上會強制實施 KMCS。

因 為憑證授權單位的服務需要收費,並且會執行基本背景檢查 (例如公司諮詢調查),因此要產生在 64 位元 Windows Vista 上執行的匿名核心模式惡意軟體難上加難。此外,有更多機制可以在萬一惡意軟體瞞過驗證處理程序時留下線索,當受入侵的系統上發現到惡意軟體時,便可追蹤到 惡意軟體的作者。KMCS 也有次要用途,例如當懷疑驅動程式可能有問題而導致客戶系統毀損時,它會提供 Windows Online Crash Analysis 小組聯絡資訊,還有它會解除鎖定高畫質多媒體內容,這點我將會在稍後說明。

KMCS 使用 Windows 已運用了十年以上的公開金鑰加密技術,並要求核心模式程式碼要包含由信任的憑證授權單位之一產生的數位簽章。如果發行者送出驅動程式給 Microsoft Windows Hardware Quality Laboratory (WHQL),且該驅動程式通過可靠性測試,則 Microsoft 即成為簽署程式碼的憑證授權單位。大部分發行者會透過 WHQL 取得簽章,但是當驅動程式沒有 WHQL 測試程式、發行者不想將驅動程式送至 WHQL 測試,或該驅動程式是在系統啟動初期就載入的開機啟動驅動程式時,發行者就必須自行簽署程式碼。若要這麼做,發行者必須先從 Microsoft 認定為可信任的核心模式程式碼簽署授權單位,取得程式碼簽署憑證。然後作者需要以數位方式雜湊程式碼,並以私密金鑰將它加密後簽署雜湊,然後在程式碼中加 入憑證和加密雜湊。

當驅動程式試圖載入時,Windows 會使用儲存在憑證中的公開金鑰,將程式碼包含的雜湊解密,然後驗證該雜湊是否符合程式碼包含的雜湊。憑證的真實性也是以相同方式檢查,但是會使用 Windows 包含的憑證授權單位公開金鑰。

Windows 也會檢查相關聯的憑證鏈,最高達到內嵌於 Windows 開機載入程式和作業系統核心的根憑證授權單位之一。請勿嘗試在實際執行的系統上載入未簽署的 64 位元驅動程式,因為 64 位元 Windows Vista 的作法與 Plug and Play Manager 不同,不會在載入的驅動程式沒有可確認它已通過 WQHL 測試的簽章時顯示警告對話方塊,而是每當它阻擋未簽署的驅動程式載入時,只會直接在幕後自動將事件寫入程式碼完整性應用程式事件記錄檔,如 [圖 5] 所顯示。32 位元 Windows Vista 也會檢查驅動程式簽章,但允許未簽署的驅動程式載入。這是因為阻擋這些驅動程式會造成 Windows XP 系統無法升級,這些系統需要當初已載入至 Windows XP 的驅動程式,而且也才能支援目前只有 Windows XP 驅動程式的硬體。不過,當 32 位元 Windows Vista 載入未簽署的驅動程式時,也會將事件寫入程式碼完整性事件記錄檔中。

















圖 5
嘗試載入未簽署之驅動程式的事件 (Click the image for a larger view)

由於程式碼的簽署一般是用來標示程式碼為已通過嚴格測試的正式版,所以發行者通常不會想要簽署測試程式碼。因此,Windows Vista 包含一種測試簽署模式,您可以利用 Bcdedit 工具 (描述於我在 2007 年 3 月發佈的 TechNet Magazine 文章) 來啟用及停用此模式,此工具會載入以內部憑證授權單位產生的測試憑證數位簽署過的核心模式驅動程式。此模式是給程式設計師在開發程式碼時使用的。當 Windows 處於此模式時,它會在桌面上顯示記號,如 [圖 6] 所示。





圖 6 Windows Vista 測試簽署模式




受保護的處理程序

新 一代多媒體內容,如 HD-DVD、BluRay 和進階存取內容系統 (Advanced Access Content System,AACS) 授權的其他格式,在未來幾年會變得更為普遍。Windows Vista 包含一些統稱為受保護媒體路徑 (Protected Media Path,PMP) 的技術,AACS 標準需要這些技術才能播放此種內容。PMP 包括受保護使用者模式音訊 (Protected User-Mode Audio,PUMA) 和受保護視訊路徑 (Protected Video Path,PVP),它們共同提供音訊和視訊驅動程式以及媒體播放應用程式的機制,以防止未授權軟體或硬體擷取高畫質內容。

PUMA 和 PVP 定義音訊和視訊播放程式、裝置驅動程式及硬體專用的介面和支援,但 PMP 也仰賴 Windows Vista 引進的一般核心機制,稱為受保護的處理程序。受保護的處理程序是以標準 Windows 處理程序建構為基礎,此建構會封裝執行中的可執行檔映像、它的 DLL、安全性內容 (用來執行此處理程序的帳戶和其安全性特殊權限) 及在處理程序內執行程式碼但會防止特定存取類型的執行緒。

標 準處理程序會實作一個存取控制模型,以提供處理程序的擁有者和具有偵錯程式特殊權限的系統管理帳戶完整存取權。完整存取權可讓使用者檢視及修改處理程序的 位址空間,包括對應至處理程序的程式碼和資料。使用者也可以將執行緒插入至處理程序。這些存取類型與 PMP 的需求並不一致,因為它們允許未授權的程式碼存取高畫質內容,以及儲存在播放此內容之處理程序中的數位版權管理 (Digital Rights Management,DRM) 金鑰。

受保護的處理程序會限 制存取範圍,僅允許一組有限的資訊介面和處理程序管理介面,包括查詢處理程序的映像名稱及終止或暫停處理程序。但是核心使受保護的處理程序的診斷資訊可透 過一般處理程序查詢功能取得,這些查詢功能會傳回關於系統上所有處理程序的資料,因此並不需要直接存取處理程序。只有其他受保護的處理程序才能夠存取媒 體,以防媒體受到危害。

此外,為了防止造成內部危害,所有載入 至受保護處理程序的可執行檔程式碼,包括可執行檔映像和 DLL 在內,都必須由具有受保護環境 (PE) 旗標的 Microsoft (WHQL) 簽章,如果是音訊轉碼器,則必須由具有來自 Microsoft 之 DRM 簽署憑證的開發人員簽章才行。由於核心模式程式碼可取得任何處理程序的完整存取權,包括受保護的處理程序在內,且 32 位元 Windows 允許未簽署之核心模式程式碼的載入,所以,核心會提供 API 給受保護的處理程序,以查詢核心模式環境的「潔淨度」,唯有未載入未簽署的程式碼時,它才會利用查詢結果將優質內容解除鎖定。


識別受保護的處理程序

目 前沒有可以特別識別受保護處理程序的 API,但您可以根據可用的有限資訊以及即使從系統管理帳戶也無法對它們進行偵錯的方式,進行間接識別。Audio Device Graph Isolation 處理程序 (%Systemroot%\System32\Audiodg.exe) 是用來播放以 Content Scramble System (CSS) 編碼的 DVD,它在 [工作管理員] 窗格中可識別為受保護的處理程序,這是因為 [工作管理員] 無法取得它的命令行、虛擬化及資料執行防止狀態,即使是以系統管理權限執行也一樣。





在 [工作管理員] 中檢視 audiodg 受保護處理程序 (Click the image for a larger view)


位址空間隨機載入

儘管有資料執行防止和增強型編譯器錯誤檢查之類的功能,惡意軟體作者仍然繼續找到緩衝區溢位弱點,讓他們能夠感染各種網路處理程序,例如 Internet Explorer®、Windows 服務及協力廠商應用程式,而得以入侵系統。不過,一旦他們感染了處理程序之後,就必須使用 Windows API 完成其終極目標,亦即讀取使用者資料,或修改使用者或系統設定來建立永久身分。

連 接應用程式與 DLL 匯出的 API 進入點,通常是由作業系統載入程式進行處理,但是此類型的惡意軟體病毒將無法利用載入程式的服務。舊版的 Windows 上並無法避免惡意軟體造成問題,因為不論是哪一版的 Windows,系統可執行檔映像和 DLL 一律載入至相同位置,因此惡意軟體可以輕鬆假設 API 是位於固定位址。

Windows Vista 位址空間隨機載入 (ASLR) 功能,會使惡意軟體無法得知 API 的位置,因為每次系統開機時,會將系統 DLL 和可執行檔載入至不同的位置。在開機程序初期,記憶體管理員會從使用者模式位址空間頂端的 16MB 區域中的 256 個 64KB 對齊位址之一的偏差,挑選隨機的 DLL 映像載入。隨著映像標頭具有新動態重新定位旗標的 DLL 載入到處理程序中,記憶體管理員會從映像載入偏差位址開始往下,將它們封裝到記憶體中。

已設定旗標的可執行檔也會採取類似的處理方式,在其映像標頭所儲存的基本載入位址的 16MB 內的一個隨機 64KB 對齊點載入。此外,如果給定的 DLL 或可執行檔被所有使用它的處理程序卸載之後又再度載入,記憶體管理員會重新選取一個隨機位置來載入。[圖 7] 顯示 32 位元 Windows Vista 系統的範例位址空間配置,其中包含會由 ASLR 挑選映像載入偏差和可執行檔載入位址的區域。















圖 7
ASLR 對可執行檔和 DLL 載入位址的影響 (Click the image for a larger view)

唯有具有動態重新定位旗標的映像,包括所有 Windows Vista DLL 和可執行檔在內,才會重新定位,因為如果移動舊版映像會導致內部錯誤,畢竟開發人員對於其映像載入位置當初有固定的假設。Visual Studio® 2005 SP1 新增了設定旗標的支援,使協力廠商開發人員也可以充分利用 ASLR。

將 DLL 載入位址隨機化為 256 個位置之一,雖然不能完全杜絕惡意軟體猜出 API 的正確位置,但是可以嚴重妨礙網路蠕蟲的傳播速度,並且可防止只會嘗試感染系統一次之惡意軟體的運作。此外,ASLR 的重新定位策略還有第二項優點,即位址空間比舊版的 Windows 更緊密壓縮,這不僅可為連續記憶體配置製造更大的可用記憶體區域,還可以減少記憶體管理員為追蹤位址空間配置而配置的分頁表數目,並且可使轉譯對應緩衝區 (Translation Lookaside Buffer,TLB) 的失誤減至最少。


服務安全性的改進

Windows 服務是惡意軟體的理想目標。因為許多服務都提供透過網路存取的功能,這可能使系統曝露在遠端存取的攻擊之下,而且大部分服務是以比標準使用者帳戶更高的特 殊權限來執行,萬一它們受到惡意軟體入侵,將提供機會提高本機系統的特殊權限。因此,Windows 開始隨著 Windows XP SP2 所做的變更演進,將指派給服務的特殊權限及存取權減少為只限於其角色需要的那些權限。例如,Windows XP SP2 推出的本機服務和網路服務帳戶,如今只包括本機系統帳戶的部分特殊權限子集 (先前的服務一律以此帳戶的完整權限執行)。這可在萬一攻擊者破解服務時,將可運用的存取權減至最少。


見識 ASLR 的運作

您可以在兩個不同的開機工作階段中,使用像 Process Explorer from Sysinternals 之類的工具來比較處理程序的 DLL 載入位址,如此即可見識到 ASLR 的作用。這兩個擷取畫面是從兩個不同的工作階段產生的,第一個是 Ntdll.dll 載入至檔案總管的位址 0x77A30000,後來則載入至位址 0x77750000。




ntdll.dll 載入不同的基本位址 (Click the image for a larger view)


在前一篇文章中,我描述過服務如何與使用者帳戶分開,在自己的工作階段中執行,但 Windows Vista 更擴大使用其最低權限原則,進一步減少指派給大部分服務的檔案、登錄機碼和防火牆連接埠的特殊權限和存取權。Windows Vista 定義了一個新的群組帳戶,稱為服務安全性識別元 (SID),每一項服務都會有唯一的 SID。服務可對其資源設定權限,以限定只有它的服務 SID 有存取權,如此一來,當服務被破解時,可防止以相同使用者帳戶執行的其他服務也具有存取權。使用 sc showsid 命令並在其後提供服務名稱,即可看到服務的 SID,如 [圖 8] 所示。







圖 8 檢視服務的 SID (Click the image for a larger view)

服務 SID 可保護對特定服務所擁有之資源的存取權,但根據預設,服務對於執行它們的使用者帳戶可存取的所有物件仍然具有存取權。例如,以本機服務帳戶執行的服務,可 能無法存取在不同處理程序中,以本機服務執行的另一個服務所建立的資源,該服務已使用參照服務 ID 的權限保護其物件,不過,它仍然可以讀取及寫入本機服務 (以及本機服務所屬的任何群組,如服務群組) 具有權限的任何物件。

因 此,Windows Vista 引進了一個新的限制服務類型,叫做寫入限制服務,它只允許服務對於可存取其服務 SID、Everyone 群組和已指派給登入工作階段之 SID 的物件具有寫入權。為了達成此目的,它使用限制的 SID,這是曾經在 Windows 2000 引進的 SID 類型。當開啟物件的處理程序屬於寫入限制的服務時,存取檢查演算法就會變更,因此無法使用尚未以限制和無限制形式指派給處理程序的 SID 來授與處理程序對物件的寫入權。您可以使用下列命令來了解服務是否受限制:

sc qsidtype [service]

此外還有另一項變更,可以使服務輕易防止以 相同帳戶執行的其他服務,存取前者所建立的物件。在舊版的 Windows 中,物件的建立者也是物件的擁有者,擁有者有能力讀取及變更其物件的權限,讓他們對其擁有之物件具有完整存取權。Windows Vista 則引進了新的擁有者權限 SID,此 SID 若存在於物件的權限中,可限制擁有者對其擁有之物件的存取權,甚至移除設定及查詢權限的權利。

Windows Vista 中的服務安全性模式的另一項增強功能,可讓服務開發人員確實指定服務在系統上註冊時需要操作的安全性特殊權限。例如,如果服務需要產生稽核事件,它可以列出稽核特殊權限。

當 服務控制管理員啟動一項處理程序來裝載一項或多項 Windows 服務時,會為處理程序建立只包含服務在處理程序中所需之特殊權限的安全性權杖 (列出處理程序使用者帳戶、群組成員資格和安全性特殊權限的核心物件)。如果服務指定的特殊權限無法供執行該服務的帳戶使用,則該服務將無法啟動。例如, 在本機服務帳戶處理程序中執行的任何服務,如果都不需要偵錯程式特殊權限,服務控制管理員就會從處理程序的安全性權杖中移除該特殊權限。因此,如果服務處 理程序受到破解,惡意程式碼將無法利用在處理程序中執行的服務未具備的特殊權限。sc qprivs 命令可報告服務所要求的特殊權限。


結論

以 下是我對這三篇 Windows Vista 核心變更文章的總結。我必須先聲明,還有一些我並未討論到或提及的功能和改進項目,例如適用於應用程式開發人員的新工作者執行緒集區、新的同步處理機制 (例如共用讀取器/寫入器鎖定機制)、服務執行緒標記、對線上 NTFS 磁碟檢查和磁碟區調整大小功能的支援,以及一個叫做進階本機程序呼叫 (Advanced Local Procedure Call,ALPC) 的新核心 IPC 機制。如需這些功能和其他功能的詳細資訊,請參閱下一期的 Windows Internals (預定將在 2007 年年底之前發行)。




檢視寫入限制服務

Windows Vista 上只有一項服務裝載處理程序會裝載限制的服務,您可以使用像 Process Explorer 之類的處理程序檢視工具來識別它,其中會含有下列命令行:

svchost -k LocalServiceNoNetwork

設定為在此處理程序中執行的服務包括:基礎篩選引擎、診斷原則服務、Windows 防火牆、效能記錄及警示,以及 Windows Media® Center Service Starter。

此 畫面顯示基礎篩選引擎服務 SID 的文字形式 (NT SERVICE\BFE),第一次列出時含有限制旗標,再次列出時沒有限制旗標,因此,處理程序對該帳戶可存取的資源具有存取權。不過,對於本機服務帳戶 一般可存取的其他物件,它不一定有存取權。例如,由於 NT AUTHORITY\SERVICE 帳戶沒有出現在具有限制旗標的處理程序權杖中,所以該處理程序將無法修改只授與寫入權給該帳戶,而不授與寫入權給權杖中含有限制旗標的其他帳戶的物件。

在此處理程序中執行的服務也有特殊權限的限制,因為列示在內容對話方塊底端的特殊權限,僅為本機服務帳戶可用之特殊權限的子集。



























服務的 SID 旗標
(Click the image for a larger view)


Related Articles From TechNet Magazine: