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

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

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

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

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

  • 請勿定義允許呼叫端讀取或寫入核心記憶體非特定區域的 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傳輸,請遵循上述規則。 此外,檢查MmGetSystemAddressForMdlSafeNull傳回值,這表示對應失敗,或已提供零長度緩衝區。

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