Controlar el acceso a dispositivos en controladores KMDF
Los controladores deben ayudar a evitar que los usuarios accedan de forma inapropiada a los archivos y dispositivos de un equipo. Para evitar el acceso no autorizado a dispositivos y archivos, debe:
Asigne un nombre a los objetos de dispositivo solo cuando sea necesario.
Proporcione descriptores de seguridad para objetos e interfaces de dispositivo.
Asignar nombres solo a objetos de dispositivo cuando sea necesario
Al igual que la mayoría de los controladores de Windows Driver Model (WDM), los controladores basados en marcos normalmente no asignan un nombre a sus objetos de dispositivo. Las aplicaciones pueden acceder a un dispositivo especificando un nombre de objeto de dispositivo, por lo que cada nombre de objeto de dispositivo adicional representa una ruta de acceso adicional que una aplicación puede usar para acceder al dispositivo.
Para evitar el acceso no autorizado a un dispositivo, cada controlador puede especificar un descriptor de seguridad cuando asigna un nombre a un objeto de dispositivo. Sin embargo, el nombre de archivo que proporciona el sistema operativo a un controlador (vea WdfFileObjectGetFileName) no incluye el nombre del objeto de dispositivo que usó la aplicación. Por lo tanto, si varios controladores de la pila del controlador proporcionan nombres para sus objetos de dispositivo, el controlador no puede determinar qué nombre de objeto usó para abrir el dispositivo. Como resultado, una aplicación podría abrir el dispositivo con un descriptor de seguridad menos restrictivo que el controlador espera.
Los objetos de dispositivo físico (PPO) deben tener nombres. Normalmente, los controladores de bus basados en marcos no especifican un nombre para un PDO, ya que el marco (de forma predeterminada) indica al sistema operativo que genere un nombre.
Por otro lado, un controlador basado en marcos puede asignar un nombre de dispositivo a un objeto de dispositivo llamando a WdfDeviceInitAssignName. Un controlador debe asignar un nombre a un objeto de dispositivo funcional (FDO), filtrar objeto de dispositivo (do de filtro) o PDO solo si el controlador debe admitir una aplicación anterior que espera un nombre de dispositivo específico o si el controlador pertenece a una pila de controladores anterior cuya arquitectura requiere nombres de objeto.
En lugar de asignar nombres de DO y filtrar, los controladores WDM y los controladores basados en marcos deben proporcionar interfaces de dispositivo a las que pueden acceder las aplicaciones. El sistema operativo obtiene el descriptor de seguridad de una interfaz de dispositivo del PDO del dispositivo y de las entradas del Registro que especifica el archivo INF de un paquete de controladores. Un controlador de bus puede proporcionar interfaces de dispositivo para un PDO si los dispositivos del controlador funcionan en modo sin procesar, sin un controlador de función.
Algunos controladores deben llamar a WdfDeviceCreateSymbolicLink para crear nombres de vínculo simbólicos para sus dispositivos. Por ejemplo, un controlador podría crear un nombre de dispositivo MS-DOS si las aplicaciones esperan ver un nombre ms-DOS para el dispositivo. Si el controlador crea un nombre de vínculo simbólico para un FDO o do de filtro sin nombre, el marco asocia el nombre de vínculo simbólico con el nombre del PDO. (Los dispositivos de control no están asociados a un PDO, por lo que el controlador no puede crear un nombre de vínculo simbólico para un dispositivo de control sin nombre).
Proporcionar descriptores de seguridad para objetos e interfaces de dispositivo
Cada objeto de dispositivo con nombre debe tener un descriptor de seguridad. El sistema operativo usa el descriptor de seguridad del objeto de dispositivo para determinar los tipos de usuarios que tienen permiso para acceder a un dispositivo y sus interfaces de dispositivo. Los descriptores de seguridad se pueden asignar a objetos de dispositivo mediante:
El sistema operativo, que proporciona un descriptor de seguridad predeterminado para los objetos de dispositivo (consulte Controlar el acceso a dispositivos).
El marco, que proporciona un descriptor de seguridad predeterminado (mediante el SDDL_DEVOBJ_SYS_ALL_ADM_ALL valor) si el controlador llama a WdfDeviceInitAssignName para asignar un nombre a un objeto de dispositivo (consulte SDDL para objetos de dispositivo).
El controlador, que puede invalidar el descriptor de seguridad predeterminado del marco llamando a WdfDeviceInitAssignSDDLString.
De forma predeterminada, el sistema operativo también usa el descriptor de seguridad del PDO del dispositivo para determinar los derechos de acceso a las interfaces de dispositivo que proporciona un controlador.
Un paquete de controladores puede proporcionar un archivo INF que especifica los descriptores de seguridad de un dispositivo con una directiva AddReg inf dentro de una sección INF DDInstall.HW.
Para obtener más información sobre cómo especificar descriptores de seguridad en archivos INF, consulte Creación de instalaciones de dispositivos seguros.
Si el controlador crea archivos PPO para dispositivos que funcionan en modo sin procesar, el controlador debe especificar una clase de configuración de dispositivo cuando llame a WdfPdoInitAssignRawDevice. Además, si el controlador crea dispositivos de control, puede llamar a WdfDeviceInitSetDeviceClass para especificar una clase de configuración de dispositivo. En ambos casos, los administradores del sistema pueden usar la clave del Registro de la clase de instalación especificada para almacenar descriptores de seguridad para el dispositivo.
Para obtener información sobre cómo determina el sistema operativo qué descriptor de seguridad se va a usar para un dispositivo, consulte Control del acceso a dispositivos.
Cuando el marco crea un objeto de dispositivo, siempre establece la marca FILE_DEVICE_SECURE_OPEN para que el sistema operativo compruebe el descriptor de seguridad de un dispositivo antes de permitir que una aplicación acceda a los nombres dentro del espacio de nombres del dispositivo. Para obtener más información sobre la marca de FILE_DEVICE_SECURE_OPEN y el espacio de nombres del dispositivo, consulte Control del acceso al espacio de nombres del dispositivo.