Copilot verstärkt unsichere Codebases, indem er Schwachstellen in Ihren Projekten repliziert
22. Februar 2024
0 Min. LesezeitWussten Sie, dass GitHub Copilot möglicherweise unsicheren Code vorschlägt, wenn Ihre vorhandene Codebase Sicherheitsprobleme aufweist? Wenn Ihre Codebase hingegen bereits sehr sicher ist, ist es weniger wahrscheinlich, dass Copilot Code mit Sicherheitsproblemen generiert. KI-Coding-Assistenten können aufgrund ihres begrenzten Verständnisses Ihrer spezifischen Codebase unsicheren Code vorschlagen. Sie ahmen erlernte Muster nach oder nutzen verfügbaren Kontext, ohne eine Bewertung vorzunehmen. Wenn Copilot bessere Beispiele zum Lernen erhält, kann dies sein Verhalten verbessern, aber es garantiert keinen Schutz oder Sicherheitsleitplanken gegen Schwachstellen. Dies ähnelt der „Broken Windows“-Theorie, die besagt, dass sichtbare Anzeichen von Kriminalität, antisozialem Verhalten und ziviler Unordnung zusammen ein städtisches Umfeld schaffen, das weitere Kriminalität und Unordnung fördert.
In diesem Beitrag zeigen wir anhand eines konkreten Beispiels, wie Copilot vorhandene Sicherheitsprobleme in Ihrem Code replizieren kann. Das Beispiel verwendet Copilot in einem Projekt, das viele Schwachstellen aufweist. Copilot nutzt die Funktion „Benachbarte Tabs“, um auf den Code aus geöffneten Dateien in unserer IDE zuzugreifen und Kontext bereitzustellen. Da der Kontext in diesem Fall Schwachstellen enthält, verstärkt Copilot die Sicherheitsprobleme im Projekt durch seine Vorschläge noch weiter. Das bedeutet, dass vorhandene Sicherheitslücken in einem Projekt die Unsicherheit von Entwickler/innen, die Copilot verwenden, noch weiter erhöhen können. Im nächsten Abschnitt werden wir dies genauer betrachten.
Umgekehrt ist es weniger wahrscheinlich, dass Copilot in Projekten ohne Sicherheitsprobleme unsicheren Code vorschlägt, da es weniger unsicheren Code-Kontext hat, aus dem es schöpfen kann. Dies ist ein großer Anreiz, Zeit in die Reduzierung von Schwachstellen in Ihrer vorhandenen Codebase zu investieren, da dadurch Probleme, die in Zukunft durch generative KI-Coding-Assistenten entstehen, reduziert werden. Snyk-Daten zeigen, dass das durchschnittliche kommerzielle Projekt durchschnittlich 40 Schwachstellen im Code des Erstanbieters aufweist. Fast ein Drittel dieser Probleme sind Probleme mit hohem Schweregrad. Genau hier können von KI-Generierungstools Code-Duplikate erstellt werden, die diese Schwachstellen als Kontext verwenden. Die häufigsten Probleme, die Snyk in kommerziellen Projekten sieht, sind Cross-Site-Scripting (XSS), Path-Traversal, hartcodierte Secrets und Anmeldedaten sowie SQL-Injektion.
Das Problem verstehen
Generative KI-Coding-Assistenten wie GitHub Copilot, AWS CodeWhisperer und ChatGPT bieten einen deutlichen Fortschritt bei der Steigerung der Produktivität und Code-Effizienz. Aber denken Sie daran, dass generative KI-Coding-Assistenten wie Copilot die Semantik von Code nicht wirklich verstehen und ihn daher auch nicht beurteilen können. Im Wesentlichen ahmt das Tool Code nach, den es zuvor während seiner Schulung gesehen hat. Bessere Rollenmodelle sorgen für ein besseres Verhalten, aber sie bieten keine Gewähr. Wenn Sie möchten, dass der von Ihrer KI generierte Code sicher ist, benötigen Sie eine Sicherheitsleitplanke.
Ein wichtiger Bestandteil der Bereitstellung relevanter Vorschläge für einen Benutzer ist der Kontext.
Copilot generiert Code-Snippets auf der Grundlage von Mustern und Strukturen, die es aus einem riesigen Bestand an vorhandenem Code gelernt hat. Es verwendet „Prompt Engineering” und „benachbarte Tabs” als Kontext, um relevanten Code vorzuschlagen. Diese Dateien können Tabs sein, die Sie kürzlich geöffnet haben, oder Dateien, die ursprünglich in Ihrem Projekt vorhanden waren. Dieser Ansatz hat mehrere Vorteile, kann aber auch einen gravierenden Nachteil im Hinblick auf die Sicherheit haben.
Ursprünglich konnte Copilot nur die Datei, in der Sie gerade programmierten, als Kontext verwenden. Natürlich waren die Vorschläge nicht so relevant für das gesamte Projekt, da die Algorithmen nicht den Rest der Codebase verwenden konnten, um Vorschläge zu generieren, die für das gesamte Projekt relevant waren. Der nächste Schritt war die Erstellung einer Prompt-Bibliothek, in der eine Vielzahl von Daten über den Kontext des Entwicklers gespeichert werden und die den Prompt des Benutzers besser interpretiert, um eine genauere Antwort auf der Grundlage von Algorithmen zu liefern, die viel mehr Kontextdaten priorisieren. Schließlich ist die Technik der benachbarten Tabs eine Technik, bei der Copilot die in der IDE eines Entwicklers geöffneten Dateien verwenden und diese neben der Datei, an der der Entwickler gerade arbeitet, höher priorisieren kann. Indem Entwickler/innen mehr Dateien öffnen, die für ihr Projekt relevant sind, erhalten sie Ergebnisse, die besser zu ihren Prompts passen. Akash Sharma, GitHub Copilot Community Leader, beschrieb die Vorteile dieser Funktion in einem kürzlich veröffentlichten Kommentar und sagte, dieses Verhalten hat die Akzeptanz von Copilot-Vorschlägen um fast das Doppelte erhöht, von ~20 % auf 35 %.
Was aber, wenn Ihre Entwickler/innen in diesem Projekt nicht über fundierte Sicherheitskenntnisse verfügen? Was ist, wenn diese Projekte bereits Sicherheitsprobleme und Qualitätsmängel aufweisen, die in Ihrem Projekt als nicht verwaltete technische Schulden verbleiben?
Einfach ausgedrückt: Wenn Copilot Code vorschlägt, kann es vorkommen, dass bestehende Schwachstellen und schlechte Praktiken in den Nachbardateien unbeabsichtigt repliziert werden. Dies kann zu unsicheren Programmierpraktiken führen und eine Reihe von Schwachstellen öffnen.
Sehen wir uns das einmal in Aktion an:
Im obigen Video sehen wir, wie wir Copilot bitten können, einige SQL-Abfragen zu erstellen, um einige Benutzereingaben mit einem Produktnamen oder einer Beschreibung in unserer Datenbank abzugleichen. Wir wissen, wie gefährlich eine SQL-Injektion-Schwachstelle in einer Anwendung sein kann, und möchten sicherstellen, dass wir keine in unseren Code einbauen. Wenn wir zum ersten Mal eine Abfrage starten, erhalten wir Folgendes:
1// create query to match input with the description or product name
2var query = em.createQuery("SELECT p FROM Product p WHERE LOWER(p.description) like OR lower(p.productName) like :input", Product.class);
Das sieht nach gutem Code aus, da wir benannte Parameter verwenden, die uns vor SQL-Injektion-Angriffen schützen. Allerdings fügen wir dann in einem benachbarten Tab ein anfälliges Code-Snippet ein, das an anderer Stelle in unserem Projekt eine SQL-Abfrage erstellt. Wenn wir Copilot das nächste Mal genau dieselbe Anfrage stellen, verwendet er den neuen anfälligen Kontext und repliziert unser anfälliges Beispiel, wodurch diese Schwachstelle in unserem neuen Code-Vorschlag wie folgt verstärkt wird:
1// create query to match input with the description or product name
2String query = "Select * from Product where lower(description) like '%" + lowerInput + "%' OR lower(product_name) like '%" + lowerInput + "%'";
Wir haben gerade von einer SQL-Injektion in unserem Projekt auf zwei erhöht, weil Copilot unseren verwundbaren Code als Kontext verwendet hat, um daraus zu lernen.
Verschlimmerung von Sicherheitsproblemen
Bei Codebases, die Sicherheitsschwachstellen enthalten, kann dieses Verhalten diese Probleme auf verschiedene Weise verschärfen:
Verstärkung schlechter Gewohnheiten: Bei unerfahrenen oder unsicheren Entwickler/innen können die Code-Vorschläge von Copilot schlechte Gewohnheiten bei der Programmierung verstärken. Wenn sie sehen, dass unsichere Codemuster nachgeahmt werden, nehmen sie möglicherweise an, dass diese Praktiken akzeptabel sind, was letztlich zum Fortbestehen von Sicherheitsproblemen führt.
Mangelnde Überprüfung: Der von Copilot generierte Code kann ohne gründliche Überprüfung implementiert werden. Das Fehlen menschlicher Eingriffe kann dazu führen, dass Schwachstellen unbemerkt bleiben, da der Kontext, in dem der Code erzeugt wird, nicht immer auf diese Probleme hinweist.
Veraltete und fehlerhafte Muster: Copilot kann Code vorschlagen, der auf veralteten oder fehlerhaften Codemustern basiert, die in der Vergangenheit als akzeptabel galten, jetzt aber als Sicherheitsrisiko erkannt werden.
Übersehen von Sicherheitsbedenken: Copilot konzentriert sich auf die Codegenerierung und nicht auf die Bewertung der Sicherheit. Die Entwickler/innen sind möglicherweise mehr auf die Funktionalität als auf die Sicherheit bedacht und übersehen dabei versehentlich Schwachstellen.
Was können Sie tun, um das Problem zu entschärfen?
Um das Problem der Duplizierung bestehender Sicherheitsprobleme in von KI-Coding-Assistenten generiertem Code zu entschärfen, können Unternehmen mehrere Schritte unternehmen:
Entwickler/innen sollten immer manuelle Überprüfungen des von Coding-Assistenten erzeugten Codes durchführen. Diese Überprüfung sollte eine umfassende Sicherheitsbewertung beinhalten, um Schwachstellen zu identifizieren und zu beheben.
Sicherheitsteamssollten SAST-Leitplanken einführen, einschließlich bekannter Richtlinien, nach denen ihre Entwicklungsteams arbeiten können. Snyk kann Ihnen dabei helfen, Sicherheitsprobleme sowohl in manuell geschriebenem als auch in generiertem Code schnell zu identifizieren und zu beheben. Dabei erhalten Sie Unterstützung bei der Behebung neuer Probleme, die Sie Ihrer Codebase hinzufügen.
Entwickler/innen können sich an Richtlinien für sichere Programmierung halten, die von Entwicklungsteams (Sicherheits-Champions) und Sicherheitsteams aufgestellt wurden.
Sicherheitsteams können den Entwicklungsteams die notwendige Schulung und Sensibilisierung bieten,indem sie ein Verständnis für allgemeine Sicherheitsschwachstellen und bewährte Praktiken vermitteln, so dass die Entwickler/innen bei der Überprüfung von KI-generiertem Code fundierte Entscheidungen treffen können.
Sicherheitsteams können dabei helfen, den Rückstau an Problemen pro Entwicklungsteam zu priorisieren und zu sortieren. Durch die Eliminierung der gefährlichsten Probleme pro Projekt verringert sich die Wahrscheinlichkeit, dass generative KI-Coding-Assistenten sie in vorgeschlagenem Code replizieren.
Führungskräfte können Sicherheitsleitplanken als Bedingung für den Einsatz von generativen KI-Coding-Assistenten vorschreiben und so das Bewusstsein für die Risiken und die Abhilfemaßnahmen weiter schärfen.
Schlussfolgerung: KI-Coding-Assistenten brauchen Sicherheitsleitplanken
Es ist wichtig zu erkennen, dass generative KI-Coding-Assistenten wie Copilot die Semantik des Codes nicht verstehen und ihn daher nicht beurteilen können. Im Wesentlichen ahmt das Tool Code nach, den es zuvor während seiner Schulung gesehen hat. Bessere Rollenmodelle sorgen für ein besseres Verhalten, aber sie bieten keine Gewähr. Wenn Sie möchten, dass der von Ihrer KI generierte Code sicher ist, benötigen Sie eine Sicherheitsleitplanke.
Vor diesem Hintergrund ist es wichtig, generative KI-Coding-Assistenten-Tools mit traditionellen AppSec-Techniken zu kombinieren, um neue Probleme zu entschärfen, sobald sie auftauchen. Zu diesen Techniken gehören manuelle Code-Reviews, Richtlinien für eine sichere Programmierung, Schulungen und statische Analysetests während des gesamten SDLC – insbesondere zu einem frühen Zeitpunkt an Orten wie der IDE, an denen dieser Code generiert wird. Auf diese Weise können wir ein Gleichgewicht zwischen Innovation und Sicherheit herstellen und unsere Anwendungen letztlich widerstandsfähiger gegen potenzielle Bedrohungen machen.
Darüber hinaus ist es aufgrund des Verhaltens von generativen KI-Coding-Assistenten noch wichtiger, bestehende Sicherheitslücken in unseren Codebases zu beheben, denn je weniger Schwachstellen in unserem Code vorhanden sind, desto weniger anfällige Vorschläge werden von unseren KI-Coding-Assistenten gemacht.
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.