Partager via


Application Verifier : Vue d’ensemble

Résumé

Application Verifier (AppVerifier) est un outil de vérification en temps réel pour le code non géré qui aide à trouver des erreurs de programmation subtiles, des problèmes de sécurité et des problèmes de privilèges de compte utilisateur limité qui peuvent être difficiles à identifier avec les 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 comprendre tout ce qui se passera pendant l’exécution en raison de diverses dépendances (par exemple, plusieurs groupes contribuant au code ou utilisant des composants externes). L’AppVerifier de Microsoft peut jouer un rôle utile en aidant à gérer cette complexité et les effets secondaires potentiels des bugs. L’AppVerifier aide à trouver des erreurs de programmation, des problèmes de sécurité et des problèmes de privilèges de compte utilisateur qui peuvent être difficiles à identifier lors d’un passage de test typique.

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 qu’elle s’exécute, 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 des erreurs dans toute application en mode utilisateur qui n’est pas basée sur du code géré, y compris les pilotes en mode utilisateur. Il trouve des erreurs de programmation subtiles qui peuvent être difficiles à détecter lors des tests d’application standard ou des tests de pilote.

Lorsqu’il est utilisé tout au long du cycle de développement logiciel, AppVerifier peut apporter des avantages en termes de coûts aux efforts de développement, car il facilite l’identification des problèmes dès le début, lorsqu’ils sont plus faciles et moins coûteux à corriger. Il aide également à détecter des erreurs qui auraient pu passer inaperçues et garantit que l’application finale peut être exécutée dans des environnements restreints (par exemple, non administratifs).

ARM64EC Support

Application Verifier ne prend pas en charge ARM64EC.

Installation de l’AppVerifier

Application Verifier est inclus dans le Windows Software Development Kit (SDK). Pour installer Application Verifier, cochez la case correspondante lors de l’installation du SDK.

Capture d’écran du menu principal d’Application Verifier avec une seule application de test sélectionnée et des tests listés sur le côté droit.

Vous pouvez utiliser Application Verifier seul ou en conjonction avec un débogueur en mode utilisateur. L’utilisateur actuel doit être membre du groupe Administrateurs sur l’ordinateur.

Que vérifie AppVerifier ?

AppVerifier est un outil conçu pour détecter et aider à déboguer les corruptions de mémoire, les vulnérabilités critiques de sécurité et les problèmes de privilèges de compte utilisateur limité. AppVerifier aide à 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 profilant son utilisation des objets, du registre, du système de fichiers et des API Win32 (y compris les tas, les poignées et les verrous). AppVerifier inclut également des vérifications pour prédire comment l’application fonctionnera dans des environnements non administratifs.

Problèmes identifiés par AppVerifier

AppVerifier aide à déterminer :

Lorsque l’application utilise correctement les API :

  • API TerminateThread non sécurisées.
  • Utilisation correcte des API de Thread Local Storage (TLS).
  • Utilisation correcte des manipulations d’espace virtuel (par exemple, VirtualAlloc, MapViewOfFile).
  • Si l’application masque les violations d’accès en utilisant la gestion structurée des exceptions.
  • Si l’application tente d’utiliser des poignées invalides.
  • S’il y a des corruptions de mémoire ou des problèmes dans le tas.
  • Si l’application manque de mémoire en cas de faibles ressources.
  • Si l’utilisation correcte des sections critiques est en cours.
  • Si une application fonctionnant dans un environnement administratif fonctionnera bien dans un environnement avec moins de privilèges.
  • S’il y a des problèmes potentiels lorsque l’application fonctionne en tant qu’utilisateur limité.
  • S’il y a des variables non initialisées dans les futurs appels de fonction dans le contexte d’un thread.

Tests AppVerifier

AppVerifier se compose d’ensembles de tests appelés « couches de vérification ». Ceux-ci peuvent être activés ou désactivés pour chaque application testée. En développant la couche de vérification dans la zone des tests, les tests spécifiques sont affichés. Pour activer un test pour l’application, cochez la case à côté. Pour activer une couche de vérification entière, comme Basics, cochez la case au niveau supérieur.

AppVerifier peut effectuer treize types de tests différents.

Basics (test de base) : Au minimum, vous devez exécuter Application Verifier avec le paramètre Basics sélectionné. Chacun de ceux-ci testera une zone qui causera des plantages ou d’autres scénarios négatifs, ayant un impact direct et significatif sur l’expérience client. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

Compatibility (compatibilité) : Les tests de la couche de vérification de compatibilité aident à identifier une application qui pourrait avoir des problèmes avec le système d’exploitation Microsoft Windows. Beaucoup de ces vérifications peuvent également être utilisées pour tester les exigences du logo. Pour plus de détails, veuillez consulter la section Application Verifier: Tests au sein d’Application Verifier.

Cuzz : La couche de vérification de Concurrency Fuzzing (Cuzz) détecte les bugs de concurrence et les conditions de course de données. Cuzz ajuste la planification des threads en injectant des délais aléatoires à des points clés dans le code d’une application. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

Low Resource Simulation : La simulation de faibles ressources essaie de simuler un environnement sous faibles ressources, comme un manque de mémoire. Cette simulation identifiera les bugs qui se produisent dans des conditions de faible mémoire. Cela est également appelé Injection d’erreur. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

