Skip to main content

Auto-Fixing von Code-Schwachstellen mit KI

Artikel von

14. Oktober 2024

0 Min. Lesezeit

In unserer Bibliothek für SecRel-Workshops, die wir unseren Kunden anbieten, findet sich einer namens „Breaking AI“. Im Fokus steht dabei, wie Entwickler mithilfe von GenAI-Assistenten wie Copilot und Codium ihre Release-Frequenz erhöhen können. Die zentrale Erkenntnis dieses Workshops: KI-Assistenten sind wie angehende Entwickler, die hoch motiviert aus ihrem Coding-Bootcamp kommen. Sie sind eine große Hilfe, doch niemals würde man ihren Code ungeprüft lassen. Was keineswegs ein Angriff auf angehende Entwickler sein soll – ihr Einsatz ist für die Dev-Community ungemein wichtig. Aufgezeigt wird in dem Workshop, wie die Kombination aus KI-Assistenten und Snyk das beste beider Welten verbindet: schnellen und zugleich sicheren Code-Output.

Mit Snyk Agent Fix gehen wir noch einen Schritt weiter. Snyk Code ist seit jeher bekannt dafür, zu erkannten Schwachstellen nützliche Empfehlungen für ihre Behebung zu geben. So etwa auch drei gute Referenzen für Open-Source-Projekte, in denen die jeweilige Schwachstelle aufgetreten ist und wie sie darin behoben wurde. Mit präzise kuratierten Daten unserer Security-Experten und einer Hybrid-KI, die generative und symbolische KI mit Modellen für maschinelles Lernen vereint, heben wir dies auf das nächste Level. Denn damit können Sie gängige Schwachstellen nun komplett automatisch innerhalb Ihrer gewohnten IDE-Workflows beheben.

Wie Sie die Vorteile von DeepCode (DCAIF) für sich nutzen können, zeige ich in diesem Artikel am Beispiel eines Java-Projekts auf, das wir in unseren Workshops verwenden. Den zugehörigen Quellcode finden Sie hier. HINWEIS: Dieses Projekt beinhaltet Schwachstellen, die zu Schulungszwecken eingebaut wurden. Es ist nicht für den Einsatz in Produktionsumgebungen geeignet.

App zur Konferenzplanung als Beispiel-Use-Case

Wer schon einmal bei einer Tech-Konferenz mitgewirkt hat, dürfte wissen, wie kompliziert sich die Zusammenstellung des Session-Plans gestalten kann.

Zugegeben, meine Referenz-App ist hierfür keine besonders große Hilfe – ich bin einfach kein allzu guter Frontend-Entwickler. Dennoch lässt sich mit ihr gut aufzeigen, wie Code technisch funktional und zugleich anfällig sein kann.

Es handelt sich um eine App auf Basis von Spring Boot, die die Thymeleaf Template-Engine nutzt. Bei ihrem Start produziert sie Namen für Referenten sowie Titel und Beschreibungen für Sessions mithilfe vonfaker, einer beliebten Bibliothek zur Generierung von Daten nach dem Zufallsprinzip. Als Textquelle für die Session-Titel und -Beschreibungen dient das Buch „Per Anhalter durch die Galaxis“ von Douglas Adams. HINWEIS: Dementsprechend sind die Titel und Beschreibungen mitunter eher weniger zur Verwendung im Arbeitskontext geeignet – nicht, dass Sie wirklich auf die kommen würden.

Jeder der für das Event generierten Referenten hat eine eigene Seite, auf der eine Liste ihrer Vorträge aufgeführt ist. Dieser Teil der App ist für unsere Ziele relevant.

Zunächst geben wir folgenden Befehl ein, um die App zu kompilieren und auszuführen.

mvn clean install
mvn spring-boot:run

Beim Start der App wird neben dem standardmäßigen Banner von Spring Boot und anderem Output eine Ausgabe wie die folgende angezeigt:

Access talks for heath.davis at: http://localhost:8081/talks?username=heath.davis
Access talks for russell.bernier at: http://localhost:8081/talks?username=russell.bernier
Access talks for kenyetta.jones at: http://localhost:8081/talks?username=kenyetta.jones
Access talks for howard.bailey at: http://localhost:8081/talks?username=howard.bailey
Access talks for buddy.jast at: http://localhost:8081/talks?username=buddy.jast
Access talks for jeanice.kertzmann at: http://localhost:8081/talks?username=jeanice.kertzmann
Access talks for deborah.hamill at: http://localhost:8081/talks?username=deborah.hamill
Access talks for horacio.renner at: http://localhost:8081/talks?username=horacio.renner
Access talks for winfred.schuster at: http://localhost:8081/talks?username=winfred.schuster
Access talks for tommie.hane at: http://localhost:8081/talks?username=tommie.hane
Access talks for micah at: http://localhost:8081/talks?username=micah

HINWEIS: Bei Ihnen werden die Referenten und ihre Vorträge nicht exakt die gleichen sein, da sie per Zufallsgenerator erstellt werden.

Wenn Sie einen der Links per Mausklick oder Copy-Paste öffnen, wird die Seite des jeweiligen Referenten angezeigt. Wie nachfolgend zu sehen ist, enthält sie eine Liste seiner Vorträge:

Nun zum spannenden Teil: Finden wir die Schwachstelle!

Werfen Sie einen Blick auf die Komponente TalkController.java, anhand derer die Seite des Referenten gerendert wird. Können Sie die Schwachstelle ausmachen?

