Поделиться через


Проблемы безопасности для кодов элементов управления ввода-вывода

Безопасная обработка IRP, содержащих коды управления ввода-вывода, зависит от правильного определения кодов IOCTL и тщательного изучения параметров, которые драйвер получает с IRP.

При определении новых кодов IOCTL используйте следующие правила:

  • Всегда указывайте значение FunctionCode , равное или больше 0x800.

  • Всегда укажите значение RequiredAccess . Диспетчер операций ввода-вывода не отправляет IOCTLs, если вызывающая сторона имеет недостаточно прав доступа.

  • Не определяйте коды IOCTL, которые позволяют вызывающим пользователям читать или записывать неспецифические области памяти ядра.

При обработке кодов IOCTL в драйвере используйте следующие правила:

  • Каждый раз, когда диспетчерские подпрограммы драйвера проверяют полученные коды IOCTL, они всегда должны проверять всё 32-разрядное значение.

  • Драйверы могут использовать IoValidateDeviceIoControlAccess для более строгой динамической проверки доступа, чем та, которая указана значением RequiredAccess в определении кода управления вводом-выводом.

  • Никогда не считывайте или не записывайте больше данных, чем может содержать буфер, на который указывает Irp-AssociatedIrp.SystemBuffer>. Поэтому всегда проверяйте Parameters.DeviceIoControl.InputBufferLength или Parameters.DeviceIoControl.OutputBufferLength в структуре IO_STACK_LOCATION , чтобы определить ограничения буфера.

  • Всегда обнуляйте буферы, которые выделяются драйвером и будут содержать данные, предназначенные для приложения, из которого поступил запрос IOCTL. Таким образом, вы не будете случайно копировать конфиденциальные данные в приложение.

  • Для передачи METHOD_IN_DIRECT и METHOD_OUT_DIRECT следуйте вышеуказанным правилам. Кроме того, проверьте возвращаемое значение NULL из MmGetSystemAddressForMdlSafe, указывающее, что сопоставление завершилось сбоем или что буфер нулевой длины был предоставлен.

  • Для передачи METHOD_NEITHER следуйте правилам, указанным в разделе "Использование ни буферизованного, ни прямого ввода-вывода".