深入底层 评估Vista系统内核模式安全性

Windows Vista与之前的MS Windows版本(包括Windows XP SP2)相比增加了很多的安全性 。Vista新安全性的特征可以包括以下几个方面:
驱动签名
路径保护
内核模式代码完整性检查
可选择支持使用TPM芯片的安全启动
限制用户模式访问DevicePhysicalMemory
上述的这些功能使得Vista64位版本与Linux或MacOS相比更具备安全性 。该文档的主要贡献在:通过拟向工程较全面的分析内核模式的安全组件以及评估可能存在的内核模式攻击 。
该文档检查新的安全特性,通过这些安全特性来阻止恶意代码危及内核 。由于这些特性都仅存在于64位的Windows Vista系统内,因此该文档的关注点在Vista64位版本 。
该文档没有分析PatchGuard的执行,针对PatchGuard的分析在前期已经有Skape和Skywing[6]进行了较全面的分析,值得注意的是PatchGuard发展到目前已经有所改变(在skape与skywing分析完后) 。仅当下面章节对PatchGuard进行攻击评估时才会讨论这些问题 。针对Vista用户模式的安全性评估在前面已经有所讨论[7] 。
由于无法访问Windows Vista的源代码,我们通过debugger(调试器)、disassembler(反编译)、hex editor(16进制编辑器,例如UE)学习了Windows Vista Community Technical PrevIEw (CTP) Build 5365版本 。如果读者不熟悉X86体系架构和汇编语言的知识,推荐大家一本不错的关于X86汇编语言的在线图书[8] 。另外,在看该文档前你需要熟悉一些Windows系统架构的知识,推荐大家阅读[9],该书讲解了Windows系统架构的知识,同时这本书的一些知识同样可以应用到Vista系统上 。在该文档公布时Vista系统还在测试阶段,但Vista在后来版本的安全性方面又做了一些改动 。我们希望Vista在最终的发布版本上有更多的改变,同时我们也计划继续对未来的Vista版本的内核改动进行研究 。
Vista引导过程
Windows Vista支持从PC/AT BIOS和Intel新的EFI(可扩展固件接口)启动 。我们的分析过程忽略了EFI部分 。在本章节的最后部分,引用了bootmgr入口点的开始指令(DllMail为EFI的入口点指令,offset 0为PC/AT的入口点指令)这个过程从Vista启动管理器开始,定位%SystemDrive%bootmgr 文件 (for PC/AT legacy BIOS)或%SystemDrive%BootEFIbootmgr.efi (for EFI BIOS) 。Vista Boot Manager是启动Vista的必须环节,但也适用于启动Windows Vista之前的Windows版本 。
Vista Boot Manager首先调用InitializeLibrary,然后依次调用BlpArchInitialize (GDT, IDT, etc.), BlMmInitialize (memory management), BlpFwInitialize (firmware=固件?), BlpTpmInitialize (TPM), BlpIoInitialize (file systems), BlpPltInitialize (PCI configuration), BlBdInitialize (debugging), BlDisplayInitialize, BlpResourceInitialize (finds its own .rsrc section), and BlNetInitialize 。
在Vista系统内,Windows传统的boot.ini配置文件已经被启动配置数据文件(BCD)所代替,Vista下该文件位于%SystemDrive%BootBCD,该文件也是注册表的值(在Vista下被挂载在HKEY_LOCAL_MACHINEBCD00000000下) 。可以使用bcdedit.exe来查看该文件的内容 。
一个典型的Boot Manager的BCD配置文件如下:
Windows;Boot;Manager
Identifier:;{bootmgr}
Type:;10100002
Device:;partition=C:
Description:;Windows;Boot;Manager
Locale:;en-US
Inherit;options:;{globalsettings}
Boot;debugger:;No
Pre-boot;EMS;Enabled:;No
Default:;{current}
Resume;application:;{3ced334e-a0a5-11da-8c2b-cbb6baaeea6d}
Display;order:;{current}
Timeout:;30
如果只有一个启动入口在BCD文件内,启动管理器会直接从该入口启动 。如果多于一个启动入口,Boot Manager会给用户一个可选择的列表,并提示用户选择启动那个OS 。如果启动阶段激活了日志记录,启动管理器会把状态信息写入%SystemDrive%Bootbootstat.dat文件内(通过BmpInitializeBootStatusDataLog) 。紧接着启动管理器会使用BlResourceFindHTML把bootmgr.xsl定位在资源节点,而后把它传给BlXmiInitialize 。bootmgr.xsl文件控制启动菜单和位于启动菜单的选项 。

推荐阅读