Moment! Dafür müssen Sie sich natürlich nicht allein auf Ihre Augen verlassen. Schließlich geht es uns darum, Ihnen zu gleichermaßen schneller UND sicherer Entwicklung zu verhelfen.

Meine Java-Anwendungen schreibe ich in IntelliJ Idea, in das ich Snyk via IDE-Erweiterung integriere. Snyk ist jedoch nicht darauf beschränkt: Verfügbar sind Erweiterungen für alle gängigen IDE-Systeme, mit Unterstützung für ein breites Spektrum an Programmiersprachen.

Um die nächsten Schritte durchzuarbeiten, benötigen Sie ein Snyk Konto. Sofern Sie noch keines haben, können Sie sich hier kostenlos registrieren.

Eingangs hatte ich ja darauf hingewiesen, dass diese App eine Vielzahl von Schwachstellen enthält, da wir sie in unseren Workshops verwenden. In diesem Artikel geht es mir um die Schwachstelle in TalkController.java. Der nachfolgende Screenshot zeigt die Ergebnisse, die der Scan von Snyk hierzu geliefert hat.

  1. Gibt an, dass eine Anfälligkeit für Cross-Site-Scripting (XSS) festgestellt wurde.

  2. Zeigt ein diff aus einem von drei Open-Source-Projekten, die dieselbe Schwachstelle aufweisen. Im grün hervorgehobenen Teil ist zu sehen, wie sie in diesem Projekt behoben wurde.

  3. Die wellenförmige Unterstreichung in roter Farbe kennzeichnet, wo sich die Schwachstelle innerhalb des Codes befindet.

Für die Behebung des Problems sind diese Informationen allesamt enorm hilfreich. Zu beachten ist jedoch auch das blitzförmige Symbol (⚡️) bei Punkt 1, das links vom Namen der Schwachstelle angezeigt wird. Damit wird angegeben, dass sich diese Schwachstelle automatisch beheben lässt.

Indem Sie den Mauszeiger über das wellenförmig unterstrichene Element bewegen, erhalten Sie hierfür die Option Fix this issue.

Bevor wir uns ansehen, wie DeepCode das Problem löst, werfen wir noch kurz einen Blick darauf, was Copilot hierzu ausgeben würde.

Nachfolgend mein zugehöriger Prompt zu Zeile 42 sowie der Code, den Copilot dafür einfügt:

// guard against XSS
username = username.replaceAll("<", "&lt;").replaceAll(">", "&gt;");

Gegen einfach gestrickte Angriffe ist dies möglicherweise effektiv. Ob es aber zum Schutz vor allen Arten von XSS-Angriffen taugt, wage ich zu bezweifeln. So zeigt auch ein erneuter Scan mit Snyk, dass der Code die XSS-Schwachstelle weiterhin aufweist.

DeepCode AI setzt dagegen folgenden Fix an:

String usernameStr = "<h1>" + HtmlUtils.htmlEscape(username) + "'s talks<h1>";

Nun, das gefällt mir deutlich besser! Es geht das Problem an, wie man es erwarten würde: idiomatisch anhand einer in Spring Boot integrierten Bibliothek, nämlich HtmlUtils. Denn dadurch ist davon auszugehen, dass der Input username tatsächlich vollständig bereinigt wird. So bestätigt auch ein erneuter Scan mit Snyk, dass die Schwachstelle behoben wurde.

Dafür ganz klar Daumen hoch: Snyk hat die Schwachstelle nicht einfach nur automatisch behoben. Vielmehr war der Auto-Fix auch auf das verwendete Framework zugeschnitten, in diesem Fall also Spring Boot.

DCAIF: Code-Fixing ohne Dev-Bremsen

Dieser Beitrag sollte aufzeigen, wie Snyk Agent Fix Sie nicht nur durch die Behebung von Problemen führt, sondern sie auch für Sie umsetzen kann. Hinzu kommt die Fix-Verlässlichkeit, erkennbar daran, dass die Schwachstelle im Code auch wirklich beseitigt wurde.

Dabei sind wir vom Potenzial KI-gestützter Coding-Assistenten durchaus überzeugt. In punkto Sicherheit fallen sie jedoch zurück. So legen unsere Untersuchungen nahe, dass rund 40 % des Code-Outputs aktueller GenAI-Assistenten nicht sicher ist – ein Wert, mit dem sie in etwa gleichauf mit humangeneriertem Code liegen. Dies lässt sich dadurch erklären, dass die Modelle reiner GenAI-Lösungen wie Copilot in erster Linie anhand von bestehendem Code trainiert werden. Snyk setzt dagegen auf ein hybrides Modell, das symbolische und generative KI mit maschinellem Lernen vereint und zudem mit kuratierten Trainingsdaten unserer Security-Experten angereichert wird. Das Ergebnis ist eine KI, deren Output ganz auf Code-Sicherheit zugeschnitten ist.

Jetzt starten mit Sicherheit für KI-generierten Code

Sie möchten Code aus KI-gestützten Tools in Minutenschnelle sicher machen? Dann registrieren Sie sich direkt für ein kostenloses Snyk Konto oder besprechen Sie in einer Demo mit unseren Experten, was die Lösung für Ihre Use Cases im Bereich Dev-Security möglich macht.

Gepostet in:

Best practices for AI in the SDLC

Download this cheat sheet today to learn best practices for how to leverage AI in your SDLC, securely.