Windows Vista通過許多新功能和改進提高了系統的可靠性和您對系統與應用程序問題的診斷能力。例如,內核Windows事件跟蹤 (ETW) 記錄程序總是處於運行狀態,能夠生成有關文件、注冊表、中斷以及其他活動類型的跟蹤事件,並保存在循環緩沖區中。當出現問題時,新的 Windows 診斷基礎結構 (WDI) 會捕獲緩沖區快照,並進行本地分析或上載到 Microsoft 支持進行故障排除。
新的 Windows 性能和穩定性監視器可以幫助用戶通過更改系統配置將錯誤(如崩潰和掛起)相互關聯。強大的系統修復工具 (SRT) 取代了故障恢復控制台,用於不可啟動系統的離線恢復。
有三個方面依靠對系統進行的內核級更改,即需要您認真閱讀的本文中的以下方面:內核事務管理器 (KTM)、改進的崩潰處理和以前的版本。
1.內核事務管理器
軟件開發中最繁瑣的一個方面就是處理錯誤條件。特別是在進行高級操作的過程中,應用程序完成了一個或多個導致文件系統或注冊表更改的子任務。例如,應用程序的軟件更新服務可能要進行幾次注冊表更新,替換應用程序的可執行文件之一,而在它嘗試更新第二個可執行文件時被拒絕訪問。如果服務不想將應用程序留在因此導致的不一致狀態,就必須跟蹤所有更改並為撤銷它們做好准備。測試錯誤恢復代碼很困難,並經常跳過,因此恢復代碼中的錯誤會讓努力徒勞無功。
為 Windows Vista 編寫的應用程序通過使用 NTFS 中新的事務支持和使用內核事務管理器的注冊表,不費吹灰之力即可獲得自動錯誤恢復能力。當應用程序想進行許多相關更改時,可以創建分布式事務處理協調器 (DTC) 事務和 KTM 事務處理,或直接創建 KTM 處理,並將對文件和注冊表項的修改與事務關聯起來。如果所有的更改成功,應用程序會提交事務同時更改生效,但是在此之前任何時候,應用程序可以回滾事務,然後放棄更改。
其有利因素在於,其他應用程序在提交事務後才能看到事務中的更改,而在 Windows Vista 和即將問世的 Windows Server(代號名為“Longhorn”)中使用 DTC 的應用程序會通過 SQL Server、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 都依賴在 Windows Server 2003 R2 中引入的公用日志文件系統或 CLFS (%SystemRoot%\System32\Clfs.sys) 的高速文件系統記錄功能。TxR 和 TxF 使用 CLFS 永久性地存儲提交事務之前的事務狀態更改。這樣可以讓它們提供事務恢復並確保即使在斷電時也可以恢復。除了 CLFS 日志,TxR 還創建了一組相關的日志文件,跟蹤 %Systemroot%\System32\Config\Txr 中系統注冊表文件的事務更改(如圖 1 所示),同時還為每個用戶注冊表配置單元單獨創建幾組日志文件。TxF 在名為 \$Extend\$RmMetadata 的卷的隱藏目錄中存儲每個卷的事務數據。
2.增強的崩潰支持
當 Windows 遇到不可恢復的內核模式錯誤時(無論是由於設備驅動程序錯誤、硬件故障還是操作系統問題),在出現“藍屏死機”現象和將物理內存的部分或所有內容寫入崩潰轉儲文件(如果配置為執行此操作)後,它會嘗試終止系統來防止磁盤數據的損壞。轉儲文件非常有用,因為當您在系統崩潰後重啟時,Microsoft 在線崩潰分析 (OCA) 服務會分析這些文件找出根本原因。如果願意,您也可以使用面向 Windows 的 Microsoft 調試工具自已進行分析。
不過,在以前的 Windows 版本中,只有在會話管理器 (%Systemroot%\System32\Smss.exe) 進程初始化分頁文件後才會啟用對崩潰轉儲文件的支持。這意味著在此之前任何嚴重錯誤會導致藍屏,但沒有轉儲文件。由於在 Smss.exe 啟動之前,會出現大量的設備驅動程序初始化,所以早期的崩潰永遠不會引起崩潰轉儲,因此使原因診斷極為困難。
在所有引導啟動設備驅動程序初始化之後,但在系統啟動驅動程序加載之前,Windows Vista 通過初始化轉儲文件支持,可減少無轉儲文件生成的時間窗口。由於這一更改,如果在引導過程開始時出現崩潰,系統就可以捕捉崩潰轉儲,讓 OCA 幫助您解決問題。此外,Windows Vista 使用 64KB 塊將數據存儲到轉儲文件中,而以前的 Windows 版本使用 4KB 塊寫入文件。這一更改使得大型轉儲文件的寫入速度最多可提高 10 倍。
應用程序崩潰處理功能在 Windows Vista 中也得以改進。在以前的 Windows 版本中,當應用程序崩潰時,它會執行未處理的異常處理程序。處理程序啟動 Microsoft 應用程序錯誤報告 (AER) 進程 (%Systemroot%\System32\Dwwin.exe),顯示對話框,指明程序崩潰,並詢問您是否要向 Microsoft 發送錯誤報告。不過,如果崩潰時進程主線程的堆棧損壞,未處理的異常處理程序執行時會崩潰,導致內核終止進程、程序窗口立即消失,並且沒有錯誤報告窗口。
Windows Vista 將錯誤處理從崩潰進程的上下文移至新服務,即 Windows 錯誤報告 (WER)。此服務由服務托管進程中的 DLL (%Systemroot%\System32\Wersvc.dll) 實施。在應用程序崩潰時,它仍然會執行未處理的異常處理程序,但是該處理程序會向 WER 服務發送消息,並且服務會啟動 WER 錯誤報告進程 (%Systemroot%\System32\Werfault.exe) 以顯示錯誤報告對話框。如果堆棧損壞並且未處理的異常處理程序崩潰,處理程序會再次執行並且再次崩潰,最終消耗所有線程的堆棧(使用內存區域),此時內核會介入,並向服務發送崩潰通知消息。
3.卷影復制
Windows XP 引入了一種稱為卷影復制的技術,可生成磁盤卷的時間點快照。備份應用程序可以使用這些快照生成一致的備份映像,但是快照卻被從視圖中隱藏,並僅保持備份過程所持續的時間。
快照實際上並不是卷的完整副本。更確切地講,它們是較早還原點的卷視圖,由與卷扇區副本(在生成快照後已更改)重疊的活動卷數據組成。卷快照提供程序的驅動程序 (%Systemroot\%System32\Drivers\Volsnap.sys) 監視針對卷的操作,備份扇區副本後才允許扇區更改,將與快照相關的文件中的原始數據存儲到卷的 System Volume Information 目錄中。
Windows Server 2003 使用其共享文件夾的影副本對服務器上的管理員和客戶端系統上的用戶公開快照管理。此功能啟用了持續快照,用戶可通過 Explorer 屬性對話框中的“以前的版本”選項卡訪問它,因為其文件夾和文件位於服務器的文件共享部分。
Windows Vista“以前的版本”功能為所有客戶端系統提供了此支持,即自動創建卷快照(通常每天一次),您可以通過使用共享文件夾影副本所用的相同界面的 Explorer 屬性對話框訪問快照。這樣可讓您查看、還原或復制您可能意外修改或刪除的文件和目錄的舊版本。雖然從技術角度來講這並不是新技術,但 Windows Vista“以前的版本”實施的卷影復制優化了 Windows Server2003在客戶端桌面環境中使用的功能。
Windows Vista 還充分利用了卷快照,以統一用戶和系統數據保護機制,避免保存冗余的備份數據。當應用程序安裝或配置更改造成錯誤或不合需要的行為時,您可以使用“系統還原”(在 Windows NT® 系列的操作系統 Windows XP 中引入的一項功能)將系統文件和數據還原成創建還原點時其存在的狀態。
在 Windows XP 中,“系統還原”使用文件系統過濾器驅動程序(可以看到在文件級別的更改的一種驅動程序類型)在系統文件更改時備份其副本。在 Windows Vista 中,“系統還原”使用卷快照。當您在 Windows Vista 中使用“系統還原”用戶界面返回到還原點時,您實際上是從與活動卷的還原點關聯的快照復制已修改的系統文件的較早版本。
4.BitLocker
Windows Vista 是迄今為止最安全的 Windows 版本。除了包含 Windows Defender 反間諜軟件引擎外,Windows Vista 還引入了大量的安全和縱深防御功能,包括 BitLocker™ 整卷加密功能、內核模式代碼的代碼簽名、受保護的進程、地址空間加載隨機化以及對 Windows 服務安全和用戶帳戶控制的改進。
操作系統在運行時只能增強其安全策略,因此當系統的物理安全可能受到危害和從操作系統之外訪問數據時,您必須采取其他措施保護數據。諸如 BiOS 密碼和加密的基於硬件的機制,是通常用來防止未經授權進行訪問的兩種技術,尤其是便攜式計算機,最有可能丟失或被盜。
Windows 2000 引入了加密文件系統 (EFS),並且在其 Windows Vista 體現中,EFS 包括了對以前實施功能的許多改進,包括性能改進、支持分頁文件的加密和在智能卡上存儲用戶 EFS 密鑰。不過,您無法使用 EFS 保護對系統敏感區域的訪問,如注冊表配置單元文件。例如,如果組策略允許您登錄到便攜式計算機(甚至在沒有連接到域時),您的域憑據驗證程序會在注冊表中緩存,因此攻擊者可以使用工具獲取您的域帳戶密碼哈希,並用來嘗試使用密碼破解程序獲取您的密碼。密碼會讓他們有權訪問您的帳戶和 EFS 文件(假設您沒有把 EFS 密鑰存儲在智能卡上)。
為了易於加密整個引導卷(包含 Windows 目錄的卷),包括其所有系統文件和數據,Windows Vista 引入了整卷加密功能,稱為 Windows BitLocker 驅動器加密。與由 NTFS 文件系統驅動程序實施並在文件級別操作的 EFS 不同,BitLocker 在卷級別使用整卷加密 (FVE) 驅動程序 (%Systemroot%\System32\Drivers\Fvevol.sys) 進行加密,如圖 4 中圖解所示。
FVE 是過濾器驅動程序,因此它會自動查看 NTFS 發送到卷的所有 I/O 請求,在其寫入時加密塊,在其讀取時(在初始配置使用 BitLocker 時,會使用分配到塊的完整卷加密密鑰 (FVEK) 讀取它們)解密塊。默認情況下,使用 128 位 AES 密鑰和 128 位擴散器密鑰加密卷。因為加密和解密發生在 I/O 系統的 NTFS 之下,所以卷在 NTFS 看來好象沒有加密,並且 NTFS 甚至不需要知道已啟用了 BitLocker。不過,如果您嘗試從 Windows 外讀取卷上的數據,它又看來象是隨機數據。
FVEK 使用卷主密鑰 (VMK) 加密,並存儲在卷的特殊元數據區域。當您配置 BitLocker 時,會有許多關於如何保護 VMK 的選項,取決於系統的硬件功能。如果系統有符合 TPM 規范 v1.2 的受信任的平台模塊 (TPM),並有相關的 BiOS 支持,則您可以使用 TPM 加密 VMK(讓系統使用存儲在 TPM 中的密鑰或存儲在 USB 閃存設備中的密鑰加密 VMK),或使用 TPM 存儲的密鑰和在系統啟動時輸入的 PIN 加密密鑰。對於沒有 TPM 的系統,BitLocker 提供使用存儲在外部 USB 閃存設備中的密鑰加密 VMK 的選項。在任何情況下,您都需要一個未加密的 1.5GB NTFS 系統卷,在該卷中存儲了啟動管理器和引導配置數據庫 (BCD)。
使用 TPM 的優勢在於,如果 BiOS 或系統啟動文件在啟用 BitLocker 後做出更改,BitLocker 會使用 TPM 功能確保不解密 VMK 和解除對引導卷的鎖定。當您第一次加密系統卷,以及每次對提及的所有組件執行更新時,BitLocker 會借助於 TPM 設備驅動程序 (%Systemroot%\System32\Drivers\Tpm.sys) 計算這些組件的 SHA-1 哈希,並將稱為測量的每個哈希存儲到不同的 TPM 平台配置注冊表 (PCR)。接下來,它使用 TPM 密封 VMK,該操作使用存儲在 TPM 中的私鑰加密 TPM 和與 BitLocker 傳遞到 TPM 的其他數據一起存儲在 PCR 中的值。然後,BitLocker 將密封的 VMK 和加密的 FVEK 存儲在卷的元數據區域。
當系統啟動時,它會測量自己的哈希和 PCR 加載代碼,並將哈希寫入 TPM 的第一個 PCR。然後,它哈希 BIOS,並將該測量存儲到相應的 PCR。接下來,BiOS 按啟動序列哈希下一個組件,即引導卷的主引導記錄 (MBR),此過程會一直繼續,直到測量操作系統加載器。運行的每個後續代碼段負責測量其加載的代碼,並將測量結果存儲到 TPM 中相應的注冊表。最後,當用戶選擇要啟動哪個操作系統時,啟動管理器 (Bootmgr) 會從卷讀取加密的 VMK,並要求 TPM 取消密封。只有所有測量與密封 VMK 時相同時(包括可選的 PIN),TPM 才成功解密 VMK。
您可以考慮將此方案作為驗證鏈,其中啟動序列中的每個組件會描述 TPM 的下一個組件。只有所有描述與提供的原始描述相符時,TPM 才洩露其秘密。因此,即使卸下磁盤並裝到其他系統、使用不同的操作系統啟動系統或引導卷上未加密文件遭到破壞,BitLocker 也會保護加密數據。
5.代碼完整性驗證
作為內核模式設備驅動程序執行的惡意軟件(包括 rootkit)與內核在相同的權限級別運行,因此最難識別和刪除。這類惡意軟件可以修改內核和其他驅動程序的行為,以便使其變得不可見。內核模式代碼功能的 Windows Vista 代碼完整性,也稱為內核模式代碼簽名 (KMCS),僅允許加載由開發人員發布和經過數字簽名的設備驅動程序,這些開發人員已經過為數不多的證書頒發機構 (CA) 之一的審查。默認情況下,KMCS 在 Windows Vista 64 位系統上強制執行。
因為證書頒發機構會對其服務收取費用並進行基本的背景檢查,如驗證業務識別,所以很難產生在 64 位 Windows Vista 上運行的匿名內核模式惡意軟件。此外,設法溜過驗證進程的惡意軟件可能會留下線索,這些線索在受到危害的系統發現惡意軟件時,可以反擊作者。KMCS 還有一些次要的用途,如在懷疑驅動程序有使客戶系統崩潰的錯誤和解除高清晰度多媒體內容鎖定(我會在稍後簡單介紹)時,會向 Windows 在線崩潰分析團隊提供聯系信息。
KMCS 使用 Windows 十多年來一直采用的公鑰加密技術,並要求內核模式代碼包括由受信任證書頒發機構之一生成的數字簽名。如果發布者將驅動程序提交給 Microsoft Windows 硬件質量實驗室 (WHQL),並且驅動程序通過了可靠性測試,則 Microsoft 會充當簽署代碼的證書頒發機構。大多數發布者將通過 WHQL 獲得簽名;但是如果驅動程序沒有 WHQL 測試程序,發布者不想提交到 WHQL 測試,或者驅動程序是在系統啟動早期加載的引導啟動驅動程序,則發布者必須自己簽署代碼。為此,他們必須首先從 Microsoft 確定為受信任內核模式代碼簽名的證書頒發機構之一獲得代碼簽名證書。然後,作者通過數字方式哈希代碼,通過使用私鑰進行加密來簽署哈希,並將證書和加密的哈希包含在代碼中。
當驅動程序嘗試加載時,Windows 會使用存儲在證書中的公鑰解密包含在代碼中的哈希,然後驗證哈希與代碼中包含的哈希是否匹配。證書的真實性也通過相同的方式進行檢查,但使用 Windows 附帶的證書頒發機構的公鑰。
Windows 還檢查相關的證書鏈,一直檢查到 Windows 啟動加載器和操作系統內核中嵌入的根頒發機構之一。嘗試加載未簽名的 64 位驅動程序不應該發生在生產系統,因此不同於“即插即用”管理器(它在指向加載沒有確認是否通過 WQHL 測試簽名的驅動程序時顯示警告對話框),64 位 Windows Vista 在阻止加載未簽名驅動程序時,在無提示的情況下隨時將事件寫入代碼完整性應用程序事件日志,如圖 5 所示。32 位 Windows Vista 也檢查驅動程序簽名,但允許加載未簽名的驅動程序。阻止它們將會破壞升級的 Windows XP 系統(要求在 Windows XP 上加載驅動程序,並且還允許支持僅存在 Windows XP 驅動程序的硬件)。不過,32 位 Windows Vista 還會在加載未簽名驅動程序時將事件寫入代碼完整性事件日志。
因為代碼簽名通常用來將代碼標記為經過嚴格測試的官方發行版本,所以發布者通常並不想對測試代碼簽名。因此,Windows Vista 包括可以使用 Bcdedit 工具(在 TechNet 雜志 2007 年 3 月份我的文章中介紹過)啟用和禁用的測試簽名模式,它將加載使用由內部證書頒發機構生成的測試證書經過數字簽名的內核模式驅動程序。此模式設計為供程序員在開發其代碼時使用。當 Windows 處於此模式時,它會在桌面上顯示標記,如圖中所示。
6.受保護的進程
下一代多媒體內容,如 HD-DVD、BluRay 和高級訪問內容系統 (AACS) 下許可的其他格式,在以後幾年內會變得更加常見。Windows Vista 包括許多技術,統稱為受保護的媒體路徑 (PMP),AACS 標准要求在播放此類內容時使用這些技術。PMP 包括受保護的用戶模式音頻 (PUMA) 和受保護的視頻路徑 (PVP),它們一直為音頻和視頻驅動程序及媒體播放機應用程序提供機制,以防止未授權軟件或硬件捕獲高清晰度格式的內容。
PUMA 和 PVP 定義特定於音頻和視頻播放機、設備驅動程序和硬件的接口和支持,但是 PMP 也依賴在 Windows Vista 中引入的一般內核機制,即稱為受保護的進程。受保護的進程以標准的 Windows 進程構造為基礎,該構造封裝了運行的可執行映像、其 DLL、安全上下文(進程運行所在的帳戶及其安全權限),及在進程內執行代碼但阻止某些訪問類型的線程。
標准進程實施訪問控制模式,允許使用“調試程序”權限完全訪問進程所有者和管理帳戶。完全訪問允許用戶查看和修改進程的地址空間,包括映射到進程的代碼和數據。用戶也可以將線程注入進程。這些訪問類型與 PMP 的要求不一致,因為它們允許未授權代碼獲取存儲在播放內容的進程中的高清晰度內容和數字版權管理 (DRM) 密鑰的訪問權限。
受保護的進程限制訪問一組受限的信息和進程管理界面,包括查詢進程的映像名和終止或掛起進程。但是,內核通過一般的進程查詢功能(返回有關系統上所有進程的數據)為受保護的進程提供診斷信息,因此不要求直接訪問進程。訪問可能會損壞只允許通過其他受保護的進程訪問的媒體。
此外,為避免從內部受到危害,加載到受保護進程的所有可執行代碼(包括其可執行映像和 DLL)必須由 Microsoft (WHQL) 使用受保護的環境 (PE) 標記簽名,或者(如果是音頻編解碼器)由開發人員使用從 Microsoft 獲得的 DRM 簽名證書簽名。因為內核模式代碼可以獲取任何進程的完全訪問權限(包括受保護的進程),並且 32 位 Windows 允許加載未簽名的內核模式代碼,所以內核可為受保護的進程提供 API,以查詢內核模式環境的“清潔度”,並僅在沒有加載未簽名代碼時使用結果解除對高級內容的鎖定。
沒有特定識別受保護進程的 API,但是您可以間接地根據有關它們的受限信息以及甚至無法從管理帳戶進行調試來識別它們。音頻設備圖形隔離進程 (%Systemroot%\System32\Audiodg.exe) 用於播放使用內容加密系統 (CSS) 編碼的 DVD,並在“任務管理器”窗格中標識為受保護的進程。事實上,即使使用管理權限運行,任務管理器也無法獲得其命令行、虛擬化和數據執行保護狀態。
7.地址空間加載隨機化
不管采取什麼措施,如數據執行保護和增強的編譯器錯誤檢查,惡意軟件作者都會繼續找到緩沖區溢出漏洞,這些漏洞使他們能夠感染面向網絡的進程(如 Internet Explorer、Windows 服務及第三方應用程序),獲得進入系統的立足點。不過,在設法感染進程後,他們必須使用 Windows API 通過修改用戶或系統配置設置來完成讀取用戶數據或建立永久存在的最終目的。
使用 DLL 導出的 API 入口點連接應用程序,通常由操作系統加載器處理,但是這些類型的惡意軟件感染不會從加載器的服務中受益。惡意軟件在以前的 Windows 版本中還沒有出現過此類問題,因為對於任何特定的 Windows 版本,系統可執行映像和 DLL 總在同一個位置加載,讓惡意軟件假定 API 駐留在固定的地址。
Windows Vista 地址空間加載隨機化 (ASLR) 功能使惡意軟件不可能知道 API 的位置,方法是通過每次系統啟動時在不同位置加載系統 DLL 和可執行文件。在啟動進程早期,內存管理器會從用戶模式地址空間頂部 16MB 區域的 256 個 64KB 對齊地址中隨機選取一個作為 DLL 映像加載偏差。由於在映像標頭中有新的動態重新定位標記的 DLL 加載到進程中,因此內存管理器會從映像加載偏差地址開始並繼續將 DLL 選取到內存中。
具有標記組的可執行文件會得到類似的處理,在存儲在其映像標頭中的 16MB 基本加載地址內以隨機的 64KB 對齊點加載。此外,如果使用給定的 DLL 或可執行文件的所有進程卸載後再次加載它,內存管理器會重新選擇一個隨機的加載位置。圖 7 所示為一個 32 位 Windows Vista 系統的示例地址空間布局,包括 ASLR 選取映像加載偏差和可執行文件加載地址的區域。
只有具有動態重新定位標記的映像(包括所有 Windows Vista DLL 和可執行文件)才能重新定位,因為移動原有映像可能會中斷開發人員對其映像加載位置所做的內部假設。Visual Studio 2005 SP1 增加了對設置標記的支持,以便第三方開發人員可以充分利用 ASLR。
將 DLL 加載地址隨機分布到 256 個位置之一,並不會使惡意軟件猜不出正確的 API 位置,但是它會嚴重限制網絡蠕蟲傳播的速度,並且可以阻止僅有一次機會感染系統的惡意軟件以可靠地運行。此外,ASLR 的重新定位策略的第二個好處是,地址空間壓縮比在以前的 Windows 版本上的更加緊密,為連續內存分配創建更大的可用內存區域,減少內存管理分配以跟蹤地址空間布局的頁表數,以及最小化轉換旁路緩沖器 (TLB) 遺漏。
8.服務安全性改進
Windows 服務成為理想的惡意軟件目標。許多服務都提供通過網絡訪問其功能,這很可能會暴露遠程可利用的訪問系統的機會,而大多數服務運行都使用比標准用戶帳戶更多的權限,如果它們被惡意軟件利用,則會提供在本地系統上提升權限的機會。因此,Windows 以在 Windows XP SP2 中所做的更改為始不斷完善,將權限和對指定服務的訪問權限降為僅其角色需要的權限。例如,Windows XP SP2 引入了本地服務和網絡服務帳戶(僅包括服務以前一直運行的本地系統帳戶權限的子集)。這樣可以在利用服務時最小化攻擊者獲取的訪問權限。
通過使用像 Sysinternals 提供的 Process Explorer 一樣的工具,在兩個不同的引導會話中比較進程的 DLL 加載地址,您可以很容易看到 ASLR 的效果。在從兩個不同會話截取的這兩個屏幕快照中,Ntdll.dll 首先在地址 0x77A30000、然後在地址 0x77750000 加載到 Explorer。 在以前的文章中,就介紹了服務如何在其會話中與用戶帳戶分開運行,但是 Windows Vista 還通過進一步降低分配給大多數服務對文件、注冊表項及防火牆端口的權限和訪問權限,以擴大其最小權限原則的使用。Windows Vista 為每種服務定義了一組唯一的新帳戶,稱為服務安全標識符 (SID)。服務可以對其資源設置權限,這樣只有其服務 SID 擁有訪問權限,避免在服務出現安全漏洞時以相同用戶帳戶運行的其他服務擁有訪問權限。您可以使用 sc showsid 命令後接服務名稱來查看服務的 SID,如圖 8 所示。
服務 SID 保護對特定服務所擁有資源的訪問權限,但默認情況下,服務對其運行的用戶帳戶可以訪問的所有對象仍有訪問權限。例如,在“本地服務”帳戶中運行的服務可能無法訪問在不同進程(該進程使用參考服務 SID 的權限保護其對象)中以“本地服務”運行的另一服務創建的資源;但是,它仍可以讀取和寫入“本地服務”(以及“本地服務”所屬的任何組,如“服務組”)有權訪問的任何對象。
因此,Windows Vista 引入了稱為限制寫入服務的新受限服務類型,可讓服務僅對其服務 SID、Everyone 組及分配到登錄會話的 SID 可訪問的對象允許寫入訪問權限。為了實現這一點,它會使用重新引入 Windows 2000 的受限 SID 類型。當打開對象的進程是限制寫入服務時,訪問 - 檢查算法會發生變化,這樣尚未以受限和非受限方式分配到進程的 SID 就無法用來為進程授予 對象的寫入權限。您可以使用以下命令查看服務是否受限:sc qsidtype [service]
另一個變化是讓服務更容易阻止在相同帳戶中運行的其他服務對其創建的服務擁有訪問權限。在以前的 Windows 版本中,對象的創建者也是對象的所有者,而且所有者能夠讀取和更改其對象的權限,允許其對自己對象的完全訪問權限。Windows Vista 引入了新的所有者權限 SID,如果在對象的權限中存在 SID,則 SID 可以限制所有者對其對象的訪問權限,甚至會刪除設置和查詢權限的權利。
對 Windows Vista 中服務安全模式的進一步改進,可以讓服務開發人員確切地指定當服務在系統上注冊時,此服務需要什麼安全權限才能操作。例如,如果服務需要生成審核事件,它就可以列出“審核”權限。
當“服務控制管理器”啟動托管一個或多個 Windows 服務的進程時,它就為在該進程中僅包括服務所需權限的進程創建了一個安全令牌(列出進程用戶帳戶、組成員身份和安全權限的內核對象)。如果服務指定了其運行的帳戶不可用的權限,則服務無法啟動。當“本地服務”帳戶進程中未運行任何需要(例如)“調試程序”權限的服務時,“服務控制管理器”會從進程的安全令牌中剝奪此權限。因此,如果服務進程被破壞,惡意代碼無法利用進程中運行的服務未明確請求的權限。sc qprivs 命令會報告服務已請求的權限。
9.查看限制寫入服務
在 Windows Vista 上只有一種托管服務進程托管受限服務,您可以使用進程查看工具(如 Process Explorer)將它識別為具有以下命令行的進程:svchost -k LocalServiceNoNetwork
配置在此進程中運行的服務包括基本篩選引擎、診斷策略服務、Windows 防火牆、性能日志和警報及 Windows Media Center 服務啟動程序。
此屏幕顯示文本格式的基本篩選引擎的服務 SID (NT SERVICE\BFE),第一次列出時有受限標記,再次列出時沒有受限標記,因此進程對該帳戶可以訪問的資源擁有訪問權限。不過,它不必對“本地服務”帳戶通常可以訪問的其他對象擁有訪問權限。例如,因為 NT AUTHORITY\SERVICE 帳戶不會在有受限標記的進程令牌中出現,所以進程無法修改僅對令牌(有受限標記)中此帳戶而不是其他帳戶授予寫入權限的對象。
在此進程中運行的服務還會限制其權限,因為在屬性對話框底部列出的權限是可用於“本地服務”帳戶的子集。
結束語
有些功能和改進本文沒有涉及或提及,如面向應用程序開發人員的新的工作線程池、新的同步機制(如共享讀取器/編寫器鎖定)、服務線程標記、對在線 NTFS 磁盤檢查和卷大小調整的支持以及稱為高級本地過程調用 (ALPC) 的新內核 IPC 機制。