LuaPriv : Les tests de Limited User Account Privilege Predictor (LuaPriv) sont à la fois prédictifs et diagnostiques et travaillent à faire émerger des problèmes liés à l’exécution d’une application avec des privilèges administratifs, et si cette application fonctionnerait aussi bien si elle était exécutée avec moins de privilèges (généralement, en tant qu’utilisateur normal). Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

Miscellaneous (Divers) : Divers se compose de tests pour un assortiment de tests tels que pour les API dangereuses qui prennent des actions non sécurisées. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

Networking (mise en réseau) : Les tests de mise en réseau recherchent une utilisation incorrecte des API WinSock. Par exemple, si une API de mise en réseau est appelée avant un WSAStartup() réussi ou après un appel WSACleanup() réussi. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

NTLM : Surveille l’utilisation des API d’authentification AcquireCredentialsHandle et InitializeSecurityContext afin de détecter les utilisations du protocole NTLM. Le NTLM est un protocole d’authentification obsolète avec des failles qui compromettent potentiellement la sécurité des applications et du système d’exploitation. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

Impression : Le Print Verifier aide à trouver et à résoudre les problèmes qui peuvent survenir lorsqu’une application appelle le sous-système d’impression. Le vérificateur d’impression cible les deux couches du sous-système d’impression, la couche PrintAPI et la couche PrintDriver. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

Webservices : La couche de vérification Windows Webservices API (WWSAPI) vérifie la bonne utilisation de WWSAPI, telle qu’un WWSAPI appelé qui référence un objet WWSAPI intrinsèque invalide ou un WWSAPI appelé avec des références à un objet mono-thread déjà en cours d’utilisation. Pour plus de détails, veuillez consulter la section Application Verifier : Tests au sein d’Application Verifier.

Services : Les tests de services vérifient l’utilisation correcte des services Windows. Par exemple, que les services sont correctement démarrés et arrêtés. Pour plus d’informations sur les codes d’arrêt générés par ces tests, veuillez consulter la section Application Verifier : Codes d’arrêt et définitions.

Perf : Le test Perf vérifie l’utilisation efficace des API qui impactent la performance du système et la consommation d’énergie, comme appeler une fonction Windows qui utilise une période d’attente incorrecte. Pour plus d’informations sur les codes d’arrêt générés par ces tests, veuillez consulter la section Application Verifier : Codes d’arrêt et définitions.

Hangs : Les tests Hangs vérifient l’utilisation des API qui provoquent l’arrêt du système, par exemple lorsque le thread DllMain attend un autre thread qui est bloqué. Pour plus d’informations sur les codes d’arrêt générés par ces tests, veuillez consulter la section Application Verifier : Codes d’arrêt et définitions.

Comment fonctionne AppVerifier ?

AppVerifier fonctionne en modifiant les tables de méthodes des DLL non gérées afin que les vérifications nécessaires soient effectuées avant que la fonction réelle ne soit exécutée (cela est également appelé « Hooking de fonction »). Par exemple, l’adresse de la méthode Win32 API CreateFileA est remplacée par une méthode interne d’AppVerifier qui déclenchera une série de tests qui, lorsqu’ils sont positifs, seront enregistrés.

Lorsque de nouveaux processus sont lancés, l’utilisation des techniques de Hooking des tables de méthodes d’AppVerifier est contrôlée par des entrées faites dans des clés de registre spécifiques. Si l’entrée de registre existe, alors la DLL AppVerifier sera chargée dans un processus nouvellement créé qui gérera les remplacements des tables de méthodes dans les DLL existantes et celles chargées ultérieurement. Comme ces hooks sont faits lorsque la DLL est chargée, il n’est pas possible d’utiliser AppVerifier sur un processus déjà en cours d’exécution.

L’interface utilisateur (UI) d’AppVerifier est utilisée pour contrôler les paramètres de la clé de registre et pour fournir des informations sur les journaux existants. Après que l’application et les tests sont définis dans l’UI et que le bouton « Enregistrer » est cliqué, les paramètres du registre sont effectués. L’application devra alors être redémarrée, ce qui lancera la surveillance. Il est important de noter que les paramètres persisteront jusqu’à ce que l’application soit retirée d’AppVerifier.

Lorsqu’un problème est identifié, un arrêt de vérification se produira. Le numéro fourni est utilisé pour identifier la nature exacte et la raison de son occurrence.

Utilisation d’Application Verifier dans le cycle de développement logiciel

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

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

Phase de conception : Planifiez l’utilisation d’Application Verifier et définissez quels composants (modules, DLL ou EXE) seront testés.

Phase de mise en œuvre : Exécutez Application Verifier sur des builds stables (de l’Alpha au 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 ce sera la première fois que l’application sera poussée à ses limites et des comportements et des données inattendus seront soumis. AppVerifier est également un outil puissant pour les consultants en sécurité effectuant des audits (boîte noire et boîte blanche) car il permet une é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 binaires publiés pour identifier les vulnérabilités potentielles de sécurité.

Phase de prise en charge et de maintenance : Utilisez Application Verifier pour vous assurer que les modifications de code (par exemple, mises à jour, packs de service) n’introduisent pas de régressions.

Sujets de la 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 - Codes d'arrêt et définitions

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

Vérificateur d’application - Forum aux questions