Control de la suplantación de cliente en controladores UMDF
En este tema se describe cómo un controlador de User-Mode Driver Framework (UMDF) accede a los recursos protegidos a partir de la versión 2 de UMDF.
Normalmente, los controladores de 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. Normalmente, un controlador UMDF 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 el 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, consulte 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 de trabajo de UMDF controlan la suplantación de una solicitud de E/S en la secuencia siguiente:
El controlador llama al método WdfRequestImpersonate para especificar el nivel de suplantación necesario y una función de devolución de llamada EvtRequestImpersonate .
El marco comprueba el nivel de suplantación solicitado. Si el nivel solicitado es mayor que el nivel que permite el paquete de instalación del controlador UMDF y la aplicación cliente, 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 EvtRequestImpersonate .
La función de devolución de llamada EvtRequestImpersonate solo debe realizar las operaciones que requieren el nivel de suplantación solicitado, como abrir un archivo protegido.
El marco de trabajo no permite que la función de devolución de llamada EvtRequestImpersonate de un controlador llame a cualquiera 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.
Como procedimiento recomendado, el controlador no debe habilitar la cancelación de una solicitud de E/S antes de llamar a WdfRequestImpersonate para esa solicitud.
El método WdfRequestImpersonate 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 WdfRequestTypeCreate, el controlador podría reenviar la solicitud de E/S a una pila de controladores en modo kernel. Los controladores en modo kernel no tienen la funcionalidad de suplantación que WdfRequestImpersonate proporciona a los controladores 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 WdfRequestSend 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 .
En el ejemplo siguiente se muestra cómo un controlador UMDF podría usar la marca WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT para enviar una solicitud de creación de archivos a un destino de E/S. El archivo INF del controlador también debe incluir la directiva UmdfImpersonationLevel como se ha descrito anteriormente.
WDFIOTARGET iotarget;
WDF_REQUEST_SEND_OPTIONS options;
NTSTATUS status;
WDF_REQUEST_PARAMETERS params;
ULONG sendFlags;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(Request, ¶ms);
sendFlags = WDF_REQUEST_SEND_OPTION_SYNCHRONOUS;
if (params.Type == WdfRequestTypeCreate) {
sendFlags |= WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT;
}
WDF_REQUEST_SEND_OPTIONS_INIT(&options, sendFlags);
if (WdfRequestSend(Request,
iotarget,
&options
) == FALSE) {
status = WdfRequestGetStatus(Request);
}
El controlador no tiene que llamar a WdfRequestImpersonate 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 del controlador.
Reducción de amenazas de seguridad
Para reducir la posibilidad de un ataque de "elevación de privilegios", debe:
Intente evitar el uso de la suplantación.
Por ejemplo, para evitar usar la 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 contenido del archivo al controlador.
Use el nivel de suplantación más bajo que requiere 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 EvtRequestImpersonate debe contener una pequeña sección de código que realice 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.