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 quando está abrindo 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 Identificadores de objeto.

  • O modo de exibição deve ser mapeado somente de um thread do sistema. (Caso contrário, a exibição será acessível a partir do processo cujo contexto ele é criado.) Um driver pode garantir que a exibição seja mapeada do processo do sistema usando 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 quando estiver abrindo 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 Identificadores de objeto.

  • A exibição é mapeada no contexto de thread do processo que compartilha a exibição. Um driver de nível mais alto pode garantir que a exibição seja mapeada no contexto do processo atual executando a operação de mapeamento em uma rotina de expedição, como DispatchDeviceControl. Rotinas de expedição 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 exibição em uma rotina de expedição. Para obter mais informações, consulte Contexto do Thread do Driver.

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

O driver também deve validar o conteúdo da exibição conforme necessário. O gravador de driver não pode assumir que apenas um componente confiável do modo de usuário terá acesso ao modo de exibiçã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 fechando o identificador. A referência de 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 a \Device\PhysicalMemory.