Compartir a través de


Controlar la suplantación de cliente en controladores UMDF 1.x

Advertencia

UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los controladores UMDF nuevos deben escribirse con UMDF 2. No se agregan nuevas características a UMDF 1 y hay compatibilidad limitada con UMDF 1 en versiones más recientes de Windows 10. Los controladores universales de Windows deben usar UMDF 2.

Los ejemplos de UMDF 1 archivados se pueden encontrar en la actualización de ejemplos de controladores de Windows 11, versión 22H2 - mayo de 2022.

Para obtener más información, consulta Introducción con UMDF.

Normalmente, los controladores UMDF se ejecutan en la cuenta localService y no pueden acceder a archivos o recursos que requieran credenciales de usuario, como archivos protegidos u otros recursos protegidos. Un controlador UMDF normalmente funciona en comandos y datos que fluyen entre una aplicación cliente y un dispositivo. Por lo tanto, la mayoría de los controladores UMDF no acceden a los recursos protegidos.

Sin embargo, algunos controladores pueden requerir acceso a un recurso protegido. Por ejemplo, un controlador UMDF podría cargar firmware en un dispositivo desde un archivo que proporciona una aplicación cliente. Es posible que el archivo tenga una lista de control de acceso (ACL) que impida a los usuarios no autorizados modificar el archivo y tomar el control del dispositivo. Desafortunadamente, esta ACL también impide que el controlador UMDF acceda al archivo.

El marco proporciona una funcionalidad de suplantación que permite a los controladores suplantar al cliente del controlador y obtener los derechos de acceso del cliente a los recursos protegidos.

Habilitar la suplantación

Tanto el paquete de instalación del controlador UMDF como la aplicación cliente deben habilitar la funcionalidad de suplantación del marco, como se indica a continuación:

  • El archivo INF del paquete de instalación del controlador UMDF debe incluir la directiva UmdfImpersonationLevel y establecer el nivel máximo de suplantación permitido. La suplantación solo está habilitada si el archivo INF incluye la directiva UmdfImpersonationLevel . Para obtener más información sobre cómo establecer el nivel de suplantación, vea Especificar directivas WDF en archivos INF.

  • La aplicación cliente debe establecer el nivel de suplantación permitido para cada identificador de archivo. La aplicación usa la configuración de calidad de servicio (QoS) en la función CreateFile de Microsoft Win32 para establecer el nivel de suplantación permitido. Para obtener más información sobre esta configuración, vea el parámetro dwFlagsAndAttributes de CreateFile en la documentación de Windows SDK.

Control de la suplantación para una solicitud de E/S

El controlador y el marco umdf controlan la suplantación de una solicitud de E/S en la siguiente secuencia:

  1. El controlador llama al método IWDFIoRequest::Impersonate para especificar el nivel de suplantación necesario y una función de devolución de llamada IImpersonateCallback::OnImpersonate .

  2. El marco comprueba el nivel de suplantación solicitado. Si el nivel solicitado es mayor que el nivel que el paquete de instalación del controlador UMDF y la aplicación cliente permiten, se produce un error en la solicitud de suplantación. De lo contrario, el marco suplanta al cliente y llama inmediatamente a la función de devolución de llamada OnImpersonate .

La función de devolución de llamada OnImpersonate solo debe realizar las operaciones que requieren el nivel de suplantación solicitado, como abrir un archivo protegido.

UMDF no permite que la función de devolución de llamada OnImpersonate de un controlador llame a ninguno de los métodos de objeto del marco. Esto garantiza que el controlador no exponga el nivel de suplantación a otras funciones de devolución de llamada del controlador u otros controladores.

Nota En las versiones 1.0 a 1.7 de UMDF, IWDFIoRequest::Impersonate concede el nivel de suplantación más alto que permite la aplicación cliente y el archivo INF, incluso si el nivel de suplantación que solicita el controlador es inferior. En las versiones 1.9 y posteriores de UMDF, el método Impersonate concede solo el nivel de suplantación que solicita el controlador.

Pasar credenciales a la pila de controladores

Cuando el controlador recibe una solicitud de E/S con tipo WdfRequestCreate, el controlador podría reenviar la solicitud de E/S a la pila de controladores a un controlador en modo kernel. Los controladores en modo kernel no tienen la funcionalidad de suplantación que IWDFIoRequest::Impersonate proporciona a los controladores basados en UMDF.

Por lo tanto, si desea que un controlador en modo kernel reciba las credenciales de usuario del cliente (en lugar de las credenciales del proceso de host del controlador), el controlador debe establecer la marca de WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT cuando llama a IWDFIoRequest::Send para enviar la solicitud de creación al destino de E/S. El método Send devuelve un código de error si se produce un error en el intento de suplantación, a menos que el controlador también establezca la marca WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE .

El controlador no tiene que llamar a IWDFIoRequest::Impersonate antes de enviar la solicitud al destino de E/S.

Si los controladores de nivel inferior también reenvía la solicitud, el nivel de suplantación del cliente recorre la pila de controladores.

Reducción de amenazas de seguridad

Para reducir la posibilidad de que se produzca un ataque de "elevación de privilegios", debe hacer lo siguiente:

  • Intente evitar el uso de la suplantación.

    Por ejemplo, para evitar el uso de suplantación para abrir un archivo que el controlador debe usar, la aplicación cliente puede abrir el archivo y usar operaciones de E/S para enviar el contenido del archivo al controlador.

  • Use el nivel de suplantación más bajo que requiera el controlador.

    Establezca el nivel de suplantación en el archivo INF del controlador lo más bajo posible. Si el controlador no requiere ninguna suplantación, no incluya la directiva UmdfImpersonationLevel en el archivo INF.

  • Minimice las oportunidades para que un atacante aproveche el controlador.

    La función de devolución de llamada OnImpersonate debe contener una pequeña sección de código que realiza solo la operación que requiere suplantación. Por ejemplo, si el controlador accede a un archivo protegido, solo requiere suplantación cuando abre el identificador de archivo. No requiere suplantación para leer o escribir en el archivo.