共用方式為


I/O 控制碼的安全性問題

包含 I/O 控制程式代碼之 IRP 的安全處理取決於正確定義 IOCTL 程式代碼,以及仔細檢查驅動程式使用 IRP 接收的參數。

定義新的 IOCTL 程式代碼時,請使用下列規則:

  • 一律指定等於或大於 0x800 的 FunctionCode 值。

  • 一律指定 RequiredAccess 值。 如果呼叫端的存取權限不足,I/O 管理員不會傳送 IOCTL。

  • 請勿定義允許呼叫端讀取或寫入核心記憶體非特定區域的 IOCTL 程式代碼。

在驅動程式內處理 IOCTL 程式代碼時,請使用下列規則:

  • 每當驅動程式分派例程測試收到的 IOCTL 程序代碼時,它們必須始終測試完整的 32 位數值。

  • 驅動程式可以使用 IoValidateDeviceIoControlAccess 來動態執行比 I/O 控制程式代碼定義中 RequiredAccess 值所指定的更嚴格的存取檢查。

  • 永遠不要讀取或寫入超過 Irp-AssociatedIrp.SystemBuffer> 所指向的緩衝區所能容納的資料。 因此,請務必檢查 IO_STACK_LOCATION 結構中的 Parameters.DeviceIoControl.InputBufferLengthParameters.DeviceIoControl.OutputBufferLength,以判斷緩衝區限制。

  • 確保為驅動程式配置的緩衝區清零,這些緩衝區將包含針對發出 IOCTL 請求之應用程式的資料。 這樣,您就不會意外地將敏感數據複製到應用程序。

  • 對於METHOD_IN_DIRECT和METHOD_OUT_DIRECT轉賬,請遵循上述規則。 此外,請檢查NULL 傳回值,這來自MmGetSystemAddressForMdlSafe 函式,表示映射失敗或已提供零長度緩衝區。

  • 對於 METHOD_NEITHER 傳輸,請遵循 不使用緩衝或直接 I/O 中提供的規則。