Verificações de segurança do verificador de driver

A opção Verificações de Segurança do Verificador de Driver monitora o driver quanto a 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:

  • Chamar rotinas ZwXxx do kernel 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. Portanto, o driver deve investigar todos os buffers de modo de usuário recebidos de aplicativos e colocá-los na memória do modo kernel (por exemplo, em um bloco de pool ou estrutura de dados alocada na pilha de kernel) antes de chamar a rotina ZwXxx do kernel. 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 de kernel com UNICODE_STRINGs malformados como parâmetros. Quando o driver chama qualquer rotina ZwXxx , o Verificador de Driver verifica os parâmetros UNICODE_STRING valores. 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 são um número ímpar. Esses dois valores sempre devem ser pares porque representam o número de bytes usados para representar uma cadeia de caracteres Unicode.
  • Chamar rotinas do kernel ZwXxx 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 OBJECT_ATTRIBUTE estruturas. Os membros de cada parâmetro de estrutura OBJECT_ATTRIBUTE são submetidos às mesmas verificações de endereços no modo de usuário e UNICODE_STRING valores 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 atinge o valor 0, o objeto se torna qualificado 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 Selecionando 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 entra em vigor imediatamente, mas é perdida quando você desliga ou reinicia o computador. Para obter detalhes, consulte Usando 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. Inicie 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.