
Erkennen, analysieren und eindeutig identifizieren Sie Abstürze in Windows-Anwendungen.
Erkennen, analysieren und eindeutig identifizieren von Anwendungsfehlern.
Möchten Sie...
...dann könnte BugId genau das Richtige für Sie sein!
Um BugId zu verwenden, laden Sie bitte die folgende Software herunter und installieren Sie sie:
Wenn Sie Python und Debugging Tools for Windows mit den Standardeinstellungen installieren, sollte BugId ohne Anpassungen ausgeführt werden können. Sie können BugId an einem beliebigen Ort in Ihrem lokalen Dateisystem entpacken.
Bevor Sie BugId starten, sollten Sie full page heap in der Zielanwendung aktivieren. Dies kann pro Binärdatei durch Setzen bestimmter Global Flags erfolgen. Der einfachste Weg ist die Verwendung des mit BugId gelieferten Skripts pageheap.cmd. Um beispielsweise full page heap für notepad zu aktivieren, führen Sie den folgenden Befehl aus:
C:\BugId>pageheap notepad.exe ON
(Beachten Sie, dass dieser Befehl in einer Eingabeaufforderung mit Administratorrechten ausgeführt werden muss.)
Um die Sache noch einfacher zu machen, verfügt pageheap.cmd über eine Liste bekannter Anwendungen. Sie können full page heap für jede davon aktivieren oder deaktivieren, indem Sie ihren Namen angeben, z. B. aktiviert pageheap msie ON full page heap für Microsoft Internet Explorer. Verwenden Sie pageheap /?, um weitere Informationen zu den Befehlszeilenargumenten zu erhalten.
An diesem Punkt möchten Sie vielleicht testen, ob BugId korrekt funktioniert. Dies können wir tun, indem wir eine Anwendung mit BugId ausführen und sie zum Absturz bringen, um zu sehen, ob BugId den Fehler korrekt meldet. Eine gute Anwendung für diesen Test ist rundll32.exe, die auf allen Windows-Installationen im Unterordner system32 des Windows-Ordners (%WinDir%) zu finden ist. Sie kann verwendet werden, um jede auf dem lokalen Dateisystem vorhandene DLL zu laden und eine exportierte Funktion in dieser DLL mit einem bestimmten Aufrufformat aufzurufen. Im Ordner system32 gibt es viele DLLs, die Funktionen exportieren. Die meisten dieser exportierten Funktionen erwarten Argumente in einem völlig anderen Format, als rundll32 sie bereitstellt, was dazu führt, dass die Anwendung abstürzt.
Zuerst müssen wir full page heap in rundll32 mit dem folgenden Befehl aktivieren:
C:\BugId>pageheap rundll32.exe ON
Als Nächstes starten wir BugId und weisen es an, rundll32 mit Argumenten zu starten, die es anweisen, advapi32.dll zu laden und CloseThreadWaitChainSession aufzurufen. Zum Zeitpunkt der Erstellung dieses Dokuments führt dies zu einer sogenannten NULL-Pointer-Zugriffsverletzung, die BugId erkennen und melden sollte.
C:\BugId>BugId.cmd %WinDir%\system32\rundll32.exe -- advapi32 CloseThreadWaitChainSession
Beachten Sie, dass sich ein -- zwischen rundll32.exe und den übergebenen Argumenten befindet. Dies liegt daran, dass Sie sowohl BugId selbst als auch der zu testenden Anwendung Argumente bereitstellen möchten. Diese beiden Argumentsätze sollten in der Befehlszeile durch -- getrennt werden. Alles vor -- wird von BugId verarbeitet, und alles danach wird von BugId ignoriert, aber an die Anwendung übergeben.
Wenn alles gut läuft, sieht die Ausgabe von BugId wie folgt aus:
* Command line: C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession
+ Main process 8024/0x1F58 (rundll32.exe): Attached; command line = C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession.
,-- A bug was detect in the application ----------------------------------------
| Id @ Location: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry
| Description: Access violation while reading memory at 0x0 using a NULL pointer.
| Security impact: Denial of Service
| Version: rundll32.exe 10.0.16299.15 (x64)
| advapi32.DLL 10.0.16299.15 (x64)
| Bug report: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry.html (60703 bytes)
'-------------------------------------------------------------------------------
Die erste Zeile zeigt Ihnen die Befehlszeile, die BugId starten wird. Die zweite Zeile sagt Ihnen, dass dadurch ein neuer Prozess mit der Prozess-ID 8024 erstellt wurde, der rundll32.exe ausführt, sowie die Befehlszeile für diesen Prozess (die natürlich dieselbe ist wie in der ersten Zeile). Kurz nach dem Start der Anwendung wurde ein Fehler erkannt. BugId hat für diesen Fehler eine eindeutige ID (AVR@NULL a1f.904) generiert und gemeldet, dass sich sein Ort in der Funktion WctRemoveEntry der von rundll32.exe geladenen DLL advapi32.dll befindet. Da NULL-Pointer-Abstürze normalerweise nicht ausnutzbar sind, außer um die Anwendung zum Absturz zu bringen, ist die Sicherheitsauswirkung des Fehlers Denial of Service. BugId erstellt standardmäßig für jeden gefundenen Fehler einen HTML-formatierten Bericht und teilt Ihnen den Speicherort mit, an dem dieser Bericht gespeichert wurde. Wie Sie sehen können, basiert der Dateiname des Berichts auf der Fehler-ID und dem Ort.
Jede von BugId generierte Fehler-ID besteht aus zwei Teilen, die durch ein Leerzeichen getrennt sind. Der erste Teil beschreibt die Art des Fehlers. Im obigen Beispiel bedeutet AVR@NULL: Access Violation Reading memory at address NULL (Zugriffsverletzung beim Lesen von Speicher an der Adresse NULL). Der zweite Teil beschreibt den Ort des Fehlers; er besteht aus zwei kurzen Hashes, die durch einen Punkt getrennt sind. Diese Hashes werden aus den obersten Funktionen auf dem Stack berechnet, die für den Fehler als relevant erachtet werden. Im Beispiel besteht a1f.904 aus a1f (berechnet aus advapi32.dll!WctRemoveEntry) und 904 (berechnet aus advapi32.dll!CloseThreadWaitChainSession).
Wenn Sie denselben Befehl erneut ausführen, wird BugId dieselbe BugId melden, da dies denselben Fehler im exakt gleichen Code verursachen sollte.
Herzlichen Glückwunsch! Sie sind nun bereit, Ihre eigenen Abstürze mit BugId zu testen. Sie sollten jedoch irgendwann BugId.cmd --help ausführen, um Informationen zu den vielen verschiedenen Befehlszeilenoptionen zu erhalten, die BugId unterstützt.
BugId wurde für eine große Anzahl von Anwendungen entwickelt und während des Fuzzings getestet, um Hunderttausende von Abstürzen zu analysieren, die durch Hunderte verschiedener Fehler verursacht wurden. In dieser Rolle hat es sich als äußerst präzise bei der Analyse von Fehlern erwiesen, mit einer sehr niedrigen False-Positive- und False-Negative-Rate; beide liegen unter 1 %.
Natürlich sind nicht alle Arten von Fehlern leicht zu erkennen und zu analysieren. Manche Fehler können derzeit zum Zeitpunkt ihres Auftretens nicht zuverlässig erkannt werden, verursachen jedoch viel später einen Absturz in völlig unabhängigem Code, was zu einer völlig falschen Analyse führt. In solchen Fällen führt die wiederholte Reproduktion desselben Fehlers zu einer Reihe verschiedener Fehler-IDs, da die Anwendung zu verschiedenen Zeiten auf unterschiedliche Weise abstürzt. Um sicherzustellen, dass dies nicht der Fall ist, wird empfohlen, Ihren Testfall mehrmals in BugId auszuführen, um zu sehen, ob die Fehler-ID gleich bleibt.
Andere Fehler verursachen Abstürze, die so aussehen, als wären sie durch eine andere Art von Fehler verursacht worden. Dies kann zu falschen Analysen und Fehler-IDs führen. Insbesondere Fehler, die auf bad casts in C/C++-Code beruhen, können von BugId derzeit nicht erkannt und gemeldet werden. Sie können verschiedene Arten von Abstürzen verursachen; am häufigsten Zugriffsverletzungen, wenn Werte, die in Eigenschaften eines Objekts gespeichert sind, fälschlicherweise als Zeiger verwendet werden. Wenn Sie vermuten, dass bad casts die Ursache eines Absturzes sein könnten, sollten Sie die Analyse von BugId doppelt überprüfen, um sicherzustellen, dass sie korrekt ist.
BugId ist stark davon abhängig, dass die Anwendung full page heap verwendet, um eine große Anzahl von Heap-bezogenen Fehlern erkennen und analysieren zu können. Dies bedeutet, dass es bei der Erkennung und Analyse von Fehlern in Anwendungen, die einen eigenen internen Heap-Manager verwenden, der nicht auf dem Standard-Windows-Heap basiert, wesentlich weniger effektiv sein wird.
BugId hat eine kostenlose 30-tägige Testphase für kommerzielle und nicht-kommerzielle Nutzung. Während dieser Testphase ist dieses Werk unter einer [Creative Commons Attribution-NonCommercial 4.0 International License](http://creativecommons.org/licenses/by-nc/4.0/) lizenziert.
Nach Ablauf der Testphase muss eine kostenpflichtige Lizenz unter license.skylined.nl erworben werden, wenn Sie BugId weiterhin verwenden möchten.
Nicht-kommerzielle Lizenzen sind gegen eine sehr geringe Gebühr erhältlich; gerade genug, um meine Ausgaben zu decken. Kommerzielle Lizenzen für einzelne Sicherheitsforscher sind ebenfalls zu einem stark reduzierten Preis erhältlich.
Wenn Sie Fragen zur Lizenzierung haben oder einen Mengenrabatt besprechen möchten, kontaktieren Sie bitte [email protected].
BugId hat eine Testphase, damit Sie den Nutzen bewerten können. Wenn Sie BugId nach Ablauf der Testphase weiterhin verwenden möchten, bitte ich Sie, eine kleine Gebühr beizutragen, um meine Arbeit an BugId und die Bearbeitung der Lizenzanfrage zu bezahlen. Wenn Sie BugId kommerziell nutzen, bitte ich Sie, eine reguläre Lizenzgebühr zu zahlen, um einen Teil des Gewinns zu teilen, den Sie aus Ihrer Nutzung von BugId erzielen.