电脑技术学习

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

dn001

  当OS 编目录 nt5.cat被加载后,WINLOAD.EXE通过SelfIntegrityCheck对其自身进行完整性检查,这里的检查做了两个事情:

  1. 计算PE映像(image)的SHA1哈希值,然后与PE证书表内的SHA1哈希值进行对比,这里的对比必须是匹配的,如果不匹配就会返回一个错误信息。

  2. 另外,他也调用ImgpValidateImageHash来验证映象(image)哈希值是否与nt5.cat内的相匹配。ImgpValidateImageHash会调用API函数MinCrypL_CheckSignedFile来验证证书,调用MinCrypL_CheckImageHash来寻找nt5.cat上的映象(image)匹配哈希值。在下面的章节III会讨论通过MinCrypL_CheckSignedFile和 MinCrypL_CheckImageHash进行驱动签名验证。

  如果上述的签名过程不匹配,但是调试器在开启状态(BlBdDebuggerEnabled returns TRUE),那么在这里会打印处如下的调试信息:

***;Windows;is;unable;to;verify;the;signature;of;the;file;%s.
  It;will;be;allowed;to;load;because;the;boot;debugger;is;enabled.
  Use;g;to;continue!!

  如果调试器是存在的,那么可以通过调用DbgBreakPoint来进行激活;另外,在这里通过调用ReportCodeIntegrityFailure替换了系统提示致命错误的错误形式。

  当所有的完整性检查结束后(unless all integrity checks have been disabled),OslInitializeCodeIntegrity会返回成功状态,然后会继续从OslMain开始执行。接着,OslpLoadAllModules被调用并开始加载系统模块。首先,会调用OslLoadImage来加载NTOSKRNL.EXE和HAL.DLL,在这里仅仅是加载,此时没有解决Imports;第二,如果内核调试被开启,调试驱动会依靠启动调试选项的情况被加载(kdcom.dll for serial port, kd1394.dll for IEEE1394, or kdusb.dll for USB)。第三,NTOSKRNL.EXE的Imports被加载和初始化(使用LoadImports和BindImportRefences函数)。

  OslLoadImage calls GetImageValidationFlags to check the filename against a pre-defined list of boot drivers in LoadBootImagesTable. If integrity checks are enabled, then boot drivers must be signed by a trusted root authority and all the image hashes must match the signed catalog file unless a debugger is enabled. If a debugger is enabled, WINLOAD.EXE does not enforce this requirement. Instead it will print an error message to the debugger, but will otherwise ignore the code integrity check failure. However, the following boot drivers (also listed in Appendix A) must pass the code integrity checks even if a debugger is enabled (otherwise WINLOAD.EXE will refuse to boot Windows Vista):

  OslLoadImage调用GetImageValidationFlags来检查在LoadBootImagesTable中预先定义好的boot drivers文件名。如果启用了完整性检查,除非在这里调试器被开启,否则boot drivers必须进行可信任的root签名,并且所有的映象哈希值(image hashes)要与编目录签名相匹配。如果调试器处于开启状态,WINLOAD.EXE不会强制这些要求。安全后WINLOAD.EXE会打印一个错误信息给调试器,但是却忽略了代码完整性检查的失败。无论如何,接下来的boot drivers必须通过代码完整性检查,即使调试器在开启状态也必须检查。(如果没有进行检查,vista不会被启动起来):

Windowssystem32bootvid.dll
  Windowssystem32ci.dll
  Windowssystem32clfs.sys
  Windowssystem32hal.dll
  Windowssystem32kdcom.dll;(or;kd1394.sys;or;kdusb.dll,;depending;on;boot;options)
  Windowssystem32ntoskrnl.exe
  Windowssystem32pshed.dll
  Windowssystem32WINLOAD.EXE
  Windowssystem32driversksecdd.sys
  Windowssystem32driversspldr.sys
  Windowssystem32driverstpm.sys

  加载映象和验证代码完整性都在BlImgLoadPEImageEx内,都使用了SelfIntegrityCheck(在前面章节有描述)函数。所有的映象(image)都通过代码完整性校验后,NTOSKRNL.EXE和它所有的Imports此时会被加载。列表(版本:Build 5363)如下:

