»Security und KI« - Teil 1
ChatGPT und die Code-Analyse
Mit LLMs ergeben sich neue Möglichkeiten zur Analyse und Verbesserung von Code. Dieser Artikel ist der erste einer dreiteiligen Serie zu Experimenten, die zeigen, wie bereits verfügbare generelle Sprachmodelle sicherheitsrelevante Prozesse und Tätigkeiten beeinflussen.
Moderne Software verwendet eine Vielzahl verschiedener Bibliotheken und Frameworks, um neue Funktionen zu erbringen und vielfältige Schnittstellen zu ermöglichen. Diese Software-Komponenten können jedoch auch Schwachstellen enthalten und neue Sicherheitslücken in ein Projekt bringen. Für den sicheren Betrieb moderner Software ist die korrekte Konfiguration und Wartung der Software-Komponenten – etwa durch Updates – während des Betriebs unerlässlich. Während der Entwicklung spielt die Sicherstellung der Codequalität – etwa durch Code-Analysen – eine genau so wichtige Rolle. Daher haben sich über die Jahre vielfältige Werkzeuge zur Überprüfung der Sicherheit und Qualität etabliert.
Mit dem überraschenden Erfolg der Large Language Modelle ergeben sich neue Möglichkeiten zur Analyse und Verbesserung von Code. Dieser Artikel beleuchtet, in welchem Umfang ChatGPT, ein sehr generisches KI-Modell, die Problemstellung der Code-Analyse beherrscht. ChatGPT wird oft zugeschrieben, dass es aufgrund seiner fortgeschrittenen Sprachverarbeitungsfähigkeiten und der guten Mustererkennung in der Lage ist, komplexe Probleme zu lösen. Diese Untersuchung zielt darauf ab, die tatsächliche Leistungsfähigkeit von ChatGPT in der Code-Analyse zu evaluieren.
Dabei gilt es zu beleuchten, wie es in der Praxis bei der Erkennung und Bewertung von Schwachstellen im Code abschneidet. Für eine praxisnahe Einschätzung werden bekannte Schwachstellen aus der OWASP Top-10-Liste genutzt und die Ergebnisse von ChatGPT mit statischen Analyse- Werkzeuge wie Snyk und DeepSource verglichen.
Die Methodik
Um den Einfluss generativer KI auf den Code-Analyseprozess in experimentellen Tests festzustellen, wurden Code-Snippets erstellt, die bekannte Schwachstellen aus der OWASP Top-10-Liste enthalten. Für die Tests wurden 49 Code-Snippets mit Schwachstellen und 35 Code-Snippets ohne Schwachstellen generiert. Der experimentelle Ansatz zielt darauf ab, die tatsächliche Leistungsfähigkeit des generativen KI-Modells unter praxisnahen Bedingungen zu bewerten. Die analysierten Code-Snippets galt es realitätsnah zu gestalten, um die Bedingungen, denen Entwickler im Alltag begegnen, so gut wie möglich nachzubilden. Alle Code-Snippets sind online auf GitHub verfügbar (siehe Webtipp). Die Code-Snippets wurden daraufhin von ChatGPT, Snyk und DeepSource auf mögliche Schwachstellen untersucht. Die Ergebnisse dieses Experiments sollen zeigen wie gut sich ChatGPT in ein reales Entwicklungsumfeld einbinden lässt. Die Tests wurden in verschiedenen Programmiersprachen durchgeführt – einschließlich C#, C++, Java, JavaScript, Go, PHP und Python – um die Flexibilität und Effizienz der generativen KI-Werkzeuge zu beurteilen.
ChatGPT-4 gilt als eines der führenden generativen KI-Werkzeuge mit Large Language Model (LLM) und wurde deshalb ausgewählt. Entwickelt von OpenAI, zeichnet es sich durch seine Anpassungsfähigkeit und seine Mustererkennung aus. Für die spezifische Aufgabe der Code-Analyse wurde eine Custom GPT erstellt, der die Rolle als »Cyber Analyst« zugewiesen wurde. Die Custom GPT wurde angewiesen, Schwachstellen in Code-Snippets mithilfe statischer Analyse zu finden, diese anhand der OWASP Top 10 zu kategorisieren und zu erklären sowie mögliche Lösungen vorzuschlagen. Custom GPTs ermöglichen es, der KI spezifische Anweisungen zu geben, wodurch sich der Analyseprozess vereinfacht. Da ChatGPT mit Daten aus dem Internet trainiert wird hat die Verfügbarkeit von Tutorials und Foreneinträgen einen maßgeblichen Einfluss auf das Ergebnis bezüglich der einzelnen Sprachen.
Das Ziel der Evaluation besteht darin zu zeigen, wie gut generative KI den Code-Analyseprozess unterstützen kann. Die Evaluierung erfolgte, indem sowohl die erstellte Custom GPT als auch die statischen Code-Analyse-Werkzeuge (Default Einstellungen) dieselben Code-Snippets zur Analyse zur Verfügung gestellt bekamen. Diese Snippets enthielten Schwachstellen aus den OWASP Top 10. Anschließend wurde ausgewertet, wie viele dieser Schwachstellen die jeweiligen Werkzeuge erkannten (True-Positives) und wie viele unentdeckt blieben (False-Negatives). Diese Vorgehensweise ermöglichte einen direkten Vergleich der Effektivität der verschiedenen Analyse-Werkzeuge unter identischen Testbedingungen.
Ein weiterer Aspekt der Untersuchung neben der Erkennungsrate von Schwachstellen war die Analyse der False-Positives der verschiedenen Werkzeuge, also wie häufig die Werkzeuge bei sicherem Code fälschlicherweise Alarm schlagen. Code-Stellen, bei denen kein Alarm geschlagen wird, sind True-Negatives. Je höher die False-Positives Rate, desto öfter identifizieren die Werkzeuge sicheren Code als anfällig. Dazu wurden sichere Varianten der zuvor unsicheren Code-Snippets erstellt und den Werkzeugen erneut zur Verfügung gestellt.
Die Ergebnisse
Zunächst rückt nun die generelle Code Analyse Performance von ChatGPT, Snyk und DeepSource in den Fokus. Danach folgt ein detaillierteres Code-Beispiel. Gezeigt werden die beobachteten Erkennungsraten und die Diskussion möglicher Gründe hierfür.
Erkennungsrate der Schwachstellen
Wie in Bild 1 zu sehen ist, zeigt ChatGPT-4 eine hohe Erkennungsrate (True-Positives) von etwa 88 % bei Code-Schwachstellen über alle getesteten Programmiersprachen hinweg. ChatGPT ordnet Muster ein und wertet diese statistisch aus. Daher ist diese hohe Erkennungsrate ein Indiz für eine gute Repräsentation ähnlicher Probleme im Trainingsdatensatz der generativen KI. Im Vergleich dazu lag die Erkennungsrate der statischen Analyse-Werkzeuge Snyk und DeepSource bei etwa 31 %. Diese Unterschiede sind auf die Funktionsweise der statischen Code-Analyse-Werkzeuge zurückzuführen. Statische Code-Analyse-Werkzeuge verwenden Data Flow Analysis, Control Flow Graphs, Taint Analysis und Lexical Analysis. Diese Methoden nutzen Compiler Technologien, um Information sowie Muster zu sammeln und basierend darauf Entscheidungen zu treffen. Diese Muster entsprechen bekannten Schwachstellen, Fehlern oder Abweichungen von Best Practices. Dadurch entstehen Erkennungsprobleme mit Schwachstellen, wie Authentifizierungsprobleme, Rechtevergabe, Zugangskontrolle und unsichere Verwendung von Kryptographie, die sich mit diesen Methoden nur schwer feststellen lassen. Fehler in Best Practices sind zum Beispiel die Vergabe von zu vielen Rechten für nicht privilegierte Nutzer. Gerade am Beispiel Rechtevergabe wird deutlich, dass generative KI dieses Muster durch entsprechende trainierte Beispiele erkennt und im Gegensatz dazu die Analyse-Werkzeuge für statische Code-Analyse die Rechtevergabe nicht auf deren Logik überprüfen können.
Die Fähigkeit von ChatGPT, kontextuelle Informationen einzuordnen, ermöglicht eine tiefere und umfassendere Analyse des Codes. Dies zeigt sich in unserem Experiment in der Identifikation von Schwachstellen, die nicht nur auf oberflächlichen Mustern basieren, sondern auch die Logik und Struktur des Codes einbeziehen. ChatGPT liefert für jede identifizierte Schwachstelle praktikable Lösungsansätze, um diese zu beheben. Diese Lösungsansätze, aber auch die Erkennung der Probleme, sind vor allem aus Foreneinträgen gelernt, welche ChatGPT selbständig kombiniert, allerdings nur auf bereits im Internet dokumentiertes zurückgreifen kann.
False-Positive Rate
ChatGPT zeigte jedoch auch eine hohe False-Positive Rate von 34 %, was darauf hinweist, dass sicherer Code häufig fälschlicherweise als unsicher markiert wird (Bild 2). Diese Tendenz zur Überidentifikation sicherer Codeabschnitte als anfällig beleuchtet die Herausforderungen beim Einsatz von generativer KI in der Code-Analyse. Die statischen Analyse-Werkzeuge hatten eine deutlich niedrigere False-Positive Rate von 7 %. Die hohe False-Positive Rate von ChatGPT lässt sich auf die inhärente Neigung der KI-Modelle zurückführen, einen Fehler zu suchen, wenn danach gefragt wird. Im produktiven Einsatz im Entwicklungsprozess kann diese Eigenschaft viel manuelle Nachkontrolle bewirken und durchaus auch viel Frust über die Ungenauigkeit hervorrufen.
Auswertung des Beispielcodes
Zur Veranschaulichung von Schwachstellen, die Kontextwissen benötigen, sei an dieser Stelle ein Code-Snippet in C++ präsentiert, das auf einem bereitgestellten Beispiel des Cybersecurity-Unternehmens Snyk basiert. Dieses illustriert die Schwachstelle »Insecure Design«:
#include <fstream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
// Open the permissions file and parse the roles
const json empl_role = [] {
std::ifstream fin(„./permissions.json“);
return json::parse(fin);
}();
void remove_employee(int employee_id, const std::string& person_request) {
// Return the JSON object of the requesting person
auto requester = std::find_if(empl_role.begin(), empl_role.end(),
[&person_request](const auto& emp) {
return emp[„name“] == person_request;
});
// Return early if the requesting person is not found
if (requester == empl_role.end()) {
return;
}
// Get the role from the requesting person
std::string role = requester->at(„role“);
// Allow the roles ’developer’ and ’owner’ to delete employees
if (role == „developer“ || role == „owner“) {
db.query(„DELETE FROM employees WHERE ID = ?“, {employee_id},
[](const auto& err, const auto& data) {
if (err) throw err;
});
}
}
Dieses Code-Snippet demonstriert eine grundlegende Zugriffskontrolle und Benutzerverwaltung in einem System. Zunächst wird eine JSON-Datei namens permissions.json geladen, die die Rollen der Mitarbeiter spezifiziert. Im Hauptteil des Codes gibt es eine Funktion namens remove employee, die dazu dient, einen Mitarbeiter aus der Datenbank zu entfernen, wenn der anfragende Nutzer die entsprechende Berechtigung hat. Der anfragende Nutzer wird durch seinen Namen identifiziert, der dann im JSON-Objekt empl_roles gesucht wird. Findet die Funktion den Nutzer nicht, bricht sie ab. Wenn der anfragende Nutzer gefunden wird, wird seine Rolle überprüft. Nur Nutzer mit den Rollen »developer« oder »owner« dürfen Mitarbeiter entfernen. Ist dies der Fall, führt die Funktion einen Datenbankbefehl aus, um den Mitarbeiter zu löschen. Dieses Code-Snippet illustriert, wie einfache Sicherheitsüberprüfungen in einer Software-Anwendung implementierbar sind, um sicherzustellen, dass nur autorisierte Personen kritische Aktionen, wie das Löschen von Mitarbeiterdaten durchführen können. Allerdings offenbart eine nähere Betrachtung, dass das Entfernen von Mitarbeitern ein kritischer Prozess ist, der ausschließlich von Administratoren beziehungsweise »Owners« ausgeführt werden sollte und nicht von »Developers« was zu einem unsicheren Design führen kann.
| ChatGPT und die Angreifer |
|---|
| In den nächsten beiden Artikeln dieser Artikelserie wird das Experiment auf die Nutzung von ChatGPT aus der Sicht der Angreifer erweitert. Speziell geht es dort um die Generierung von Schadsoftware und die Unterstützung von Social Engineering. Beides sin rasant wachsende Bereiche, deren Verständnis für Entwickler unabdinglich ist, um den Bertreib einer sicheren Umgebung zu gewährleisten. |
Beim Scannen des Codes mit den statischen Werkzeuge Snyk und DeepSource wurde diese Schwachstelle nicht erkannt, da diese Werkzeuge kein Kontextverständnis besitzen. ChatGPT hingegen erkannte die Schwachstelle durch den Kontext, dass die Rolle »Developer« nicht die Berechtigung haben sollte, Mitarbeiter zu entfernen. Das Beispiel zeigt, warum ChatGPT eine deutlich höhere Erkennungsrate aufweist, da es komplexere Probleme erkennt, die durch einfache regelbasierte Mustervergleiche nicht identifizierbar sind.
Die Pro und Contras
Die Ergebnisse der Untersuchung verdeutlichen die transformative Kraft von KI-basierten Werkzeugen in der Cybersicherheitslandschaft. Diese Werkzeuge zeichnen sich durch ihre Fähigkeit aus, kontextbasierte und nicht kontextbasierte Schwachstellen effizient zu erkennen. Diese Eigenschaften stehen in starkem Kontrast zu den traditionellen, statischen Code-Analysemethoden, deren Fähigkeiten größtenteils regelbasierte Mustererkennung beinhaltet.
Die dynamische Analysefähigkeit und hohe Erkennungsrate von ChatGPT unterstreicht das Potenzial von KI-basierten Ansätzen in der Code-Analyse. Allerdings führt die hohe False-Positive Rate und das nicht deterministische Verhalten zu Herausforderungen, die durch spezialisiertere Trainings der generativen KI und gezieltes Prompting angegangen werden können. Erste Werkzeuge bieten auch schon diese Spezialisierungen an, wie zum Beispiel IntelliCode und GitHub CoPilot.
Schon gewusst? In einer neuen Artikelserie werden die Möglichkeiten und die Herausforderungen von ChatGPT für die Industrie herausgearbeitet. https://bit.ly/3VuxSHf
© Limitless Visions/stock.adobe.comEine wichtige Erkenntnis ist, dass die Zugänglichkeit und die sehr hohe True-Positive Rate vielversprechende Eigenschaften sind. Die Ergebnisse deuten darauf hin, dass KI-Werk-zeuge eine wertvolle Ergänzung zu traditionellen Methoden darstellen, jedoch noch Optimierungspotenzial bieten. Das KI-Werkzeug bietet Sicherheitsexperten eine weitere Möglichkeit, um Bedrohungen proaktiv zu erkennen und zu mitigieren. Allerdings bringt das Werkzeug auch Risiken mit sich. Neben der hohen False-Positive Rate, lassen sich die Werkzeuge auch von Angreifern nutzen, um Schwachstellen leichter zu entdecken und auszunutzen. Dies kann die Einstiegshürden für cyber-kriminelle Aktivitäten deutlich verringern, da es sowohl erfahrenen als auch weniger erfahrenen Angreifern ermöglicht wird, Sicherheitsschwachstellen zu erkennen.
Die Autoren
Prof. Dr. Tobias Heer ist Professor für IT-Sicherheit und Dekan der Fakultät IT an der Hochschule Esslingen.
Lukas Bechtel ist wissenschaftlicher Mitarbeiter für IT- Sicherheit an der Hochschule Esslingen.
Dieter Holstein ist Masterstudent an der Hochschule Esslingen.
Nils Lohmiller ist wissenschaftlicher Mitarbeiter für IT- Sicherheit an der Hochschule Esslingen.

















