Application Verifier — Visão geral
Resumo
O Application Verifier (AppVerifier) é uma ferramenta de verificação de tempo de execução para código não gerenciado que ajuda a encontrar erros de programação sutis, problemas de segurança e problemas limitados de privilégio de conta de usuário que podem ser difíceis de identificar usando técnicas normais de teste de aplicativos.
Visão geral
Um dos maiores desafios enfrentados por programadores, arquitetos de software, testadores e consultores de segurança é entender os caminhos de execução variáveis dos aplicativos quando implantados em produção. Mesmo com acesso ao código-fonte, é difícil entender tudo o que ocorrerá durante a execução devido diversas dependências (por exemplo, vários grupos contribuindo para o código ou aproveitando componentes externos). O Microsoft AppVerifier pode desempenhar uma função útil em ajudar a gerenciar essa complexidade e os possíveis efeitos colaterais dos bugs. O AppVerifier ajuda a encontrar erros de programação, problemas de segurança e problemas de privilégio de conta de usuário que podem ser difíceis de identificar durante uma aprovação de teste típica.
O Application Verifier (AppVerif.exe) é uma ferramenta de verificação dinâmica para aplicativos de modo de usuário. Essa ferramenta monitora as ações do aplicativo enquanto o aplicativo é executado, submete o aplicativo a diversos estresses e testes e gera um relatório sobre possíveis erros na execução ou no design do aplicativo.
O Application Verifier pode detectar erros em qualquer aplicativo de modo de usuário que não seja baseado em código gerenciado, inclusive drivers de modo de usuário. Ele encontra erros de programação sutis que podem ser difíceis de detectar durante o teste de aplicativo padrão ou teste de driver.
Quando usado durante todo o ciclo de vida de desenvolvimento de software, o AppVerifier pode trazer benefícios em termos de custo para os esforços de desenvolvimento, pois facilita a identificação de problemas logo no início, quando são mais fáceis e baratos de corrigir. Ele também ajuda a detectar erros que podem ter passado despercebidos e garante que o aplicativo final possa ser executado em ambientes restritos (por exemplo, não administrativos).
Suporte ARM64EC
O Verificador de Aplicativos não oferece suporte a ARM64EC.
Instalação do AppVerifier
O Application Verifier está incluído no Windows Software Development Kit (SDK). Para instalar o Application Verifier, marque a respectiva caixa durante a instalação do SDK.
Você pode usar o Application Verifier sozinho ou em conjunto com um depurador de modo de usuário. O usuário atual deve ser um membro do grupo Administradores no computador.
O que o AppVerifier verifica?
O AppVerifier é uma ferramenta projetada para detectar e ajudar a depurar corrupções de memória, vulnerabilidades críticas de segurança e problemas limitados de privilégios de conta de usuário. O AppVerifier ajuda na criação de aplicativos confiáveis e seguros, monitorando a interação de um aplicativo com o sistema operacional Microsoft Windows e definindo o perfil de uso de objetos, o Registro, do sistema de arquivos e as APIs do Win32 (incluindo heaps, identificadores e bloqueios). O AppVerifier também inclui verificações para prever o desempenho do aplicativo em ambientes que não administrativos.
Problemas que o AppVerifier identifica
O AppVerifier ajuda a determinar:
Quando o aplicativo está usando APIs corretamente:
- APIs TerminateThread não seguras.
- Uso correto das APIs de armazenamento local de thread (TLS).
- Uso correto de manipulações de espaço virtual (por exemplo, VirtualAlloc, MapViewOfFile).
- Se o aplicativo está ocultando violações de acesso usando o tratamento de exceções estruturado.
- Se o aplicativo está tentando usar identificadores inválidos.
- Se há corrupções de memória ou problemas no heap.
- Se o aplicativo fica sem memória com poucos recursos.
- Se está ocorrendo o uso correto de seções críticas.
- Se um aplicativo em execução em um ambiente administrativo será bem executado em um ambiente com menos privilégios.
- Se há possíveis problemas quando o aplicativo está sendo executado como um usuário limitado.
- Se há variáveis não inicializadas em chamadas de função futuras no contexto de um thread.
Testes do AppVerifier
O AppVerifier consiste em conjuntos de testes chamados "camadas de verificação". Eles podem ser ativados ou desativados para cada aplicativo testado. Ao expandir a camada de verificação dentro da área de testes, os testes específicos são exibidos. Para ativar um teste para o aplicativo, marque a respectiva caixa de seleção. Para ativar uma camada de verificação inteira, como Básico, marque a caixa de seleção no nível superior.
Há treze tipos diferentes de teste que o AppVerifier pode executar.
Básico - No mínimo, você deve executar o Application Verifier com a configuração Básico selecionada. Cada um deles testará uma área que causará falhas ou outros cenários negativos, com um impacto direto e significativo na experiência do cliente. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Compatibilidade - Os testes da camada de verificação de Compatibilidade ajudam a identificar um aplicativo que pode ter problemas com o sistema operacional Microsoft Windows. Muitas dessas verificações também podem ser usadas para testar os requisitos do logotipo. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Cuzz - A camada de verificação Fuzzing de simultaneidade (Cuzz) detecta bugs de simultaneidade e condições de corrida de dados. O Cuzz ajusta o agendamento de threads injetando atrasos aleatórios em pontos-chave no código de um aplicativo. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Simulação de poucos recursos - A simulação de poucos recursos tenta simular um ambiente com poucos recursos, como falta de memória. Essa simulação identificará bugs que ocorrem em condições de pouca memória. Ela também é conhecida como injeção de falhas. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
LuaPriv - Os testes de previsão de privilégios limitados da conta de usuário (LuaPriv) são tanto preditivos quanto de diagnóstico e trabalham para revelar problemas relacionados à execução de um aplicativo com privilégio administrativo e se o aplicativo funcionaria bem se fosse executado com menos privilégios (geralmente, usuário normal). Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Diversos - Os testes diversos consistem em uma variedade de testes, por exemplo, para APIs perigosas que executam ações inseguras. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Sistema de rede - Os testes de sistema de rede procuram o uso indevido de APIs do WinSock. Por exemplo, se uma API de sistema de rede foi chamada antes de uma WSAStartup() bem-sucedida ou depois de uma chamada WSACleanup() bem-sucedida de balanceamento ter sido feita. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
NTLM - Monitora o uso das APIs de autenticação AcquireCredentialsHandle e InitializeSecurityContext para detectar usos do protocolo NTLM. O NTLM é um protocolo de autenticação desatualizado com falhas que possivelmente comprometem a segurança dos aplicativos e do sistema operacional. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Impressão - O Verificador de Impressão ajuda a localizar e solucionar problemas que podem ocorrer quando um aplicativo chama o subsistema de impressão. O Verificador de Impressão tem como alvo as duas camadas do subsistema de impressão, a camada PrintAPI e a camada PrintDriver. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Serviços Web - A camada de Verificação da API de Serviços Web do Windows (WWSAPI) funciona para verificar o uso adequado do WWSAPI, como um WWSAPI sendo chamado que faz referência a um objeto WWSAPI intrínseco inválido ou WWSAPI sendo chamado com referências a um único objeto encadeado já em uso. Para obter mais informações, consulte Application Verifier — Testes no Application Verifier
Serviços - Os testes de serviços verificam o uso adequado dos Serviços do Windows. Por exemplo, se os serviços estão sendo iniciados e interrompidos corretamente. Para obter informações sobre as exceções de código de interrupção geradas por esses testes, consulte Application Verifier — Códigos de interrupção e definições.
Perf - O teste Perf verifica o uso eficiente de APIs que afetam o desempenho do sistema e o consumo de energia, como chamar uma função do Windows que usa um período de espera incorreto. Para obter informações sobre as exceções de código de interrupção geradas por esses testes, consulte Application Verifier — Códigos de interrupção e definições.
Hangs - O teste Hangs testa o uso de APIs que fazem com que o sistema pare de responder, por exemplo, quando o thread DllMain está aguardando outro thread que foi bloqueado. Para obter informações sobre as exceções de código de interrupção geradas por esses testes, consulte Application Verifier — Códigos de interrupção e definições.
Como funciona o AppVerifier?
O AppVerifier funciona modificando as tabelas de método DLLs não gerenciadas para que as verificações necessárias sejam executadas antes que a função real seja executada (isso também é chamado de "Gancho de função"). Por exemplo, o endereço do método CreateFileA da API Win32 é substituído por um método AppVerifier interno que disparará uma série de testes que, quando forem positivos, serão registrados.
Quando novos processos são iniciados, o uso das técnicas de gancho de tabela do método do AppVerifier é controlado por entradas feitas em chaves do Registro específicas. Se a entrada do Registro existir, a DLL do AppVerifier será carregada em um processo recém-criado que manipulará as substituições da tabela de método nas DLLs existentes e subsequentemente carregadas. Como esses ganchos são feitos quando a DLL é carregada, não é possível usar o AppVerifier em um processo que já está em execução.
A interface do usuário (UI) do AppVerifier é usada para controlar as configurações da chave do Registro e fornecer informações sobre os logs existentes. Depois que o aplicativo e os testes são definidos dentro da interface do usuário e o botão "Salvar" é clicado, as configurações do Registro são feitas. O aplicativo precisará ser reiniciado, o que iniciará o monitoramento. É importante observar que as configurações persistirão até que o aplicativo seja removido do AppVerifier.
Quando um problema é identificado, ocorre uma interrupção do verificador. O número fornecido é usado para identificar a natureza exata e o motivo da ocorrência.
Uso do Application Verifier no ciclo de vida de desenvolvimento de software
Você deve usar o Application Verifier durante todo o ciclo de vida de desenvolvimento de software.
Fase de requisitos - O AppVerifier deve ser planejado, e o tempo, alocado, para sua execução e acompanhamento.
Fase de design - Planeje o uso do Application Verifier e defina quais componentes (módulos, DLLs ou EXEs) serão testados.
Fase de implementação - Execute o Application Verifier em compilações estáveis (de Alpha a RTM) dos diferentes componentes em desenvolvimento (é importante testar os componentes individualmente e coletivamente).
Fase de verificação - Os testadores devem executar todos os testes (manuais e automáticos) com o Application Verifier, pois será a primeira vez em que o aplicativo será levado ao limite e que os comportamentos e dados inesperados serão enviados. O AppVerifier também é uma ferramenta poderosa para consultores de segurança que fazem auditorias (caixa preta e caixa branca), pois permitirá a rápida enumeração de vetores de ataque/exploração reais (ou potenciais).
Fase de lançamento - Clientes e consultores de segurança podem usar o AppVerifier nos binários liberados para identificar possíveis vulnerabilidades de segurança.
Fase de suporte e manutenção - Use o Application Verifier para garantir que as alterações de código (por exemplo, atualizações, service packs) não introduzam regressões.
Tópicos da seção
Esta seção contém os tópicos a seguir.
Application Verifier - Recursos
Application Verifier - Testando aplicativos
Application Verifier - Testes dentro do Application Verifier
Application Verifier - Códigos de parada e definições
Application Verifier -Depurando paradas do Application Verifier