Compartilhar via


Testes de penetração (conceitos básicos do dispositivo)

Os testes de Penetração de Conceitos Básicos do Dispositivo executam várias formas de ataques de entrada, que são um componente crítico dos testes de segurança. Os testes de ataque e penetração podem ajudar a identificar vulnerabilidades em interfaces de software.

Penetração

Os testes de penetração incluem duas categorias de testes: testes fuzz e testes de E/S Spy e Ataque de E/S . Os testes do Fuzz também foram um recurso da ferramenta de teste Exceriser de Caminho do Dispositivo .

Teste Descrição

Desabilitar o Espião de E/S

Desabilite o Spy de E/S em 1 ou mais dispositivos.

Testar binário: Devfund_IOSpy_DisableSupport.wsc

Método de teste: DisableIoSpy

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

Exibir dispositivo habilitado para Espião de E/S

Exibir dispositivos que têm o Espião de E/S habilitado neles.

Testar binário: Devfund_IOSpy_DisplayEnabledDevices.wsc

Método de teste: DisplayIoSpyDevices

Habilitar o Espião de E/S

Habilite o Espião de E/S em um ou mais dispositivos.

Testar binário: Devfund_IOSpy_EnableSupport.wsc

Método de teste: EnableIoSpy

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

DFD – especifica o caminho para o arquivo de dados IoSpy. O local padrão é %SystemDrive%\DriverTest\IoSpy

Teste de API do Fuzz Misc

Os testes de API do Fuzz Misc são testes que determinam se o driver pode lidar com uma variedade de chamadas comuns de drivers de modo kernel.

Os testes incluem os seguintes testes:

  • Chamadas para ZwReadFile e ZwWriteFile, especificando ponteiros de buffer de dados válidos, comprimentos variados (incluindo zero) e deslocamentos de bytes variados, incluindo deslocamentos de bytes de zero, -1 e 64 bits.

  • Chamadas para cancelar a E/0 e liberar buffers.

  • Uma série de chamadas de consulta de diretório usando classes comuns de informações de arquivo com ponteiros de buffer de dados de usuário válidos e comprimentos de buffer variados (incluindo zero).

  • Chamadas de consulta de diretório semelhantes às emitidas por programas em execução sob controle da VDM (Máquina virtual dos DOS).

  • Chama para recuperar os atributos estendidos de um arquivo com tamanhos e comprimentos de buffer variados.

  • Chamadas para criar e fechar objetos de seção, com proteção de página de seção variável e atributos de alocação seccional (seção confirmada, seção arquivo de imagem).

  • Chamadas para bloquear e desbloquear arquivos.

  • Chamadas para recuperar entradas de cota para um volume.

  • Teste de atributos de arquivo, uma série de consultas de atributo de arquivo com ponteiros válidos para uma estrutura ObjectAttributes .

    O Teste de Atributos de Arquivo tem um teste opcional de comprimento zero. Ao recuperar os atributos estendidos de um arquivo, o teste do Fuzz passa por uma consulta em branco (comprimento zero) e um endereço de buffer inválido para o driver.

Binário de teste: Devfund_DevicePathExerciser.dll

Método de teste: DoMiscAPITest

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

API do Fuzz Misc com teste de consulta de comprimento zero

Esse teste executa os mesmos testes que o teste de API do Fuzz Misc e, desta vez, passa por uma consulta em branco (comprimento zero) e um endereço de buffer inválido para o driver ao tentar recuperar os atributos estendidos de um arquivo.

Binário de teste: Devfund_DevicePathExerciser.dll

Método de teste: DoMiscAPIWithZeroLengthTest

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Teste de abertura e fechamento do Fuzz

Este teste executa milhares de sequências create-open-close.

Para obter informações detalhadas sobre esse teste, consulte Sobre o teste aberto e fechado do Fuzz.

Binário de teste: Devfund_DevicePathExerciser.dll

Método de teste: DoOpenCloseTest

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Teste de Informações de Arquivo de Consulta e Definição do Fuzz

Esse teste emite chamadas para recuperar e alterar as informações de objeto, arquivo e volume dos dispositivos.

Durante o Teste de Informações de Arquivo de Consulta e Defina, o problema de teste do Fuzz chama para recuperar e alterar as informações de objeto, arquivo e volume de dispositivos abertos pelas Operações Abertas Básicas e outras operações abertas, incluindo as operações executadas pelo teste de sub-abertura do Fuzz.