Windowssystem32NTOSKRNL.exe
  Windowssystem32HAL.dll
  Windowssystem32PSHED.dll
  Windowssystem32BOOTVID.dll
  Windowssystem32CLFS.SYS
  Windowssystem32CI.dll

  接下来使用OslHiveFindDrivers查找所有的boot drivers,并且根据组(which is ordered according to HKEY_LOCAL_MacHINECurrentControlSetControlGroupOrderList)和标记(an integer which determines each driver’s order within its respective group)对他们进行分类。这个分类好的boot drivers列表通过OslLoadDrivers进行加载。OslLoadDrivers为列表中的每个驱动调用LoadImageEx。LoadImageEx将会加载每个驱动及相关信息。

  此时,剩余的boot drivers也被加载和初始化。列表如下(按照年月日排列,64位Vista):

1.;Windowssystem32driversWdf01000.sys
  2.;Windowssystem32driversWDFLDR.SYS
  3.;Windowssystem32driversacpi.sys
  4.;Windowssystem32driversWMILIB.SYS
  5.;Windowssystem32driversmsisadrv.sys
  6.;Windowssystem32driverspci.sys
  7.;Windowssystem32driversvolmgr.sys
  8.;Windowssystem32driversisapnp.sys
  9.;Windowssystem32driversmpio.sys
  10.;Windowssystem32driverscompbatt.sys
  11.;Windowssystem32driversBATTC.SYS
  12.;WindowsSystem32driversmountmgr.sys
  13.;Windowssystem32driversintelide.sys
  14.;Windowssystem32driversPCIIDEX.SYS
  15.;Windowssystem32driverspcmcia.sys
  16.;Windowssystem32driversaliide.sys
  17.;Windowssystem32driversamdide.sys
  18.;Windowssystem32driverscmdide.sys
  19.;Windowssystem32driversmsdsm.sys
  20.;Windowssystem32driverspciide.sys
  21.;Windowssystem32driversviaide.sys
  22.;WindowsSystem32driversvolmgrx.sys
  23.;Windowssystem32driversatapi.sys
  24.;Windowssystem32driversataport.SYS
  25.;Windowssystem32drivershpcisss.sys
  26.;Windowssystem32driversstorport.sys
  27.;Windowssystem32driversadp94xx.sys
  28.;Windowssystem32driversadpu160m.sys
  29.;Windowssystem32driversSCSIPORT.SYS
  30.;Windowssystem32driversadpu320.sys
  31.;Windowssystem32driversdjsvs.sys
  32.;Windowssystem32driversarc.sys
  33.;Windowssystem32driversarcsas.sys
  34.;Windowssystem32driverselxstor.sys
  35.;Windowssystem32driversi2omp.sys
  36.;Windowssystem32driversiirsp.sys
  37.;Windowssystem32driversiteraid.sys
  38.;Windowssystem32driverslsi_fc.sys
  39.;Windowssystem32driverslsi_sas.sys
  40.;Windowssystem32driverslsi_scsi.sys
  41.;Windowssystem32driversmegasas.sys
  42.;Windowssystem32driversmraid35x.sys
  43.;Windowssystem32driversmsahci.sys
  44.;Windowssystem32driversnfrd960.sys
  45.;Windowssystem32driversql2300.sys
  46.;Windowssystem32driversql40xx.sys
  47.;Windowssystem32driverssisraid2.sys
  48.;Windowssystem32driverssisraid4.sys
  49.;Windowssystem32driverssymc8xx.sys
  50.;Windowssystem32driverssym_hi.sys
  51.;Windowssystem32driverssym_u3.sys
  52.;Windowssystem32driversvsmraid.sys
  53.;Windowssystem32driversfltmgr.sys
  54.;Windowssystem32driversfileinfo.sys
  55.;Windowssystem32driversndis.sys
  56.;Windowssystem32driversmsrpc.sys
  57.;Windowssystem32driversNETIO.SYS
  58.;WindowsSystem32DriversNtfs.sys

  此时,所有的boot drivers被加载。接下来,调用OslpLoadNlsData从注册表项HKEY_LOCAL_MACHINECurrentControlSetControlNLS加载操作系统的语言版本。最后调用OslpLoadAllModules做了下面的几个事情:

  1. 显示Vista启动过程中的进度条。

  2. 加载%SystemRoot%AppPatchdrvmain.sdb(the application compatability database)

  3. 加载%SystemRoot%System32acpitabl.dat

  4. 加载HKEY_LOCAL_MACHINECurrentControlSetControlErrataInfName注册表项的INF文件。

  在OslpLoadAllModules结束后,OslMain保存启动日志(OslpLogSaveInformation),如果FVE(Full Volume Encryption)选项开启,结束FVE的加载(BlFveSecureBootRestrictToOne and BlTpmShutdown)。最后,调用OslArchTransferToKernel把控制权转交给NTOSKRNL.EXE。

标签: