Partilhar via


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

A opção Verificações de Segurança do Verificador de Driver monitora o driver em busca de erros comuns que possam resultar em vulnerabilidades de segurança. Esta 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 ZwXxx do kernel com endereços de 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 de 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 de modo kernel. Assim, o driver deve sondar quaisquer buffers de modo de usuário recebidos de aplicativos e colocá-los na memória de modo kernel (por exemplo, em um bloco de pool ou estrutura de dados alocada na pilha do kernel) antes de chamar a rotina ZwXxx do kernel. O driver deve usar o buffer capturado em vez do buffer de modo de usuário como um parâmetro da rotina ZwXxx .

  • Chamar rotinas ZwXxx do kernel usando parâmetros UNICODE_STRINGs malformados. Quando o driver chama qualquer rotina ZwXxx, o Verificador de Controladores verifica todos os parâmetros que são valores UNICODE_STRING. Os erros comuns detetados pelo Verificador de Driver em tais 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 iguais 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 parâmetro. Quando o driver chama qualquer rotina ZwXxx, o Verificador de Driver verifica todos 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 para endereços de modo de usuário e valores de UNICODE_STRING descritos acima.

  • Parâmetros Irp-RequestorMode> e I/O Request inconsistentes. Sempre que o 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 de 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 de 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 elegível para ser liberado. O gerenciador de objetos pode liberá-lo imediatamente ou liberá-lo mais tarde. O Verificador de Driver verifica 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 esta opção

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

  • 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 ficará ativa depois de reiniciar o computador.

    A partir do Windows Vista, você também pode ativar e desativar as 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ção Volátil.

    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 Gestor do Verificador de Drivers

    1. Inicie o Driver Verifier Manager. Digite Verifier numa janela da Linha de Comandos.
    2. Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
    3. Selecione configurações individuais de 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 Verificadores de Driver, clique em Criar Configurações Padrão.