共用方式為


處理管理

驅動程式內安全性問題的重要來源是使用使用者模式和內核模式元件之間傳遞的句柄。 在核心環境中處理使用方式有一些已知問題,包括下列各項:

  • 將錯誤的句柄類型傳遞給核心驅動程式的應用程式。 核心驅動程式可能會損毀嘗試使用需要檔案物件的事件物件。

  • 將句柄傳遞至沒有必要存取權之物件的應用程式。 核心驅動程式可能會執行可運作的作業,因為呼叫來自核心模式,即使使用者沒有足夠的許可權可以執行此動作。

  • 傳遞值的應用程式在其位址空間中不是有效的句柄,但會標示為系統句柄,以對系統執行惡意作業。

  • 傳遞不是裝置物件適當句柄之值的應用程式(此驅動程式未建立的句柄)。

若要防範這些問題,核心驅動程式必須特別小心,以確保傳遞給它的句柄有效。 最安全的原則是在驅動程序的內容中建立任何必要的句柄。 這些由核心驅動程式建立的句柄應該指定 OBJ_KERNEL_HANDLE 選項,這會在任意進程內容中建立有效的句柄,以及只能從內核模式呼叫端存取的句柄。

對於使用應用程式程式所建立句柄的驅動程式,您必須非常小心地使用這些句柄:

  • 最佳做法是呼叫 ObReferenceObjectByHandle,指定正確的 AccessMode(通常是來自 Irp-RequestorMode>)、DesiredAccessObjectType 參數,例如 IoFileObjectType 或 ExEventObjectType,將句柄轉換成對象指標。

  • 如果句柄必須直接在呼叫內使用,最好是使用函式的 Nt 變體,而不是函式的 Zw 變體。 這會強制執行操作系統的參數檢查和處理驗證,因為上一個模式將是 UserMode ,因此不受信任。 請注意,如果上一個模式是 UserMode,傳遞至Nt函式的參數可能會失敗驗證。 Nt 和 Zw 例程會傳回 IoStatusBlock 參數,其中包含您應該檢查錯誤的錯誤資訊。

  • 必須適當地截獲錯誤,並視需要使用__try和__except。 許多快取管理員 (Cc)、記憶體管理員 (Mm) 和文件系統運行時間連結庫例程 (FsRtl) 會在發生錯誤時引發例外狀況。

任何驅動程式都不應該依賴從使用者模式應用程式傳遞的句柄或參數,而不需要採取適當的預防措施。

請注意,如果 Nt variant 是用來開啟檔案,則也必須使用 Nt variant 來關閉檔案。