O teste do Fuzz emite cada consulta ou chamada definida pelo menos 1024 vezes com um buffer válido e uma variedade de comprimentos de buffer e classes de informações de arquivo. Uma solicitação de cada tipo também é enviada com um ponteiro de buffer inválido e um comprimento de buffer zero.

Se você usar o parâmetro ChangeBufferProtectionFlags , que define a opção de proteção, o teste do Fuzz varia a configuração de segurança no buffer em cada consulta e define a chamada.

Esse teste também executa o teste de sub-abertura do Fuzz.

Esse teste usa as funções ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFile e ZwSetVolumeInformationFile .

Binário de teste: Devfund_DevicePathExerciser.dll

Método de teste: DoQueryAndSetFileInformationTest

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Teste de Consulta e Definir Segurança do Fuzz

Esse teste emite chamadas para recuperar o descritor de segurança e alterar o estado de segurança dos dispositivos.

Durante o Teste de Segurança de Consulta e Definição, o teste do Fuzz emite chamadas para recuperar o descritor de segurança e alterar o estado de segurança dos dispositivos abertos pelas Operações Abertas Básicas e outras operações abertas, incluindo as operações executadas pelo teste de sub-abertura do Fuzz.

o teste do Fuzz emite cada consulta ou chamada definida pelo menos 1024 vezes com um buffer válido e uma variedade de comprimentos de buffer e tipos de informações de segurança (OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION e nenhum tipo de informação). Uma solicitação de cada tipo também é enviada com um ponteiro de buffer inválido e um comprimento de buffer zero.

Se você usar o parâmetro ChangeBufferProtectionFlags , que define a opção de proteção, o teste do Fuzz varia a configuração de segurança no buffer em cada consulta e define a chamada.

Binário de teste: Devfund_DevicePathExerciser.dll

Método de teste: DoQueryAndSetSecurityTest

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Teste FSCTL Aleatório do Fuzz/Teste DE IOCTL Aleatório fuzz

Esse teste emite uma série de chamadas para a função DeviceIoControl com códigos de função, tipos de dispositivo, métodos de transferência de dados e requisitos de acesso selecionados aleatoriamente de um intervalo de valores especificado. As chamadas incluem buffers de entrada e saída com ponteiros e comprimentos de buffer válidos e inválidos e conteúdo gerado aleatoriamente.

Durante testes aleatórios, o teste fuzz emite uma série de chamadas para a função DeviceIoControl com códigos de função, tipos de dispositivo, métodos de transferência de dados e requisitos de acesso selecionados aleatoriamente de um intervalo de valores especificado. As chamadas incluem buffers de entrada e saída com ponteiros e comprimentos de buffer válidos e inválidos e conteúdo gerado aleatoriamente.

O teste fuzz executa os testes aleatórios em todos os dispositivos abertos durante as Operações Abertas Básicas e testes abertos adicionais. Você pode personalizar esse teste usando os seguintes parâmetros:

  • Use MinFunctionCode e MaxFunctionCode para especificar o intervalo de códigos de função IOCTL ou FSCTL usados nas chamadas

  • Use MinDeviceType e MaxDeviceType para especificar o intervalo de tipos de dispositivo usados nas chamadas

  • Use SeedNumber para especificar um número de semente para a rotina de geração de número aleatório.

A função que o teste fuzz usa para gerar números aleatórios para o teste usa um número de semente, um número inicial para o algoritmo de geração de número aleatório. Para reproduzir as condições de teste, use o parâmetro de número de semente para especificar o número de semente usado na avaliação de teste original.

Um Teste Aleatório Personalizado é incluído como parte do teste aleatório. O teste aleatório personalizado usa os resultados do teste aleatório para examinar mais detalhadamente a resposta dos drivers às solicitações IOCTL ou FSCTL. O teste aleatório personalizado investiga as áreas que o teste aleatório perdeu e aquelas nas quais o driver não respondeu conforme o esperado com base no status retornado pelas chamadas de teste aleatórias.

Binário de teste: Devfund_DevicePathExerciser.dll

Métodos de teste: DoRandomIOCTLTest, DoRandomFSCTLTest

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Sub-opens test

O teste executa uma série rápida de chamadas para abrir objetos no namespace do dispositivo. Nessas chamadas, ele passa um caminho que começa com o dispositivo e inclui nomes arbitrários e cadeias de caracteres sem sentido de comprimento e conteúdo variados.

Durante um teste aberto relativo, (também conhecido como um teste sub-aberto), o teste fuzz tenta abrir objetos no namespace do dispositivo.

Durante esse teste, o teste fuzz executa uma série rápida de chamadas para abrir objetos no namespace dos dispositivos abertos usando Operações Abertas Básicas e outras operações abertas. Nessas chamadas, o teste fuzz passa por um caminho que começa com o dispositivo e inclui nomes arbitrários e cadeias de caracteres sem sentido de comprimento e conteúdo variados.

Esse teste determina como o driver ou o sistema de arquivos gerencia solicitações abertas em seu namespace. Em particular, se o driver não der suporte a solicitações abertas em seu namespace, ele deverá impedir o acesso não autorizado, seja falhando nas solicitações ou definindo o FILE_DEVICE_SECURE_OPEN característica do dispositivo quando ele usa IoCreateDevice ou IoCreateDeviceSecure para criar o objeto do dispositivo.

Para obter mais informações sobre o namespace de um dispositivo, consulte Controlando o acesso ao namespace do dispositivo.

Binário de teste: Devfund_DevicePathExerciser.dll

Método de teste: DoSubOpensTest

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Sub-opens with Streams test

Esse teste tenta abrir uma variedade de fluxos de dados nomeados no dispositivo. O teste usa uma série de nomes de fluxo arbitrários com conteúdo e caracteres que podem ser válidos para outros usos em alguns dispositivos.

Durante o Teste de Fluxos, o teste do Fuzz tenta abrir uma variedade de fluxos de dados nomeados no dispositivo. Os testes usam uma série de nomes de fluxo arbitrários com conteúdo e caracteres que podem ser válidos para outros usos em alguns dispositivos. Esse teste determina se o driver pode lidar corretamente com solicitações de fluxo de dados, especialmente se o driver exporta um dispositivo que não dá suporte ou antecipa fluxos de dados.

Um fluxo de dados nomeado é um atributo de um objeto de arquivo. Especifique um fluxo de dados nomeado escrevendo o nome do arquivo, dois-pontos e o nome do fluxo de dados, por exemplo, "File01.txt:AccessDate" em que AccessDate é um fluxo de dados nomeado, ou seja, um atributo do arquivo File01.txt.

O teste do Fuzz registra os nomes de fluxo usados no teste.

Binário de teste: Devfund_DevicePathExerciser.dll

Método de teste: DoSubOpensWithStreamsTest

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Teste FSCTL do Buffer do Zero-Length Fuzz/Teste IOCTL do Buffer Zero-Length Fuzz

Esse teste emite uma série de chamadas para a função DeviceIoControl com comprimentos de buffer de entrada e/ou saída de 0. O teste gera diferentes códigos de controle do sistema de arquivos usando diferentes códigos de função, tipos de dispositivo, métodos de transferência de dados e requisitos de acesso.

Durante o teste de buffer Zero-Length, o teste do Fuzz emite uma série de chamadas para a função DeviceIoControl com comprimentos de buffer de entrada e/ou saída de 0. O teste gera diferentes códigos de controle de E/S usando diferentes códigos de função, tipos de dispositivo, métodos de transferência de dados e requisitos de acesso. Para obter informações sobre o conteúdo dos códigos de controle de E/S, consulte Definindo códigos de controle de E/S.

Para testar a manipulação do driver de ponteiros de buffer inválidos, os ponteiros de buffer nessas chamadas de modo de usuário especificam endereços altos no espaço de endereço virtual do kernel, como 0xFFFFFC00).

O teste do Fuzz executa o teste de buffer Zero-Length em todos os dispositivos abertos durante os testes abertos básicos e adicionais. Você pode personalizar esse teste usando os parâmetros de comando MinFunctionCode e MaxFunctionCode para especificar o intervalo de códigos de função IOCTL ou FSCTL usados nas chamadas e MinDeviceType e MaxDeviceType para especificar o intervalo de tipos de dispositivo usados nas chamadas.

Binário de teste: Devfund_DevicePathExerciser.dll

Métodos de teste: DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Executar ataque de E/S

Executa o Ataque de E/S no dispositivo ou dispositivos especificados.

Testar binário: Devfund_IOAttack_DeleteDataFile.wsc

Método de teste: RunIoAttack

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

Sobre o teste de abertura e fechamento do Fuzz

