Vérificateur d’application - Vue d’ensemble

Résumé

Application Verifier (AppVerifier) est un outil de vérification du runtime pour le code non managé qui aide à trouver des erreurs de programmation subtiles, des problèmes de sécurité et des problèmes de privilèges de compte d’utilisateur limités qui peuvent être difficiles à identifier avec des techniques de test d’application normales.

Vue d’ensemble

L’un des plus grands défis auxquels sont confrontés les programmeurs, les architectes logiciels, les testeurs et les consultants en sécurité est de comprendre les chemins d’exécution variables de leurs applications lorsqu’elles sont déployées en production. Même avec l’accès au code source, il est difficile de saisir tout ce qui se produira pendant l’exécution en raison d’une variété de dépendances (par exemple, plusieurs groupes contribuant au code ou tirant parti de composants externes). Microsoft AppVerifier peut jouer un rôle utile en aidant à gérer cette complexité et les effets secondaires potentiels des bogues. AppVerifier aide à rechercher des erreurs de programmation, des problèmes de sécurité et des problèmes de privilèges de compte d’utilisateur qui peuvent être difficiles à identifier lors d’une passe de test classique.

Application Verifier (AppVerif.exe) est un outil de vérification dynamique pour les applications en mode utilisateur. Cet outil surveille les actions de l’application pendant l’exécution de l’application, soumet l’application à une variété de contraintes et de tests, et génère un rapport sur les erreurs potentielles dans l’exécution ou la conception de l’application.

Application Verifier peut détecter les erreurs dans toutes les applications en mode utilisateur qui ne sont pas basées sur du code managé, y compris les pilotes en mode utilisateur. Il détecte des erreurs de programmation subtiles qui peuvent être difficiles à détecter lors des tests d’application standard ou des tests de pilotes.

Vous pouvez utiliser le vérificateur d’application seul ou conjointement avec un débogueur en mode utilisateur. L’utilisateur actuel doit être membre du groupe Administrateurs sur l’ordinateur.

Installation d’AppVerifier

Le vérificateur d’application est inclus dans le Kit de développement logiciel (SDK) Windows. Pour installer Application Verifier, case activée la zone correspondante, lors de l’installation du Kit de développement logiciel (SDK).

Capture d’écran du menu main du vérificateur d’application avec une seule application de test sélectionnée et des tests répertoriés sur le côté droit.

Qu’est-ce qu’AppVerifier ?

AppVerifier est un outil conçu pour détecter et aider à déboguer les altérations de mémoire, les failles de sécurité critiques et les problèmes de privilèges de compte d’utilisateur limités. AppVerifier facilite la création d’applications fiables et sécurisées en surveillant l’interaction d’une application avec le système d’exploitation Microsoft Windows et en profilage son utilisation d’objets, du registre, du système de fichiers et des API Win32 (y compris les tas, les handles et les verrous). AppVerifier inclut également des vérifications pour prédire le niveau d’exécution de l’application dans les environnements non administrateurs.

Lorsqu’il est utilisé tout au long du cycle de vie du développement de logiciels, AppVerifier peut apporter des avantages en matière de coûts aux efforts de développement, car il facilite l’identification précoce des problèmes lorsqu’ils sont plus faciles et moins chers à résoudre. Il permet également de détecter les erreurs qui peuvent être passées inaperçues et de garantir que l’application finale peut être exécutée dans des environnements restreints (par exemple, non administrateurs).

Problèmes identifiés par AppVerifier

AppVerifier permet de déterminer :

Lorsque l’application utilise correctement les API :

  • API TerminateThread non sécurisées.
  • Utilisation correcte des API de stockage local de thread (TLS).
  • Utilisation correcte des manipulations d’espace virtuel (par exemple, VirtualAlloc, MapViewOfFile).
  • Indique si l’application masque les violations d’accès à l’aide de la gestion structurée des exceptions.
  • Indique si l’application tente d’utiliser des handles non valides.
  • Indique s’il y a des altérations de mémoire ou des problèmes dans le tas.
  • Indique si l’application manque de mémoire sous peu de ressources.
  • Indique si l’utilisation correcte des sections critiques se produit.
  • Indique si une application s’exécutant dans un environnement d’administration s’exécute correctement dans un environnement avec moins de privilèges.
  • Indique s’il existe des problèmes potentiels lorsque l’application s’exécute en tant qu’utilisateur limité.
  • Indique s’il existe des variables non initialisées dans les futurs appels de fonction dans le contexte d’un thread.

