内核补丁保护

<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