Freigeben über


Application Verifier – Überblick

Zusammenfassung

Application Verifier (AppVerifier) ist ein Laufzeitverifizierungstool für nicht verwalteten Code, das bei der Suche nach subtilen Programmierfehlern, Sicherheitsproblemen und Problemen mit eingeschränkten Benutzerkontenrechten hilft, die mit normalen Anwendungstestverfahren nur schwer zu erkennen sind.

Übersicht

Eine der größten Herausforderungen für Programmierer, Softwarearchitekten, Tester und Sicherheitsberater besteht darin, die variablen Ausführungspfade ihrer Anwendungen zu verstehen, wenn diese in der Produktion eingesetzt werden. Selbst wenn man Zugang zum Quellcode hat, ist es schwierig, alles zu erfassen, was während der Ausführung geschieht, da es eine Vielzahl von Abhängigkeiten gibt (z. B. mehrere Gruppen, die zum Code beitragen oder externe Komponenten nutzen). Der Microsoft AppVerifier kann eine nützliche Rolle bei der Bewältigung dieser Komplexität und der möglichen Nebenwirkungen von Fehlern spielen. Der AppVerifier hilft bei der Suche nach Programmierfehlern, Sicherheitsproblemen und Problemen mit Benutzerkontenrechten, die bei einem typischen Testdurchlauf nur schwer zu erkennen sind.

Application Verifier (AppVerif.exe) ist ein dynamisches Verifikationstool für Anwendungen im Benutzermodus. Dieses Tool überwacht Anwendungsaktionen, während die Anwendung läuft, unterzieht die Anwendung einer Reihe von Belastungen und Tests und erstellt einen Bericht über mögliche Fehler in der Anwendungsausführung oder im Design.

Application Verifier kann Fehler in allen Anwendungen im Benutzermodus erkennen, die nicht auf verwaltetem Code basieren, einschließlich Treibern im Benutzermodus. Es findet subtile Programmierfehler, die bei Standard-Anwendungstests oder Treiber-Tests schwer zu entdecken sind.

Wenn AppVerifier während des gesamten Lebenszyklus der Softwareentwicklung eingesetzt wird, kann es Kostenvorteile bei der Entwicklung bringen, da es die frühzeitige Erkennung von Problemen erleichtert, wenn diese einfacher und kostengünstiger zu beheben sind. Es hilft auch dabei, Fehler zu erkennen, die möglicherweise unbemerkt geblieben sind, und stellt sicher, dass die endgültige Anwendung in eingeschränkten Umgebungen (z. B. nicht für Administratoren) ausgeführt werden kann.

ARM64EC-Support

Application Verifier unterstützt ARM64EC nicht.

Installieren von AppVerifier

Application Verifier ist im Windows Software Development Kit (SDK) enthalten. Um Application Verifier zu installieren, markieren Sie das entsprechende Kästchen bei der Installation des SDK.

Screenshot des Hauptmenüs von Application Verifier mit einer einzelnen ausgewählten Testanwendung und einer Testliste auf der rechten Seite.

Sie können Application Verifier allein oder in Verbindung mit einem Debugger im Benutzermodus verwenden. Der aktuelle Benutzer muss Mitglied der Gruppe "Administratoren" auf dem Computer sein.

Was wird von AppVerifier überprüft?

AppVerifier ist ein Tool zur Erkennung und Beseitigung von Speicherfehlern, kritischen Sicherheitslücken und Problemen mit eingeschränkten Benutzerrechten. AppVerifier hilft bei der Erstellung zuverlässiger und sicherer Anwendungen, indem es die Interaktion einer Anwendung mit dem Microsoft Windows-Betriebssystem überwacht und ein Profil der Verwendung von Objekten, der Registrierung, des Dateisystems und der Win32-APIs (einschließlich Heaps, Handles und Sperren) erstellt. AppVerifier prüft auch, wie gut die Anwendung in Nicht-Administrationsumgebungen funktionieren wird.

Probleme, die AppVerifier identifiziert

AppVerifier hilft bei der Ermittlung:

Wenn die Anwendung APIs korrekt verwendet:

  • Unsichere TerminateThread-APIs.
  • Korrekte Verwendung der Thread Local Storage (TLS) APIs.
  • Korrekte Verwendung von Manipulationen des virtuellen Raums (z. B. VirtualAlloc, MapViewOfFile).
  • Ob die Anwendung Zugriffsverletzungen durch strukturierte Ausnahmebehandlung verbirgt.
  • Ob die Anwendung versucht, ungültige Handles zu verwenden.
  • Ob es Speicherbeschädigungen oder Probleme im Heap gibt.
  • Ob der Anwendung bei geringen Ressourcen der Speicher ausgeht.
  • Ob die kritischen Abschnitte korrekt verwendet werden.
  • Ob eine Anwendung, die in einer administrativen Umgebung läuft, auch in einer Umgebung mit weniger Rechten gut funktioniert.
  • Ob es Probleme geben kann, wenn die Anwendung als eingeschränkter Benutzer ausgeführt wird.
  • Ob es nicht initialisierte Variablen in zukünftigen Funktionsaufrufen im Kontext eines Threads gibt.

