內核補丁保護

<image>

內核補丁保護（Kernel Patch Protection），俗名PatchGuard，是Microsoft Windows 64位（x64）版本中預防對內核進行修補的一種特性。該特性2005年在Windows XP與Windows Server 2003 Service Pack 1的64位版本中首次推出。

「修補內核」是指對Windows作業系統的核心組件或內核進行本不支持的修改。這種修改沒有得到微軟的支持，並據微軟稱可能大幅降低系統的安全性、可靠性以及性能。儘管微軟並不推薦，但在Windows的x86版本上修補內核沒有受到限制；而在Windows的x64版本中，微軟選擇為此行為實施額外的保護和技術障礙。

因為32位（x86）版本的Windows可以隨意修補內核，所以有眾多反病毒軟體開發人員使用此技術來實現反病毒等安全功能。在不再支持此技術的x64版本Windows上，防病毒廠商不得不重新設計其軟體以另尋他法。

不過，由於Windows內核的設計，內核補丁保護並不能完全阻攔內核修補。因而這引發了對內核補丁保護的批評，指責它是一種不完美的防護措施，對反病毒廠商造成的障礙超過了其帶來的好處，因為惡意軟體的作者可能找到方案來繞過該措施。儘管如此，內核補丁保護仍可防止由合法軟體以不受支持方式進行的內核修補，這可能對系統的穩定性、可靠性和性能帶來負面結果。

## 技術概述

Windows內核在設計上使設備驅動程序有與作業系統內核相同的特權級別。預期的設備驅動程序不會修改或修補內核中的核心系統結構。但在Windows的x86版本中，Windows沒有強制要求此預期。因而，部分x86軟體（尤其是某些安全和反病毒軟體）在設計上採用加載驅動程序來修改核心記憶體結構的工作方式。

在Windows的x64版本中，微軟開始以內核驅動保護技術限制驅動程序可以修改與不能修改的結構。該技術定期檢查內核中受保護的系統結構以驗證其未被修改。如果檢測到修改，Windows將觸發一個缺陷檢查並以藍屏死機關閉系統（並可能重啟）。所觸發的錯誤檢查編碼為0x109，名稱CRITICAL_STRUCTURE_CORRUPTION。被禁止的修改包括：

- 對系統服務描述表進行修改或鉤子(Hook)
- 修改系統調用表
- 修改中斷描述表
- 修改全局描述表
- 使用未由內核分配的內核堆棧
- 修改或修補內核本身、硬體抽象層（HAL）或網路驅動程式介面規範（NDIS）內核庫中包含的代碼

內核補丁保護只防禦設備驅動程序對內核進行的修改，而不會干涉對另一個驅動程序的修補。

此外，由於設備驅動程序有與內核本身相同的特權級別，因此不可能充分防止驅動程序繞過內核補丁保護並修補內核。不過，內核補丁保護的確對內核修補構成了重大阻礙。隨著高度混淆的代碼和令人含混的符號名稱，內核補丁保護默默地以此抵禦了繞過該技術的企圖。對該技術本身的定期更新也使對其繞過更加困難，已有繞過技術可能隨著更新而失效。自2005年創建以來，微軟已經發布過對該技術的兩個主要更新，每個更新都是為解決已知的針對此前版本的旁路技術。

## 優點

因為可能導致許多負面影響，內核修補從未得到微軟官方的支持。內核補丁保護可以預防下列影響：

- 內核中的嚴重錯誤。
- 多個程序嘗試修補內核的相同部分導致的可靠性問題。
- 受損的系統安全性。
- Rootkit可使用內核訪問將其嵌入到作業系統，使其近乎不可能被刪除。

微軟在此技術的常見問題解答（FAQ）中進一步闡述：由於修補程序使用未知、未經測試的代碼替換內核代碼，無法評估第三方代碼的質量或影響。微軟對在線崩潰分析（OCA）數據的檢查表明，系統崩潰經常由於惡意和非惡意的軟體修補內核所造成。

## 缺點

### 第三方軟體

部分電腦安全軟體（如邁克菲的McAfee VirusScan和賽門鐵克的諾頓防毒）在x86系統上通過修補內核來工作。卡巴斯基實驗室製作的反病毒軟體也已知廣泛使用內核代碼修補程序。這些程序由於內核補丁保護的存在而無法在Windows 64位版本上正常運行。就此情況，McAfee曾呼籲微軟完全刪除Windows中的內核補丁保護，或者對「可信公司」製作的軟體進行例外處理。

賽門鐵克的企業防病毒軟體和Norton 2010左右在有內核補丁保護的Windows x64版本上能正常工作，但對零日惡意軟體的防護能力有所降低。ESET、Trend Micro、Grisoft AVG、avast!、Avira Anti-Vir和Sophos等公司製作的反病毒軟體在默認配置下不修補內核，但當啟用如「高級進程保護」、「阻止未經授權的進程終止」等功能時可能會修補內核。

<image>

微軟不曾添加例外來削弱「內核補丁保護」的影響範圍，不過有不時放寬其限制，例如為了Hypervisor虛擬化軟體的正常運行。另外，微軟與第三方公司合作，新增了應用程式接口來幫助安全軟體執行所需任務，以免除修補內核的需要。新接口在Windows Vista Service Pack 1中被引入。

### 弱點

由於Windows內核的設計，內核補丁保護並不能完全阻止對內核的補丁。這導致安全軟體提供商邁克菲和賽門鐵克稱內核補丁保護是一個不完美的防禦，給安全軟體廠商帶來的問題超過了其益處，因為惡意軟體可以比較容易的找出內核補丁保護的繞過方法，而第三方安全軟體必須在其限制下設計和運作。

2006年1月，化名「skape」和「Skywing」的安全研究員發布的一份報告介紹了一些理論上可以繞過內核補丁保護的方法。Skywing於2007年1月繼續發布了有關繞過「內核補丁保護」第2版的第二份報告，並於2007年9月發布有關「內核補丁保護」第3版的第三份報告。2006年10月，安全公司Authentium也開發了一種可繞過該技術的有效方法。

雖說如此，微軟表示作為安全響應中心標準流程的一部分，在致力於消除任何使內核補丁保護被繞過的缺陷。微軟已發布過對該技術的兩次主要更新，每次都是為解決已知的針對此前版本的繞過技術。

### 反壟斷行為

2006年，歐盟委員會對內核補丁保護表示擔憂，稱它是反競爭舉措。不過，微軟自己的反病毒產品Windows Live OneCare沒有在內核補丁保護上有特別例外，而是始終在使用其他方法提供病毒防護服務。但由於其他原因，Windows Live OneCare的x64版本在2007年11月15日之前不可用。

## 外部連結

- The Truth About PatchGuard: Why Symantec Keeps Complaining
- An Introduction to Kernel Patch Protection
- Microsoft executive clarifies recent market confusion about Windows Vista Security
- Kernel Patch Protection: Frequently Asked Questions
- Windows Vista x64 Security – Pt 2 – Patchguard

Uninformed.org文章：

- Bypassing PatchGuard on Windows x64
- Subverting PatchGuard Version 2
- PatchGuard Reloaded: A Brief Analysis of PatchGuard Version 3

繞過方法：

- KPP Destroyer (including source code) - 2015
- A working driver to bypass PatchGuard 3 (including source code) - 2008
- Bypassing PatchGuard with a hex editor - 2009

微軟安全通告：

- June 13, 2006 update to Kernel Patch Protection
- August 14, 2007 update to Kernel Patch Protection