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.