Controlando o acesso ao dispositivo em drivers KMDF
Os drivers devem ajudar a impedir que os usuários acessem inadequadamente os dispositivos e arquivos de um computador. Para impedir o acesso não autorizado a dispositivos e arquivos, você deve:
Nomeie objetos de dispositivo somente quando necessário.
Forneça descritores de segurança para objetos e interfaces de dispositivo.
Nomeando objetos de dispositivo somente quando necessário
Como a maioria dos drivers do WDM (Modelo de Driver do Windows), os drivers baseados em estrutura normalmente não nomeam seus objetos de dispositivo. Os aplicativos podem acessar um dispositivo especificando um nome de objeto de dispositivo, portanto, cada nome de objeto de dispositivo adicional representa um caminho adicional que um aplicativo pode usar para acessar o dispositivo.
Para impedir o acesso não autorizado a um dispositivo, cada driver pode especificar um descritor de segurança quando ele nomeia um objeto de dispositivo. No entanto, o nome do arquivo que o sistema operacional fornece a um driver (consulte WdfFileObjectGetFileName) não inclui o nome do objeto do dispositivo usado pelo aplicativo. Portanto, se vários drivers na pilha do driver fornecerem nomes para seus objetos de dispositivo, o driver não poderá determinar qual nome de objeto o aplicativo usou para abrir o dispositivo. Como resultado, um aplicativo pode abrir o dispositivo com um descritor de segurança menos restritivo do que o driver espera.
Os PDOs (objetos de dispositivo físico) devem ter nomes. Normalmente, os drivers de barramento baseados em estrutura não especificam um nome para um PDO, pois a estrutura (por padrão) instrui o sistema operacional a gerar um nome.
Por outro lado, um driver baseado em estrutura pode atribuir um nome de dispositivo a um objeto de dispositivo chamando WdfDeviceInitAssignName. Um driver deve nomear um FDO (objeto de dispositivo funcional), um objeto de dispositivo de filtro (filter DO) ou PDO somente se o driver precisar dar suporte a um aplicativo mais antigo que espere um nome de dispositivo específico ou se o driver pertencer a uma pilha de driver mais antiga cuja arquitetura requer nomes de objeto.
Em vez de nomear FDOs e filtrar DOs, drivers WDM e drivers baseados em estrutura devem fornecer interfaces de dispositivo que os aplicativos podem acessar. O sistema operacional obtém o descritor de segurança de uma interface do dispositivo do PDO do dispositivo e de entradas do Registro especificadas pelo arquivo INF de um pacote de driver. Um driver de barramento pode fornecer interfaces de dispositivo para um PDO se os dispositivos do driver operam no modo bruto, sem um driver de função.
Alguns drivers devem chamar WdfDeviceCreateSymbolicLink para criar nomes simbólicos de link para seus dispositivos. Por exemplo, um driver pode criar um nome de dispositivo MS-DOS se os aplicativos esperam ver um nome MS-DOS para o dispositivo. Se o driver criar um nome de link simbólico para um FDO sem nome ou filtro DO, a estrutura associará o nome do link simbólico ao nome do PDO. (Os dispositivos de controle não estão associados a um PDO, portanto, o driver não pode criar um nome de link simbólico para um dispositivo de controle sem nome.)
Fornecendo descritores de segurança para objetos e interfaces de dispositivo
Cada objeto de dispositivo nomeado deve ter um descritor de segurança. O sistema operacional usa o descritor de segurança do objeto de dispositivo para determinar os tipos de usuários que têm permissão para acessar um dispositivo e suas interfaces de dispositivo. Os descritores de segurança podem ser atribuídos a objetos de dispositivo:
O sistema operacional, que fornece um descritor de segurança padrão para objetos de dispositivo (consulte Controlando o acesso ao dispositivo).
A estrutura, que fornece um descritor de segurança padrão (usando o valor SDDL_DEVOBJ_SYS_ALL_ADM_ALL) se o driver chamar WdfDeviceInitAssignName para atribuir um nome a um objeto de dispositivo (consulte SDDL for Device Objects).
Seu driver, que pode substituir o descritor de segurança padrão da estrutura chamando WdfDeviceInitAssignSDDLString.
Por padrão, o sistema operacional também usa o descritor de segurança do PDO do dispositivo para determinar os direitos de acesso às interfaces de dispositivo fornecidas por um driver.
Um pacote de driver pode fornecer um arquivo INF que especifica os descritores de segurança de um dispositivo com uma diretiva INF AddReg dentro de uma seção INF DDInstall.HW.
Para obter mais informações sobre como especificar descritores de segurança em arquivos INF, consulte Criando instalações de dispositivo seguro.
Se o driver criar PDOs para dispositivos que operam no modo bruto, o driver deverá especificar uma classe de configuração de dispositivo quando chamar WdfPdoInitAssignRawDevice. Além disso, se o driver criar dispositivos de controle, ele poderá chamar WdfDeviceInitSetDeviceClass para especificar uma classe de configuração de dispositivo. Em ambos os casos, os administradores do sistema podem usar a chave do Registro da classe de instalação especificada para armazenar descritores de segurança para o dispositivo.
Para obter informações sobre como o sistema operacional determina qual descritor de segurança usar para um dispositivo, consulte Controlando o acesso ao dispositivo.
Quando a estrutura cria um objeto de dispositivo, ela sempre define o sinalizador FILE_DEVICE_SECURE_OPEN para que o sistema operacional marcar o descritor de segurança de um dispositivo antes de permitir que um aplicativo acesse quaisquer nomes no namespace do dispositivo. Para obter mais informações sobre o sinalizador FILE_DEVICE_SECURE_OPEN e o namespace do dispositivo, consulte Controlando o acesso ao namespace do dispositivo.