AppVerifier Tests

AppVerifier se compose d’ensembles de tests appelés « couches de vérification ». Elles peuvent être activées ou désactivées pour chaque application testée. En développant la couche de vérification dans la zone de tests, les tests spécifiques sont affichés. Pour activer un test pour l’application, sélectionnez la zone case activée en regard de celle-ci. Pour activer l’ensemble d’une couche de vérification, par exemple De base, sélectionnez la zone case activée au niveau supérieur.

AppVerifier peut effectuer treize types de tests différents.

Notions de base : au minimum, vous devez exécuter Application Verifier avec le paramètre De base sélectionné. Chacun d’entre eux testera une zone qui provoquera des incidents ou d’autres scénarios négatifs, qui ont un impact direct et significatif sur l’expérience client. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Compatibilité - Les tests de la couche de vérification de compatibilité permettent d’identifier une application qui peut rencontrer des problèmes avec le système d’exploitation Microsoft Windows. Un grand nombre de ces vérifications peuvent également être utilisées pour tester les exigences du logo. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Cuzz : la couche de vérification De fuzzing d’accès concurrentiel (Cuzz) détecte les bogues d’accès concurrentiel et les conditions de concurrence des données. Cuzz ajuste la planification des threads en injectant des retards aléatoires aux points clés du code d’une application. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Simulation à faible niveau de ressources : la simulation de ressources faibles tente de simuler un environnement avec des ressources faibles, par exemple une mémoire insuffisante. Cette simulation identifie les bogues qui se produisent dans des conditions de mémoire insuffisante. Cela est également appelé injection d’erreur. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

LuaPriv : les tests LuaPriv (User Account Privilege Predictor) limités (LuaPriv) sont à la fois un travail prédictif et de diagnostic qui permet de faire apparaître des problèmes liés à l’exécution d’une application avec des privilèges d’administration, et de déterminer si cette application fonctionne aussi bien si elle s’exécute avec moins de privilèges (généralement, en tant qu’utilisateur normal). Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Divers : divers se composent de tests pour un assortiment de tests, par exemple pour les API dangereuses qui effectuent des actions non sécurisées. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Mise en réseau : les tests de mise en réseau recherchent une utilisation incorrecte des API WinSock. Par exemple, si une API réseau appelée avant un WSAStartup() réussi ou après un appel WSACleanup() réussi a été effectué. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

NTLM : surveille l’utilisation des API d’authentification AcquireCredentialsHandle et InitializeSecurityContext afin de détecter les utilisations du protocole NTLM. Le protocole NTLM est un protocole d’authentification obsolète avec des défauts susceptibles de compromettre la sécurité des applications et du système d’exploitation. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Impression : le vérificateur d’impression permet de rechercher et de résoudre les problèmes qui peuvent se produire lorsqu’une application appelle le sous-système d’impression. Print Verifier cible les deux couches du sous-système d’impression, la couche PrintAPI et la couche PrintDriver. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Webservices : la couche de vérification WWSAPI (Windows Webservices API) fonctionne pour case activée pour une utilisation correcte de WWSAPI, par exemple un WWSAPI appelé qui fait référence à un objet WWSAPI intrinsèque non valide ou WWSAPI appelé avec des références à un objet thread unique déjà utilisé. Pour plus d’informations, consultez Vérificateur d’application - Tests dans Application Verifier

Services : les services testent, case activée pour une utilisation correcte des services Windows. Par exemple, les services sont démarrés et arrêtés correctement. Pour plus d’informations sur les exceptions de code d’arrêt générées par ces tests, consultez Vérificateur d’application - Codes d’arrêt et définitions.

