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.InputBufferLength或Parameters.DeviceIoControl.OutputBufferLength來判斷緩衝區限制。
一律為零驅動程式配置的緩衝區,其中包含適用于源自 IOCTL 要求之應用程式的資料。 如此一來,您就不會不小心將敏感性資料複製到應用程式。
如需METHOD_IN_DIRECT和METHOD_OUT_DIRECT傳輸,請遵循上述規則。 此外,檢查MmGetSystemAddressForMdlSafe的Null傳回值,這表示對應失敗,或已提供零長度緩衝區。
針對METHOD_NEITHER傳輸,請遵循 使用「未緩衝」或「直接 I/O」中提供的規則。