Directed Symbolic Execution for Path Feasibility Analysis]{Directed Symbolic Execution for Path Feasibility Analysis in Software Security Testing
Dieses Paper präsentiert eine gerichtete symbolische Ausführungsmethode, welche die statische Sicherheitsanalyse durch die effiziente Verifizierung der interprozeduralen Pfad-Machbarkeit mittels automatisierter Symbolisierung und Loop-Iterationslimits verbessert, wodurch die Präzision signifikant gesteigert wird, während der Recall auf realen Benchmarks erhalten bleibt.
Originalarbeit lizenziert unter CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Dies ist eine KI-generierte Erklärung des untenstehenden Papers. Sie wurde nicht von den Autoren verfasst oder gebilligt. Für technische Genauigkeit konsultieren Sie das Originalpaper. Vollständigen Haftungsausschluss lesen
Die Softwaresicherheit ist ein ständiger Kampf gegen verborgene Mängel, ähnlich wie ein Stadtplaner, der sicherstellen muss, dass jede Brücke und jeder Tunnel in einer weitläufigen Metropole einem Erdbeben standhalten kann. Um dies zu erreichen, nutzen Ingenieure automatisierte Werkzeuge, die den Code scannen, ohne ihn tatsächlich auszuführen, um jeden möglichen Pfad zu kartieren, den ein Programm nehmen könnte. Diese Karten, bekannt als Kontrollflussgraphen, sind unglaublich detailliert und zeigen, wie ein Programm von einer Instruktion zur nächsten springt. Diese Karten sind jedoch oft zu gründlich; sie heben Pfade hervor, die auf dem Papier gefährlich aussehen, in der realen Welt aber physisch unmöglich zu begehen sind. Dies führt zu einer Flut von Fehlalarmen, die menschliche Experten dazu zwingen, Zeit mit der Untersuchung von Geistern in der Maschine zu verschwenden. Die Herausforderung besteht also darin, ein System zu bauen, das schnell zwischen einem Pfad, der theoretisch lediglich möglich ist, und einem, der tatsächlich ausführbar ist, unterscheiden kann, ohne sich in der schieren Menge der Möglichkeiten zu verlieren.
Ein Team von Forschern der Russisch-Armenischen Universität hat eine neue Methode entwickelt, um dieses Problem zu lösen, indem sie eine Technik namens gerichtete symbolische Ausführung verwendet. Stellen Sie sich einen Reisenden vor, der versucht zu verifizieren, ob eine bestimmte Route durch eine komplexe Stadt existiert. Ein Standardansatz wäre es, Entdecker auszusenden, die jede einzelne Straße in der Stadt abwandern, um zu sehen, wohin sie führen – eine Aufgabe, die ewig dauern und das Team überfordern würde. Stattdessen fungiert die Methode der Forscher wie eine geführte Tour. Sie nimmt eine spezifische Route, die von einem Sicherheitsscanner gemeldet wurde, und leitet einen virtuellen Entdecker an, nur diesem Pfad zu folgen, während alle anderen Straßen, die nicht zum Ziel führen, ignoriert werden. Dieser „gerichtete“ Ansatz ermöglicht es dem System, zu prüfen, ob die gemeldete Gefahr real ist, ohne Energie für irrelevante Umwege zu verschwenden.
Der Kern dieser Arbeit liegt darin, wie das System mit dem Unbekannten umgeht. In echter Software arbeiten Programme oft mit Daten, die noch nicht festgelegt wurden, oder sie rufen Funktionen aus externen Bibliotheken auf, deren interner Code verborgen ist. Ein traditioneller Entdecker könnte vor diesen Leerstellen stecken bleiben oder aufgeben. Das System der Forscher ist jedoch darauf ausgelegt, diese Unbekannten als flexible Variablen zu behandend. Wenn ein Programm einen Speicherort liest, der noch nicht gefüllt wurde, weist das System ihm einen symbolischen Wert zu, was es ermöglicht, jedes mögliche Ergebnis zu untersuchen, das dieser Wert annehmen könnte. Dies geschieht auch für die Ergebnisse externer Funktionen und komplexer Pointer-Argumente, die wie dynamische Adressen wirken, die je nach Situation auf unterschiedliche Orte zeigen können. Indem das System diese Lücken automatisch mit Möglichkeiten anstatt mit konkreten Vermutungen füllt, kann es den Pfad durch den Code verfolgen, selbst wenn das vollständige Bild nicht sichtbar ist.
Ein weiterer großer Hindernis bei der Navigation durch Software ist die Schleife, ein Abschnitt des Codes, der sich wiederholt. In einem echten Programm kann eine Schleife einige Male oder Millionen von Malen durchlaufen werden, und in einer symbolischen Analyse kann sie den Entdecker in einem unendlichen Zyklus gefangen halten. Die Forscher führten eine Strategie ein, um dies zu handhaben, indem sie ein Limit festlegten, wie oft das System eine Schleife durchläuft, bevor es sie zum Verlassen zwingt. Dies ist kein zufälliger Abbruch; das System zeichnet sorgfältig auf, was während dieser Iterationen geschah, und springt dann zu dem Punkt, an dem die Schleife natürlich enden würde. Dies ermöglicht es der Analyse, über den repetitiven Abschnitt hinauszugehen, ohne stecken zu bleiben, wodurch sichergestellt wird, dass das Werk das Ende des untersuchten Pfades erreichen kann.
Um ihre Methode zu testen, wandte das Team sie auf reale Software und eine Standardkollektion von Testfällen an, die als Juliet Suite bekannt ist. Zuerst überprüften sie ihr System anhand von Pfaden, die aus den GNU Coreutils extrahiert wurden, einem grundlegenden Satz von Werkzeugen für das Linux-Betriebssystem. Das System verifizierte erfolgreich, dass 95,3 % dieser realen Pfade tatsächlich durchführbar waren, was bewies, dass es komplexen, miteinander verwobenen Code bewältigen kann. Sie integrierten ihre Methode anschließend in ein bestehendes Sicherheitstool namens MLH. Vor dieser Ergänzung meldete das Tool 666 Fehlalarme von tausenden Berichten. Nach Anwendung der neuen Pfad-Durchführbarkeitsanalyse verschwanden diese Fehlalarme vollständig, während das Tool weiterhin jede der zuvor gefundenen realen Schwachstellen entdeckte. Dies bedeutete, dass die Präzision der Sicherheitsprüfung bei dem getesteten Teilbereich von 56,6 % auf 100 % sprang, ohne die Fähigkeit einzubüßen, echte Bugs zu finden.
Die Forscher verglichen ihren Ansatz auch mit KLEEF, einem anderen spezialisierten Tool, das für ähnliche Aufgaben entwickelt wurde. Als sie ihn gegen Berichte getestet haben, die von zwei anderen großen Scannern, Infer und Clang Static Analyzer, generiert wurden, waren die Ergebnisse deutlich. KLEEF hatte erhebliche Schwierigkeiten, scheiterte beim Verifizieren der meisten True-Positive-Berichte und sah seine Performance-Werte massiv sinken. Im Gegensatz dazu behielt die neue Methode die Performance der ursprünglichen Scanner bei oder verbesserte sie sogar leicht. Sie verifizierte alle die durch das Infer-Tool gemeldeten wahren Schwachstellen und bewältigte den Großteil der Clang-Berichte, was zeigt, dass sie robust genug ist, um mit industriellem Code zu arbeiten.
Die Ergebnisse legen nahe, dass dieser gerichtete Ansatz eine praktische Möglichkeit bietet, den Lärm in der Softwaresicherheitstests zu reduzieren. Indem er sich nur auf die Pfade konzentriert, die zählen, und die Komplexitäten von Speicher und externen Funktionen automatisch handhabt, filtert die Methode unmögliche Szenarien heraus, die menschliche Zeit verschwenden würden. Obwohl das System einen kalkulierten Kompromiss eingeht, indem es die Anzahl der Schleifeniterationen begrenzt, um den Fortschritt aufrechtzuerhalten, zeigen die Ergebnisse, dass dies nicht auf Kosten des Übersehens realer Gefahren geht. Die Arbeit bietet einen klaren Weg nach vorn, um automatisierte Sicherheitstools zuverlässiger zu machen, damit, wenn eine Warnung ausgegeben wird, es sich um eine echte Bedrohung handelt, die eine Untersuchung wert ist.
Ertrinken Sie in Arbeiten in Ihrem Fachgebiet?
Erhalten Sie tägliche Digests der neuesten Arbeiten passend zu Ihren Forschungsbegriffen — mit technischen Zusammenfassungen, in Ihrer Sprache.