Compartilhar via


Verificações de segurança do Verificador de Driver

A opção Verificações de Segurança do Verificador de Driver monitora o driver em busca de erros comuns que podem resultar em vulnerabilidades de segurança. Essa opção está disponível a partir do Windows Vista.

Especificamente, a opção Verificações de Segurança procura o seguinte comportamento inadequado do driver:

  • Chamando rotinas do kernel ZwXxx com endereços no modo de usuário como parâmetros. Quando o driver chama qualquer rotina ZwXxx , o Verificador de Driver verifica se nenhum dos parâmetros são endereços no modo de usuário. Ao chamar qualquer rotina ZwXxx , o KPROCESSOR_MODE atual se torna KernelMode e todos os parâmetros passados para essa rotina são tratados como se fossem endereços no modo kernel. Assim, o driver deve validar os buffers no modo de usuário recebidos de aplicativos e colocá-los na memória do modo núcleo (por exemplo, em um bloco de pool ou estrutura de dados alocada na pilha do núcleo) antes de chamar a rotina do kernel ZwXxx. O driver deve usar o buffer capturado em vez do buffer do modo de usuário como um parâmetro da rotina ZwXxx .

  • Chamar rotinas ZwXxx do kernel com UNICODE_STRINGs malformados como parâmetros. Quando o driver chama uma rotina ZwXxx, o Verificador de Driver verifica os valores UNICODE_STRING dos parâmetros. Os erros comuns detectados pelo Verificador de Driver nessas cadeias de caracteres incluem:

    • O campo de buffer aponta para a memória do modo de usuário.
    • Os parâmetros Length ou MaximumLength estão incorretos. Por exemplo, MaximumLength<Length. Ou um ou ambos os valores é um número ímpar. Ambos os valores devem ser sempre uniformes porque representam o número de bytes usados para representar uma cadeia de caracteres Unicode.
  • Chamando rotinas ZwXxx do kernel com uma estrutura de OBJECT_ATTRIBUTES incorreta como um parâmetro. Quando o driver chama qualquer rotina ZwXxx, o Verificador de Driver verifica os parâmetros que são estruturas OBJECT_ATTRIBUTE. Os membros de cada parâmetro de estrutura OBJECT_ATTRIBUTE são submetidos às mesmas verificações de endereços de modo de usuário e valores UNICODE_STRING descritos acima.

  • Parâmetros de Solicitação de E/S e Irp-RequestorMode> inconsistentes. Sempre que Irp-> RequestorMode é definido como KernelMode, o Verificador de Driver verifica se nenhum parâmetro de Solicitação de E/S, Irp-AssociatedIrp.SystemBuffer> ou Irp-UserBuffer>, são endereços no modo de usuário.

A partir do Windows 7, quando você habilita qualquer opção verificador de driver, o Verificador de Driver verifica o seguinte comportamento do driver:

O contador de referência de objeto muda de 0 para 1. Quando o gerenciador de objetos do kernel do Windows cria um objeto, como um objeto File ou um objeto Thread, o contador de referência do novo objeto é definido como 1. Chamadas para funções do sistema como ObReferenceObjectByPointer ou ObReferenceObjectByHandle incrementam o contador de referência. Cada chamada para ObDereferenceObject para o mesmo objeto diminui o contador de referência.

Depois que o contador de referência atingir o valor 0, o objeto se tornará elegível para ser liberado. O gerenciador de objetos pode liberá-lo imediatamente ou pode liberá-lo mais tarde. O Verificador de Driver verifica se há chamadas subsequentes para ObReferenceObjectByPointer e ObReferenceObject para o mesmo objeto. Essas chamadas alteram o contador de referência de 0 para 1, o que significa que o driver incrementou o contador de referência de um objeto já liberado. Isso é sempre incorreto porque pode corromper outras alocações de memória.

Ativando essa opção

Você pode ativar a opção Verificações de Segurança para um ou mais drivers usando o Gerenciador de Verificador de Driver ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionar opções do Verificador de Driver.

  • Usando a linha de comando

    Na linha de comando, a opção Verificações de Segurança é representada pelo Bit 8 (0x100). Para ativar as Verificações de Segurança, use um valor de sinalizador de 0x100 ou adicione 0x100 ao valor do sinalizador. Por exemplo:

    verifier /flags 0x100 /driver MyDriver.sys
    

    A opção estará ativa depois que você reiniciar o computador.

    A partir do Windows Vista, você também pode ativar e desativar verificações de segurança sem reiniciar o computador adicionando o parâmetro /volatile ao comando. Por exemplo:

    verifier /volatile /flags 0x100 /adddriver MyDriver.sys
    

    Essa configuração é efetivada imediatamente, mas é perdida quando você desliga ou reinicia o computador. Para obter detalhes, consulte Como usar configurações voláteis.

    A opção Verificações de Segurança também está incluída nas configurações padrão. Por exemplo:

    verifier /standard /driver MyDriver.sys
    
  • Usando o Gerenciador de Verificador de Driver

    1. Iniciar o Gerenciador de Verificador de Driver. Digite Verificador em uma janela do Prompt de Comando.
    2. Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
    3. Selecione Selecionar configurações individuais em uma lista completa.
    4. Selecione Verificações de Segurança.

    O recurso Verificações de Segurança também está incluído nas configurações padrão. Para usar esse recurso no Gerenciador de Verificador de Driver, clique em Criar Configurações Padrão.