AppVerifier-Tests

AppVerifier besteht aus einer Reihe von Tests, die als "Überprüfungsebenen" bezeichnet werden Diese können für jede zu testende Anwendung ein- oder ausgeschaltet werden. Durch Aufklappen der Verifizierungsebene innerhalb des Testbereichs werden die spezifischen Tests angezeigt. Um einen Test für die Anwendung zu aktivieren, markieren Sie das Kontrollkästchen neben der Anwendung. Um eine gesamte Überprüfungsebene, wie z. B. Basic, zu aktivieren, markieren Sie das Kontrollkästchen auf der obersten Ebene.

Es gibt dreizehn verschiedene Arten von Tests, die AppVerifier durchführen kann.

Basics – Sie sollten Application Verifier mindestens mit der Einstellung „Basics“ ausführen. Dabei wird jeweils ein Bereich getestet, der zu Abstürzen oder anderen negativen Szenarien führt, die einen direkten und erheblichen Einfluss auf die Kundenerfahrung haben. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

Kompatibilität – Tests der Kompatibilitätsprüfungsebene helfen dabei, eine Anwendung zu identifizieren, die Probleme mit dem Microsoft Windows-Betriebssystem haben könnte. Viele dieser Prüfungen können auch für die Prüfung der Logoanforderungen verwendet werden. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

Cuzz – Die Verifizierungsschicht Concurrency Fuzzing (Cuzz) erkennt Parallelitätsfehler und Data Race Conditions. Cuzz passt die Thread-Planung an, indem es zufällige Verzögerungen an Schlüsselstellen im Code einer Anwendung einfügt. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

Ressourcenarme Simulation – Bei der ressourcenarmen Simulation wird versucht, eine Umgebung mit geringen Ressourcen zu simulieren, z. B. wenn der Speicher knapp ist. Mit dieser Simulation werden Fehler identifiziert, die bei geringem Speicherbedarf auftreten. Dies wird auch als Fault Injection bezeichnet. Application Verifier- Tests innerhalb von Application Verifier

LuaPriv – LuaPriv (Limited User Account Privilege Predictor) ist ein Vorhersage- und Diagnosetest, der Probleme im Zusammenhang mit der Ausführung einer Anwendung mit administrativen Rechten aufdeckt und prüft, ob die Anwendung auch mit weniger Rechten (im Allgemeinen als normaler Benutzer) funktionieren würde. Weitere Informationen finden Sie unter Application Verifier - Tests in Application Verifier

Verschiedenes – Verschiedenes besteht aus Tests für eine Reihe von Tests, z. B. für gefährliche APIs, die unsichere Aktionen ausführen. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

Networking – Die Netzwerktests suchen nach unsachgemäßer Verwendung von WinSock-APIs. Zum Beispiel, wenn eine Netzwerk-API vor einem erfolgreichen WSAStartup()-Aufruf oder nach einem ausgleichenden erfolgreichen WSACleanup()-Aufruf aufgerufen wurde. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

NTLM – Überwacht die Verwendung der Authentifizierungs-APIs AcquireCredentialsHandle und InitializeSecurityContext, um die Verwendung des NTLM-Protokolls zu erkennen. NTLM ist ein veraltetes Authentifizierungsprotokoll mit Schwachstellen, die die Sicherheit von Anwendungen und des Betriebssystems gefährden können. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

Drucken – Die Drucküberprüfung hilft bei der Suche und Behebung von Problemen, die auftreten können, wenn eine Anwendung das Drucksubsystem aufruft. Print Verifier zielt auf die beiden Schichten des Druck-Subsystems, die PrintAPI-Schicht und die PrintDriver-Schicht. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

Webservices – Der Windows Webservices API (WWSAPI) Verification Layer prüft die ordnungsgemäße Verwendung von WWSAPI, z. B. wenn ein WWSAPI aufgerufen wird, das auf ein ungültiges intrinsisches WWSAPI-Objekt verweist, oder wenn WWSAPI mit Verweisen auf ein bereits verwendetes Single-Threaded-Objekt aufgerufen wird. Weitere Einzelheiten finden Sie unter Application Verifier- Tests innerhalb von Application Verifier

Dienste – Die Dienste-Tests überprüfen die ordnungsgemäße Verwendung der Windows-Dienste. Zum Beispiel, dass die Dienste ordnungsgemäß gestartet und gestoppt werden. Informationen zu den von diesen Tests erzeugten Stoppcode-Ausnahmen finden Sie unter Application Verifier - Stop Codes and Definitions.