Perf : le test Perf case activée pour une utilisation efficace des API qui ont un impact sur les performances du système et la consommation d’énergie, comme l’appel d’une fonction Windows qui utilise une période d’attente incorrecte. Pour plus d’informations sur les exceptions de code d’arrêt générées par ces tests, consultez Vérificateur d’application - Codes d’arrêt et définitions.

Blocages : teste l’utilisation d’API qui empêchent le système de répondre, par exemple lorsque le thread DllMain attend un autre thread bloqué. Pour plus d’informations sur les exceptions de code d’arrêt générées par ces tests, consultez Vérificateur d’application - Codes d’arrêt et définitions.

Comment fonctionne AppVerifier ?

AppVerifier fonctionne en modifiant les tables de méthodes DLL non managées afin que les vérifications requises soient effectuées avant l’exécution de la fonction réelle (cela est également appelé « hooking de fonction »). Par exemple, l’adresse de la méthode CreateFileA de l’API Win32 est remplacée par une méthode AppVerifier interne qui déclenche une série de tests qui, lorsqu’ils sont positifs, sont enregistrés.

Lorsque de nouveaux processus sont démarrés, l’utilisation des techniques de raccordement de table de méthode d’AppVerifier est contrôlée par les entrées effectuées dans des clés de Registre spécifiques. Si l’entrée de Registre existe, la DLL AppVerifier est chargée dans un processus nouvellement créé qui gère les remplacements de table de méthodes dans les DLL existantes et ensuite chargées. Étant donné que ces hooks sont effectués lorsque la DLL est chargée, il n’est pas possible d’utiliser AppVerifier sur un processus qui est déjà en cours d’exécution.

L’interface utilisateur AppVerifier est utilisée pour contrôler les paramètres de clé de Registre et fournir des informations sur les journaux existants. Une fois que l’application et les tests sont définis dans l’interface utilisateur et que l’utilisateur clique sur le bouton « Enregistrer », les paramètres du Registre sont définis. L’application doit ensuite être redémarrée, ce qui démarre la surveillance. Il est important de noter que les paramètres sont conservés jusqu’à ce que l’application soit supprimée d’AppVerifier.

Lorsqu’un problème est identifié, un arrêt du vérificateur se produit. Le nombre fourni est utilisé pour identifier la nature exacte et la raison de son occurrence.

Utilisation du vérificateur d’application dans le cycle de vie du développement logiciel

Vous devez utiliser Application Verifier tout au long de votre cycle de vie de développement logiciel.

Phase des exigences : AppVerifier doit être planifié et le temps alloué à son exécution et à son suivi.

Phase de conception : planifiez l’utilisation du vérificateur d’application et définissez les composants (modules, DLL ou EXE) qui seront testés.

Phase d’implémentation : exécutez le vérificateur d’application sur des builds stables (de Alpha à RTM) des différents composants en cours de développement (il est important de tester les composants individuellement et collectivement).

Phase de vérification : les testeurs doivent exécuter tous leurs tests (manuels et automatiques) avec Application Verifier, car c’est la première fois que l’application sera poussée vers les limites et que le comportement et les données inattendus seront envoyés. AppVerifier est également un outil puissant pour les consultants en sécurité qui effectuent des audits (boîte noire et boîte blanche), car il permet l’énumération rapide des vecteurs d’attaque/exploit réels (ou potentiels).

Phase de publication : les clients et les consultants en sécurité peuvent utiliser AppVerifier sur les fichiers binaires publiés pour identifier les failles de sécurité potentielles.

Phase de support et de maintenance : utilisez le vérificateur d’application pour vous assurer que les modifications du code (par exemple, mises à jour, Service Packs) n’introduisent pas de régressions.

Rubriques de section

Cette section contient les rubriques suivantes :

Vérificateur d’application - Fonctionnalités

Vérificateur d’application - Test d’applications

Vérificateur d’application - Tests dans Application Verifier

Vérificateur d’application - Arrêter les codes et les définitions

Vérificateur d’application - Débogage des arrêts du vérificateur d’application

Vérificateur d’application - Forum aux questions