O teste aberto e fechado do Fuzz emprega várias maneiras diferentes de abrir e fechar instâncias do dispositivo ou dispositivos especificados: Operações Abertas Básicas, Operações Abertas de Dispositivo Direto e um teste Abrir e Fechar.

Operações Abertas Básicas

Durante as Operações Abertas Básicas, o teste do Fuzz abre repetidamente (cria) instâncias dos dispositivos especificados ou dos dispositivos exportados pelo driver especificado usando diferentes métodos e opções.

O teste do Fuzz sempre executa as Operações Abertas Básicas. Você não precisa selecioná-los e não pode excluí-los de uma sessão de teste.

O teste do Fuzz executa todas as operações abertas no modo de usuário chamando serviços do sistema (Rotinas ZwXxx) apropriados para o dispositivo. Se uma chamada aberta retornar um identificador para o dispositivo, o teste do Fuzz usará o identificador para executar os outros testes de dispositivo selecionados para a sessão de teste.

Há cinco tipos de Operações Abertas Básicas:

  • Aberto padrão. O teste do Fuzz abre o dispositivo de forma assíncrona e especifica apenas o nome do dispositivo nativo.

  • Abra com barra invertida adicionada. o teste do Fuzz emite uma chamada aberta para o nome do dispositivo seguido por uma barra invertida (), como \device\cdrom\, como se a chamada fosse para abrir um diretório raiz dentro do dispositivo.

    Esta operação determina como o driver ou o sistema de arquivos gerencia solicitações abertas em seu namespace. Em particular, se o dispositivo não oferecer suporte a solicitações abertas em seu namespace, o driver deverá impedir o acesso não autorizado, seja falhando nas solicitações ou definindo a característica do dispositivo FILE_DEVICE_SECURE_OPEN quando chamar IoCreateDevice ou IoCreateDeviceSecure para criar o objeto do dispositivo.

  • Abra como um pipe nomeado. O teste do Fuzz abre o dispositivo e estabelece um pipe nomeado para o dispositivo. O parâmetro de acesso (ShareAccess) é inicialmente definido como leitura e gravação, mas é ajustado se a solicitação falhar. Se o dispositivo não der suporte a pipes nomeados, ele deverá falhar na solicitação.

  • Abra como um maillot. o teste do Fuzz abre o dispositivo como um maillot. Se o dispositivo não der suporte a esse tipo de conexão, ele deverá falhar na solicitação.

  • Abra como uma conexão de árvore. O teste do Fuzz abre o dispositivo como uma conexão de árvore para uso no acesso remoto à rede. O parâmetro de acesso (ShareAccess) é inicialmente definido como leitura e gravação, mas é ajustado se a solicitação falhar. Se o dispositivo não der suporte a esse tipo de conexão, ele deverá falhar na solicitação.

Os parâmetros usados nas chamadas abertas variam para acomodar as características do dispositivo e tornar provável que as chamadas tenham êxito. Por exemplo, se uma operação aberta básica falhar porque a chamada não atendeu aos requisitos de segurança do dispositivo, o teste do Fuzz repetirá a operação aberta com uma solicitação de acesso menor. Por exemplo, se uma operação aberta que solicitou acesso de gravação retornar um erro de violação de segurança, a abertura será repetida com uma solicitação de acesso de leitura.

Operações abertas de dispositivo direto

Durante as Operações Abertas do Dispositivo Direto, o teste do Fuzz abre o dispositivo diretamente, como um dispositivo, não como um arquivo em um sistema de arquivos. As operações de abertura de dispositivo direto são sempre síncronas. Se a chamada for bem-sucedida, o teste do Fuzz usará o identificador fornecido para executar outros testes selecionados.

Abrir e fechar teste

Durante o teste Abrir e Fechar, o teste do Fuzz cria vários threads, cada um deles executando milhares de sequências create-open-close. Isso testa a capacidade do driver de lidar com um volume extraordinário de chamadas simples e antecipadas.

O Open and Close Test usa as mesmas opções usadas em Operações Abertas Básicas e Abrir com testes backslash adicionados e são executadas pouco antes desses testes.

Como testar um driver em runtime usando o Visual Studio

Como selecionar e configurar os testes de Conceitos Básicos do Dispositivo

Testes de conceitos básicos do dispositivo

Plug-ins de E/S simples do WDTF fornecidos

Como testar um driver em runtime em um prompt de comando