Bewertung von Machine Learning zur Erkennung von Softwareanfälligkeiten
Diese Studie überprüft, wie effektiv maschinelles Lernen dabei ist, Software-Sicherheitslücken durch modifizierte Datentests zu finden.
― 12 min Lesedauer
Inhaltsverzeichnis
Jüngste Arbeiten haben gezeigt, dass Maschinelles Lernen helfen kann, Sicherheitsprobleme in Software zu finden. Indem man den Quellcode einer Funktion betrachtet, können ML-Modelle mit einer guten Genauigkeit erkennen, ob es einen Fehler gibt. Allerdings gibt es Bedenken, wie gut diese Ergebnisse über verschiedene Datensätze hinweg bestehen bleiben.
Um die allgemeine Fähigkeit dieser Modelle zu bewerten, haben Forscher versucht, kleine Änderungen an den Testdaten vorzunehmen, während die Bedeutung gleich bleibt. Diese Tests haben gezeigt, dass die Modelle oft auf Merkmale angewiesen sind, die nichts mit tatsächlichen Schwachstellen zu tun haben, und ihre Genauigkeit fiel erheblich. Als Reaktion darauf wurde eine Strategie vorgeschlagen, bei der das Modell mit diesen modifizierten Daten trainiert wird, was zu einer verbesserten Leistung führt.
In dieser Studie gehen wir weiter. Wir schlagen einen einfachen Weg vor, um diese Modelle zu benchmarken, der Forschern hilft, besser zu bewerten, wie gut maschinelles Lernen bei der Auffindung von Schwachstellen in Code funktioniert. Genauer gesagt schlagen wir zwei Ansätze vor: einen, bei dem wir die Trainings- und Testdaten transformieren, aber ihre Bedeutungen intakt halten, und einen anderen, bei dem wir das Modell mit Daten testen, die feste Schwachstellen enthalten.
Durch die Verwendung verschiedener Transformationen, maschineller Lerntechniken und Datensätze haben wir festgestellt, dass selbst mit Training auf modifizierten Daten die Modelle weiterhin auf nicht verwandte Merkmale angewiesen sind, wenn sie versuchen, Schwachstellen vorherzusagen. Sie hatten auch Schwierigkeiten, gut zwischen anfälligen Funktionen und ihren korrigierten Versionen zu unterscheiden.
Viele aktuelle Studien haben beeindruckende Ergebnisse bei der Schwachstellenerkennung mit maschinellen Lernmethoden berichtet. Diese Modelle scheinen besser zu sein als andere, die verschiedene Techniken verwenden, wie statische Analyse, selbst wenn sie kein tiefes Wissen darüber erfordern, wie Programme funktionieren. Das wirft die Frage auf: Ist das Problem, Sicherheitsanfälligkeiten in Software zu finden, bereits gelöst? Können diese Modelle wirklich Schwachstellen erkennen oder sind die hohen Punktzahlen einfach irreführend?
Damit maschinelles Lernen sicher in echten Softwareanwendungen verwendet werden kann, müssen sie vertrauenswürdig und zuverlässig sein. Daher versuchen Forscher herauszufinden, was diese Modelle können und was nicht, abgesehen davon, wie sie bei Standardtests abschneiden.
Eine Möglichkeit, die Grenzen dieser Modelle zu testen, besteht darin, zu sehen, wo sie versagen. Zum Beispiel können wir kleine, sinnvolle Änderungen am Code-Input vornehmen und beobachten, wie die Modelle reagieren. Dazu gehört das Umbenennen von Variablen, das Hinzufügen von Zeilen, die nicht ausgeführt werden, oder das Austauschen von Code-Snippets durch Äquivalente. Frühere Studien haben gezeigt, dass maschinelle Lernmodelle oft nicht zuverlässig sind, wenn sie mit Änderungen konfrontiert werden, die die Bedeutung intakt halten.
Ein gängiger Weg, um Probleme mit der Zuverlässigkeit anzugehen, besteht darin, das Modell mit modifizierten Daten zu trainieren. Viele Forscher haben herausgefunden, dass dies helfen kann, die verlorene Leistung zurückzubringen. Es gibt jedoch Fragen darüber, ob die Verbesserungen auf echten Verbesserungen der Fähigkeit des Modells zur Identifizierung von Schwachstellen beruhen oder ob die Modelle sich einfach anpassen, um zu einem anderen Datentyp zu passen.
Um diese Fragen zu beantworten, präsentieren wir eine Methode, die helfen kann, maschinelle Lernmodelle zur Schwachstellenerkennung durch Datenmodifikationen zu bewerten. Die erste Methode besteht darin, bestimmte Änderungen an den Trainings- und Testdatensätzen anzuwenden. Wenn dies für verschiedene Paare von Transformationen wiederholt wird, können die erzielten Punktzahlen anzeigen, ob die Modelle zu eng auf die spezifischen Änderungen zugeschnitten sind, die während des Trainings angewendet wurden. Die zweite Methode besteht darin zu bewerten, wie gut ein Modell, das auf modifizierten Daten trainiert wurde, auf einem Testsatz abschneiden kann, der anfällige Funktionen und deren korrigierte Versionen enthält.
Neben unseren vorgeschlagenen Methoden teilen wir auch mit, was wir in unseren Experimenten festgestellt haben. Wir haben diese Methoden an drei führenden maschinellen Lerntechniken zur Schwachstellenerkennung implementiert. Für die erste Methode verwendeten wir 11 Änderungen, die die Bedeutung des Codes intakt halten, und testeten sie an zwei Datensätzen. Wie erwartet half das Training mit modifizierten Daten, die Leistung wiederherzustellen, aber nur, wenn dieselben Änderungen sowohl im Training als auch im Test verwendet wurden. Wenn unterschiedliche Änderungen angewendet wurden, fiel die Leistung hingegen erheblich ab.
Für die zweite Methode haben wir einen neuen Datensatz namens VulnPatchPairs erstellt, der anfällige Funktionen zusammen mit ihren korrigierten Versionen enthält. Trotz der Verwendung von drei führenden maschinellen Lerntechniken konnte kein Modell effektiv zwischen anfälligen Funktionen und ihren korrigierten Gegenstücken unterscheiden. Ihre Leistung war nur geringfügig besser als zufälliges Raten.
Zusammengefasst beinhalten unsere Beiträge:
- Eine klare Methode zur Bewertung von maschinellen Lernmodellen, die darauf abzielen, Schwachstellen mit modifizierten Daten zu erkennen.
- Beweise, die zeigen, dass Verbesserungen durch die Verwendung von modifizierten Trainingsdaten nur auf spezifische Änderungen zutreffen, die während des Trainings verwendet wurden, und dass die Modelle auf nicht verwandte Merkmale überanpassen, die durch diese Änderungen eingeführt werden.
- Einführung von VulnPatchPairs, einem neuen Datensatz, der anfällige Funktionen und ihre entsprechenden Fixes enthält.
- Demonstration, dass führende maschinelle Lerntechniken Schwierigkeiten haben, zwischen anfälligen Funktionen und deren Korrekturen zu unterscheiden, und dass das Training mit modifizierten Daten nicht zu einer signifikanten Leistungsverbesserung führt.
- Verfügbarkeit aller Datensätze, Codes und Ergebnisse zur Sicherstellung von Transparenz und Reproduzierbarkeit.
Verwandte Arbeiten
Ein wesentlicher Weg, um die Zuverlässigkeit von maschinellen Lernmethoden zur Erkennung von Schwachstellen zu studieren, besteht darin, Änderungen vorzunehmen, die die Bedeutung des Codes beibehalten. Frühere Studien haben Methoden zur Generierung dieser Arten von Änderungen in Quellcodedatensätzen eingeführt. Die Auswirkungen der Verwendung von modifizierten Daten für das Training wurden in vielen Software-Engineering-Aufgaben untersucht, wie z.B. beim Zusammenfassen von Code, Vorhersagen von Typen, Klassifizieren der Codefunktionalität und Identifizieren von Schwachstellen. Ein häufiges Ergebnis dieser Studien ist, dass die Verwendung derselben Änderungen für Training und Test die Leistung verbessern kann.
Einige Studien sind weiter gegangen, indem sie getestet haben, wie Trainingsdaten, die mit einer Art von Änderung angereichert sind, abschneiden, wenn sie auf Daten ausgewertet werden, die mit einer anderen, aber verwandten Änderung angereichert sind. Zum Beispiel verwendeten die Autoren in einer Studie eine Methode zum Umbenennen von Variablen während des Trainings und bewerteten dann auf Daten, in denen Variablen zufällig umbenannt wurden. Andere Studien haben ebenfalls festgestellt, dass die Verwendung unterschiedlicher Methoden für Training und Test im Allgemeinen zu einer niedrigeren Leistung führt. Es bleibt jedoch unklar, ob diese Erkenntnisse spezifisch für die untersuchten Transformationsmethoden sind oder ob sie auf andere Methoden, Modelle und Datensätze anwendbar sind. Unsere Forschung zielt darauf ab, diese offenen Fragen zu beantworten, indem wir eine allgemeine Methodologie und eine gründliche empirische Studie bereitstellen.
Einige Transformationen, die in bestehenden Studien verwendet werden, werden während des Trainings des Modells berechnet, um das Modell robuster zu machen. Der Unterschied zwischen diesem Ansatz und der Standarddatenanreicherung besteht darin, dass Transformationen für adversariales Training während des Trainingsprozesses durchgeführt werden, um den Verlust des Modells bei den Eingabebeispielen zu maximieren. Wir haben in unseren Experimenten sowohl einfache Transformationen als auch adversariales Training genutzt.
Um die Effektivität von maschinellen Lerntechniken zur Identifizierung von Schwachstellen und die Auswirkungen von Datenanreicherungen weiter zu untersuchen, haben wir einen neuen Datensatz namens VulnPatchPairs zusammengestellt. Dieser Datensatz enthält Paare von anfälligen Funktionen und deren jeweiligen Fixes. Frühere Arbeiten haben solche paarbasierten Datensätze für automatisierte Fix-Studien vorgeschlagen, aber wir sind die ersten, die diesen Typ von Datensatz verwenden, um zu bewerten, wie effektiv maschinelle Lernmodelle in der Schwachstellenerkennung sind.
Wir schlagen eine neue Benchmarking-Methode vor, um Forschern zu helfen, maschinelle Techniken zur Erkennung von Schwachstellen zu bewerten. Die Methode ist in zwei Teile unterteilt.
Label-bewusste Transformationen von Code
Ein Kernbestandteil unserer Methoden umfasst label-bewusste Transformationen von Code zusammen mit dem, was wir von Schwachstellenerkennungsmodellen erwarten.
Eine Code-Transformation ist eine Funktion, die ein Stück Code ändert, ohne seine Bedeutung zu verändern. Eine ideale Situation ist, wenn die Anwendung einer Transformation auf ein Code-Snippet seinen Schwachstellensatz nicht ändert. Wir bezeichnen diese Art von Transformation als bedeutungserhaltend. Umgekehrt verändert eine label-invertierende Transformation ein Snippet so, dass sich dessen Schwachstellenstatus ändert, was bedeutet, dass entweder eine Schwachstelle hinzugefügt oder entfernt wird.
Im Allgemeinen hoffen wir, dass ein Schwachstellenerkennungsmodell genau vorhersagen kann, ob ein Code-Snippet einen Sicherheitsfehler enthält, unabhängig von vorher angewendeten Transformationen. Genauer gesagt erwarten wir:
- Wenn wir Code transformieren, ohne seinen Schwachstellenstatus zu ändern, sollte das Erkennungswerkzeug dennoch das richtige Ergebnis liefern.
- Wenn wir ein Code-Snippet verändern, um eine Schwachstelle hinzuzufügen oder zu entfernen, erwarten wir, dass das Modell seine Vorhersage ändert, um mit diesem neuen Status übereinzustimmen.
Methodologie: Überanpassung an Code-Änderungen erkennen
Das Ziel unserer ersten Methode ist es zu überprüfen, ob Verbesserungen aus der Datenanreicherung konsistent über die spezifischen Modifikationen, die während des Trainings vorgenommen wurden, angewendet werden können. Wir möchten auch sehen, ob die maschinellen Lerntechniken weiterhin auf nicht verwandte Änderungen in ihren Trainingsdatensätzen überanpassen.
Eingaben: Die Eingaben für diese Methode umfassen ein Set von bedeutungserhaltenden Transformationen, einen Trainingsdatensatz, einen Testdatensatz, eine maschinelle Lerntechnik zur Schwachstellenerkennung und eine Leistungsmetrik, die misst, wie gut das Modell abschneidet.
Berechnungen: Diese Methode berechnet die durchschnittlichen Ergebnisse der Anreicherung nur der Testdaten, unter Verwendung derselben Transformationen für die Trainings- und Testdatensätze und unter Verwendung unterschiedlicher Transformationen für die Trainingsdaten.
Nutzung der Ergebnisse: Forscher können diese Methode verwenden, um neue maschinelle Lerntechniken zur Erkennung von Schwachstellen zu bewerten. Insbesondere können sie Fragen beantworten, wie sich die Leistung mit modifizierten Testdaten ändert, wie viel Leistung mit ähnlichen Transformationen für Trainingsdaten wiederhergestellt werden kann und ob das Modell auf spezifische Änderungen überanpasst.
Unterscheidung zwischen Schwachstelle und Patch
Das Ziel unserer zweiten Methode ist es herauszufinden, ob maschinelle Lerntechniken von Standardtrainingsdatensätzen auf ein modifiziertes Szenario verallgemeinern können, in dem sie zwischen Schwachstellen und deren korrigierten Formen unterscheiden müssen.
Eingaben: Neben den für die erste Methode erforderlichen Eingaben umfasst diese zweite Methode auch einen spezialisierten Schwachstellen-Patch-Testdatensatz zum Vergleich.
Berechnungen: Diese Methode verwendet den Schwachstellen-Patch-Testdatensatz, um die Fähigkeit des Modells zu quantifizieren, sich auf ein modifiziertes Setting zu verallgemeinern. Dabei wird sowohl ein Modell bewertet, das auf Standarddatensätzen trainiert wurde, als auch eines, das auf angereicherten Daten trainiert wurde.
Nutzung der Ergebnisse: Durch die Verwendung dieser Methode können Forscher bewerten, ob die Leistung ihrer Modelle auf ein modifiziertes Umfeld angewendet werden kann. Sie können auch feststellen, ob die Datenanreicherung die Fähigkeit des Modells zur Verallgemeinerung verbessert.
Experimentelles Setup und Forschungsfragen
Unser Ziel ist es zu überprüfen, ob unsere beiden vorgeschlagenen Methoden führende maschinelle Lerntechniken zur Schwachstellenerkennung effektiv bewerten können. Wir zielen darauf ab, mehrere Schlüsselfragen zu beantworten:
- Was passiert mit der Leistung von maschinellen Lernmodellen, wenn wir Eingabecode-Snippets anreichern, ohne ihren Schwachstellenstatus zu ändern?
- Überanpassen diese Techniken an spezifische Modifikationen, die den Schwachstellenstatus nicht ändern?
- Können hohe Leistungswerte auf ein modifiziertes Szenario verallgemeinert werden, in dem Modelle zwischen Schwachstellen und deren Fixes unterscheiden müssen?
Bedeutungserhaltende Transformationen
Ein wichtiger Teil unserer Methoden besteht in der Verwendung bedeutungserhaltender Transformationen. Zu den häufig verwendeten Transformationen in verwandten Arbeiten gehören das Umbenennen von Identifikatoren, das Einfügen von Zeilen, die nicht ausgeführt werden, das Ersetzen von Code-Anweisungen durch äquivalente, das Verschieben von Anweisungen und das Entfernen unnötiger Zeilen.
Datensätze zur Schwachstellenerkennung
Für unsere Experimente verwendeten wir zwei öffentlich verfügbare Datensätze, die speziell für die Schwachstellenerkennung entwickelt wurden.
CodeXGLUE/Devign: Dieser Datensatz umfasst 26.400 C-Funktionen, von denen etwa 45,6 % Schwachstellen enthalten.
VulDeePecker: Dieser Datensatz besteht aus 61.600 C/C++-Codebeispielen, von denen ungefähr 28,7 % Schwachstellen enthalten.
Neuer Datensatz: VulnPatchPairs
Wir entwickelten einen neuen Datensatz namens VulnPatchPairs, um zu untersuchen, wie gut maschinelle Lerntechniken Schwachstellen im Vergleich zu deren Fixes erkennen können. Dieser Datensatz, der C-Funktionen aus grossen Open-Source-Projekten umfasst, besteht aus Paaren von anfälligen Funktionen und deren korrigierten Versionen.
Techniken des maschinellen Lernens
Für unsere Experimente wählten wir drei führende maschinelle Lerntechniken aus, die für ihre Leistung bei der Schwachstellenerkennung bekannt sind. Diese Techniken wurden basierend auf ihren Platzierungen in den bekanntesten Benchmarks zur Bewertung solcher Ansätze ausgewählt.
Modelltraining-Pipeline
Wir hielten ein konsistentes Training-Setup für alle Modelle während unserer Experimente aufrecht. Die verwendeten Datensätze waren bereits in Trainings-, Validierungs- und Testaufteilungen unterteilt, und wir wendeten Vorverarbeitungsschritte an, um die Daten zu bereinigen.
Experimentelle Ergebnisse
Wir begannen unsere Analyse, indem wir untersuchten, wie Datenanreicherung die Leistung von maschinellen Lernmodellen beeinflusst. Unsere Ergebnisse zeigten, dass die Anreicherung des Testdatensatzes tendenziell die Leistung der Modelle senkt. Wenn wir jedoch den Trainingsdatensatz auf ähnliche Weise anreicherten, sahen wir im Allgemeinen Verbesserungen.
Überanpassung an spezifische Transformationen
Wir untersuchten, ob die Leistung auch dann wiederhergestellt werden konnte, wenn unterschiedliche Transformationen auf den Trainingsdatensatz im Vergleich zum Testdatensatz angewendet wurden. Unsere Ergebnisse deuteten darauf hin, dass die Verwendung unterschiedlicher Transformationen nicht half, die Leistung wiederherzustellen; tatsächlich fiel die Leistung oft sogar noch weiter.
Verallgemeinerung zu VulnPatchPairs
Unser letzter Experimentensatz konzentrierte sich darauf, ob maschinelles Lernen von Standarddatensätzen auf ein Szenario verallgemeinern kann, das eine Unterscheidung zwischen Schwachstellen und deren entsprechenden Fixes erfordert. Wir fanden heraus, dass die Modelle im Allgemeinen Schwierigkeiten hatten, diese Unterscheidung zu treffen, und keine signifikante Verbesserung durch die Anreicherung der Trainingsdaten zeigte.
Bedrohungen für die Validität
Wir erkennen verschiedene potenzielle Bedrohungen für die Validität unserer Ergebnisse an, einschliesslich der Entscheidungen bezüglich der Hyperparameter-Auswahl und der Aufteilung der Datensätze. Zudem erkennen wir an, dass unsere Ergebnisse möglicherweise nicht auf andere Techniken des maschinellen Lernens, Datensätze und Transformationen anwendbar sind, die über die von uns bewerteten hinausgehen.
Diskussion und zukünftige Arbeiten
Zusammenfassend bestätigen unsere Ergebnisse, dass die aus der Datenanreicherung gewonnenen Verbesserungen nur auf spezifische Transformationen zutreffen, die im Training verwendet wurden. Die Unfähigkeit führender Techniken des maschinellen Lernens, in neuen Umgebungen zu verallgemeinern, stellt erhebliche Herausforderungen für ihre Anwendung in realen Softwareumgebungen dar. Unsere vorgeschlagenen Methoden bieten einen neuen Ansatz zur Messung und Bewältigung dieser Probleme, und wir hoffen, dass sie weitere Forschungen zur Verbesserung der Robustheit von maschinellen Lerntechniken zur Schwachstellenerkennung anstossen werden.
Titel: Uncovering the Limits of Machine Learning for Automatic Vulnerability Detection
Zusammenfassung: Recent results of machine learning for automatic vulnerability detection (ML4VD) have been very promising. Given only the source code of a function $f$, ML4VD techniques can decide if $f$ contains a security flaw with up to 70% accuracy. However, as evident in our own experiments, the same top-performing models are unable to distinguish between functions that contain a vulnerability and functions where the vulnerability is patched. So, how can we explain this contradiction and how can we improve the way we evaluate ML4VD techniques to get a better picture of their actual capabilities? In this paper, we identify overfitting to unrelated features and out-of-distribution generalization as two problems, which are not captured by the traditional approach of evaluating ML4VD techniques. As a remedy, we propose a novel benchmarking methodology to help researchers better evaluate the true capabilities and limits of ML4VD techniques. Specifically, we propose (i) to augment the training and validation dataset according to our cross-validation algorithm, where a semantic preserving transformation is applied during the augmentation of either the training set or the testing set, and (ii) to augment the testing set with code snippets where the vulnerabilities are patched. Using six ML4VD techniques and two datasets, we find (a) that state-of-the-art models severely overfit to unrelated features for predicting the vulnerabilities in the testing data, (b) that the performance gained by data augmentation does not generalize beyond the specific augmentations applied during training, and (c) that state-of-the-art ML4VD techniques are unable to distinguish vulnerable functions from their patches.
Autoren: Niklas Risse, Marcel Böhme
Letzte Aktualisierung: 2024-06-06 00:00:00
Sprache: English
Quell-URL: https://arxiv.org/abs/2306.17193
Quell-PDF: https://arxiv.org/pdf/2306.17193
Lizenz: https://creativecommons.org/licenses/by/4.0/
Änderungen: Diese Zusammenfassung wurde mit Unterstützung von AI erstellt und kann Ungenauigkeiten enthalten. Genaue Informationen entnehmen Sie bitte den hier verlinkten Originaldokumenten.
Vielen Dank an arxiv für die Nutzung seiner Open-Access-Interoperabilität.