Perf - Der Perf-Test prüft die effiziente Nutzung von APIs, die sich auf die Systemleistung und den Energieverbrauch auswirken, z. B. der Aufruf einer Windows-Funktion, die eine falsche Wartezeit verwendet. Informationen zu den von diesen Tests erzeugten Stoppcode-Ausnahmen finden Sie unter Application Verifier - Stop Codes and Definitions.

Hangs – Der Hangs-Test prüft die Verwendung von APIs, die dazu führen, dass das System nicht mehr reagiert, z. B. wenn der DllMain-Thread auf einen anderen Thread wartet, der blockiert wurde. Informationen zu den von diesen Tests erzeugten Stoppcode-Ausnahmen finden Sie unter Application Verifier - Stop Codes and Definitions.

Wie funktioniert AppVerifier?

AppVerifier arbeitet, indem es die Methodentabellen der nicht verwalteten DLLs so modifiziert, dass die erforderlichen Prüfungen durchgeführt werden, bevor die eigentliche Funktion ausgeführt wird (dies wird auch als "Function Hooking" bezeichnet). Zum Beispiel wird die Adresse der Win32-API-Methode CreateFileA durch eine interne AppVerifier-Methode ersetzt, die eine Reihe von Tests auslöst, die bei positivem Ergebnis protokolliert werden.

Wenn neue Prozesse gestartet werden, wird die Verwendung der Method Table Hooking-Techniken von AppVerifier durch Einträge in bestimmten Registrierungsschlüsseln gesteuert. Wenn der Registrierungseintrag vorhanden ist, wird die AppVerifier-DLL in einen neu erstellten Prozess geladen, der die Ersetzung der Methodentabelle in den vorhandenen und später geladenen DLLs vornimmt. Da diese Haken beim Laden der DLL gesetzt werden, ist es nicht möglich, AppVerifier in einem bereits laufenden Prozess zu verwenden.

Die AppVerifier-Benutzeroberfläche (UI) wird zur Steuerung der Registrierungsschlüssel-Einstellungen und zur Bereitstellung von Informationen über die vorhandenen Protokolle verwendet. Nachdem die Anwendung und die Tests in der Benutzeroberfläche festgelegt wurden und die Schaltfläche "Speichern" angeklickt wurde, werden die Registrierungseinstellungen vorgenommen. Die Anwendung muss dann neu gestartet werden, wodurch die Überwachung beginnt. Es ist wichtig zu beachten, dass die Einstellungen so lange bestehen bleiben, bis die Anwendung aus AppVerifier entfernt wird.

Wenn ein Problem festgestellt wird, wird die Überprüfung angehalten. Die angegebene Nummer wird verwendet, um die genaue Art und den Grund des Auftretens zu ermitteln.

Einsatz von Application Verifier im Lebenszyklus der Softwareentwicklung

Sie sollten Application Verifier während des gesamten Lebenszyklus Ihrer Softwareentwicklung einsetzen.

Die Anforderungsphase – AppVerifier sollte geplant werden und es sollte Zeit für die Durchführung und Nachbereitung eingeplant werden.

Entwurfsphase – Planen Sie den Einsatz von Application Verifier und legen Sie fest, welche Komponenten (Module, DLLs oder EXEs) getestet werden sollen.

Implementierungsphase – Führen Sie Application Verifier auf stabilen Builds (von Alpha bis RTM) der verschiedenen in Entwicklung befindlichen Komponenten aus (es ist wichtig, die Komponenten einzeln und gemeinsam zu testen).

Verifizierungsphase – Die Tester sollten alle ihre Tests (sowohl manuelle als auch automatische) mit Application Verifier durchführen, da dies das erste Mal ist, dass die Anwendung bis an ihre Grenzen belastet wird und unerwartete Verhaltensweisen und Daten übermittelt werden. AppVerifier ist auch ein leistungsfähiges Tool für Sicherheitsberater, die Audits (Black Box und White Box) durchführen, da es die schnelle Aufzählung von realen (oder potenziellen) Angriffs-/Exploit-Vektoren ermöglicht.

Release-Phase – Kunden und Sicherheitsberater können AppVerifier auf die freigegebenen Binärdateien anwenden, um potenzielle Sicherheitsschwachstellen zu identifizieren.

Support- und Wartungsphase – Verwenden Sie Application Verifier, um sicherzustellen, dass Code-Änderungen (z. B. Updates, Service Packs) nicht zu Regressionen führen.

Themen der Sektion

In diesem Abschnitt werden die folgenden Themen behandelt:

Anwendungsüberprüfung – Funktionen

Anwendungsüberprüfung – Testen von Anwendungen

Anwendungsüberprüfung – Tests innerhalb der Anwendungsüberprüfung

Anwendungsüberprüfung – Stoppcodes und Definitionen

Anwendungsüberprüfung – Debuggen von Stopps der Anwendungsüberprüfung

Anwendungsüberprüfung – Häufig gestellte Fragen