驅動程式驗證器安全性檢查
驅動程式驗證程式的安全性檢查選項會監視驅動程式是否有可能導致安全性弱點的常見錯誤。 此選項可從 Windows Vista 開始提供。
具體而言,[安全性檢查] 選項會尋找下列不正確的驅動程式行為:
以使用者模式位址作為參數呼叫核心 ZwXxx 常式。 當驅動程式呼叫任何ZwXxx常式時,驅動程式驗證程式會檢查沒有任何參數是使用者模式位址。 呼叫任何ZwXxx常式時,目前的KPROCESSOR_MODE會變成KernelMode,而傳遞給該常式的任何參數都會被視為核心模式位址。 因此,驅動程式必須探查從應用程式接收的任何使用者模式緩衝區,並將它放在核心模式記憶體 (例如,在核心堆疊上配置的資料結構中,) ,再呼叫核心ZwXxx常式。 驅動程式必須使用擷取的緩衝區,而不是使用者模式緩衝區作為ZwXxx常式的參數。
以格式錯誤的UNICODE_STRINGs作為參數呼叫核心 ZwXxx 常式。 當驅動程式呼叫任何ZwXxx常式時,驅動程式驗證程式會檢查任何UNICODE_STRING值的參數。 驅動程式驗證器在這類字串中偵測到的常見錯誤包括:
- 緩衝區欄位會指向使用者模式記憶體。
- Length 或 MaximumLength 參數不正確。 例如,MaximumLength<Length。 或者,這些值的其中一個或兩者都是奇數。 這兩個值都必須一律為偶數,因為它們代表用來表示 Unicode 字串的位元組數目。
以不正確的OBJECT_ATTRIBUTES結構作為參數呼叫核心 ZwXxx 常式。 當驅動程式呼叫任何ZwXxx常式時,驅動程式驗證程式會檢查任何OBJECT_ATTRIBUTE結構的參數。 每個OBJECT_ATTRIBUTE結構參數的成員都會受到上述使用者模式位址和UNICODE_STRING值的相同檢查。
不一致的 Irp-RequestorMode > 和 I/O 要求參數。 每當 Irp- > RequestorMode 設定為 KernelMode時,驅動程式驗證器會檢查沒有 I/O 要求參數 Irp-AssociatedIrp.SystemBuffer > 或 Irp-UserBuffer>是使用者模式位址。
從 Windows 7 開始,當您啟用任何驅動程式驗證程式選項時,驅動程式驗證程式會檢查下列驅動程式行為:
物件參考計數器從 0 變更為 1。 當 Windows 核心物件管理員建立物件,例如 File 物件或 Thread 物件時,新物件的參考計數器會設定為 1。 呼叫系統函式,例如 ObReferenceObjectByPointer 或 ObReferenceObjectByHandle 遞增參考計數器。 對 ObDereferenceObject 的每個呼叫都會遞減參考計數器。
在參考計數器達到 0 值之後,物件就會變成有資格釋出。 物件管理員可能會立即釋出它,或稍後釋出它。 驅動程式驗證器會檢查對 ObReferenceObjectByPointer 和 ObReferenceObject 的後續呼叫是否有相同的物件。 這些呼叫會將參考計數器從 0 變更為 1,這表示驅動程式已遞增已釋放物件的參考計數器。 這一定不正確,因為它可能會損毀其他記憶體配置。
啟用此選項
您可以使用驅動程式驗證程式管理員或Verifier.exe命令列,為一或多個驅動程式啟用安全性檢查選項。 如需詳細資訊,請參閱 選取驅動程式驗證器選項。
使用命令列
在命令列中,[安全性檢查] 選項會以 位 8 (0x100) 表示。 若要啟用安全性檢查,請使用旗標值0x100或將0x100新增至旗標值。 例如:
verifier /flags 0x100 /driver MyDriver.sys
重新開機電腦之後,此選項將會處於作用中狀態。
從 Windows Vista 開始,您也可以藉由將 /volatile 參數新增至 命令,來啟動和停用安全性檢查,而不重新開機電腦。 例如:
verifier /volatile /flags 0x100 /adddriver MyDriver.sys
此設定會立即生效,但會在您關閉或重新開機電腦時遺失。 如需詳細資訊,請參閱 使用變動性設定。
[安全性檢查] 選項也會包含在標準設定中。 例如:
verifier /standard /driver MyDriver.sys
使用驅動程式驗證器管理員
- 啟動驅動程式驗證器管理員。 在命令提示字元視窗中輸入 驗證程式 。
- 選取 [為程式碼開發人員) 建立自訂設定 (],然後按 [ 下一步]。
- 從完整清單中選取 [選取個別設定]。
- 選取 [安全性檢查]。
安全性檢查功能也會包含在標準設定中。 若要在驅動程式驗證器管理員中使用此功能,請按一下 [建立標準設定]。