Compartir vía


Problemas de seguridad para códigos de control de E/S

El procesamiento seguro de IRP que contienen códigos de control de E/S depende de definir correctamente los códigos IOCTL y de examinar cuidadosamente los parámetros que recibe el controlador con el IRP.

Al definir nuevos códigos IOCTL, use las reglas siguientes:

  • Especifique siempre un valor functionCode igual o mayor que 0x800.

  • Especifique siempre un valor RequiredAccess . El administrador de E/S no envía ICTLs si el autor de la llamada no tiene derechos de acceso insuficientes.

  • No defina códigos IOCTL que permitan a los llamadores leer o escribir áreas no específicas de la memoria del kernel.

Al procesar códigos IOCTL dentro de un controlador, use las reglas siguientes:

  • Cada vez que la prueba de rutinas de envío de un controlador recibe códigos IOCTL, siempre deben probar el valor completo de 32 bits.

  • Los controladores pueden usar IoValidateDeviceIoControlAccess para realizar dinámicamente una comprobación de acceso más estricta que la especificada por el valor RequiredAccess en la definición del código de control de E/S.

  • Nunca lea o escriba más datos que el búfer al que apunta Irp-AssociatedIrp.SystemBuffer> puede contener. Por lo tanto, compruebe siempre Parameters.DeviceIoControl.InputBufferLength o Parameters.DeviceIoControl.OutputBufferLength en la estructura IO_STACK_LOCATION para determinar los límites del búfer.

  • Siempre cero búferes asignados por controladores que contendrán datos destinados a una aplicación que originó una solicitud IOCTL. De este modo, no copiará accidentalmente datos confidenciales en la aplicación.

  • Para las transferencias METHOD_IN_DIRECT y METHOD_OUT_DIRECT, siga las reglas anteriores. Además, compruebe si hay un valor devuelto NULL de MmGetSystemAddressForMdlSafe, que indica que se produjo un error en la asignación o que se proporcionó un búfer de longitud cero.

  • Para METHOD_NEITHER transferencias, siga las reglas que se proporcionan en Usar ni búfer ni E/S directa.