Compartilhar via


Problemas de segurança para objetos e exibições de seção

Os drivers que criam seções e exibições que não devem ser compartilhadas com o modo de usuário devem usar o seguinte protocolo quando estiverem trabalhando com seções e exibições:

  • O driver deve usar um identificador de kernel ao abrir um identificador do objeto de seção. Os drivers podem garantir que um identificador seja um identificador de kernel criando-o no processo do sistema ou especificando o atributo OBJ_KERNEL_HANDLE para o identificador. Para obter mais informações, consulte Object Handles.

  • A visualização deve ser mapeada somente a partir de um thread do sistema. (Caso contrário, o modo de exibição estará acessível a partir do processo em que ele é criado.) Um driver pode garantir que o modo de exibição seja mapeado a partir do processo do sistema utilizando um thread de trabalho do sistema para executar a operação de mapeamento. Para obter mais informações, consulte System Worker Threads and Driver Thread Context.

Os drivers que compartilham uma exibição com um processo de modo de usuário devem usar o seguinte protocolo quando estiverem trabalhando com seções e exibições:

  • O driver, não o processo de modo de usuário, deve criar o objeto de seção e mapear as exibições.

  • Conforme mencionado anteriormente, o driver deve usar um identificador de kernel ao abrir um identificador para o objeto de seção. Os drivers podem garantir que um identificador seja um identificador de kernel criando-o no processo do sistema ou especificando o atributo OBJ_KERNEL_HANDLE para o identificador. Para obter mais informações, consulte Object Handles.

  • A exibição é mapeada no contexto de thread do processo que compartilha a exibição. Um driver de nível superior pode garantir que a visão seja mapeada no contexto do processo atual executando a operação de mapeamento em uma rotina de expedição, tal como DispatchDeviceControl. Rotinas de despacho de drivers de nível inferior são executadas em um contexto de thread arbitrário e, portanto, não podem mapear com segurança uma vista em uma rotina de despacho. Para obter mais informações, consulte Contexto de Thread do Driver.

  • Todos os acessos de memória à view dentro do driver devem ser protegidos por blocos de tryexcept. Um aplicativo mal-intencionado no modo de usuário pode desmapear a visualização ou alterar o estado de proteção da visualização. Qualquer um causaria uma falha no sistema, a menos que protegido por um bloco try-except. Para obter mais informações, consulte de exceções de tratamento de.

O driver também deve validar o conteúdo da exibição conforme necessário. O escritor de driver não pode assumir que apenas um componente confiável do modo de usuário tem acesso à visão.

Um driver que deve compartilhar um objeto de seção com um aplicativo de modo de usuário (que deve ser capaz de criar seus próprios modos de exibição) deve usar o seguinte protocolo:

  • O driver, não o processo de modo de usuário, deve criar o objeto de seção. Os drivers nunca devem usar um identificador passado do modo de usuário.

  • Antes de passar o identificador para o modo de usuário, o driver deve chamar ObReferenceObjectByHandle para obter uma referência ao objeto de seção. Isso impede que um aplicativo mal-intencionado exclua o objeto de seção ao executar o fechamento do handle. A referência do objeto deve ser armazenada na extensão de dispositivo do driver.

  • Depois que o driver não estiver mais usando o objeto de seção, ele deverá chamar ObDereferenceObject para liberar a referência de objeto.

Em sistemas que executam o Microsoft Windows Server 2003 com Service Pack 1 (SP1) e versões posteriores, somente drivers no modo kernel podem abrir \Device\PhysicalMemory. No entanto, os drivers podem decidir dar um identificador a um aplicativo de usuário. Para evitar problemas de segurança, somente os aplicativos de usuário em que o driver confia devem ter acesso ao \Device\PhysicalMemory.