In this article
Kann Machine Learning Path-Traversal-Schwachstellen in Go finden? Snyk Code schon!
Wer liebt keine gute Security-Herausforderung? Ich auf jeden Fall. Aber glauben Sie, dass ein Machine-Learning-Algorithmus der Herausforderung gewachsen ist, Path-Traversal-Schwachstellen zu erkennen? Finden wir es heraus!
In den letzten Wochen hat Zeyad AbuLaban eine Reihe von Beiträgen zu sicherem Code und Sicherheitslücken veröffentlicht. In seiner Reihe „Secure Code Quest“ stellt er Schwachstellen verschiedener Arten und in unterschiedlichen Programmiersprachen vor.
Als Zeyad seine Secure Code Quest #5 veröffentlichte, wollte ich nicht sofort den Code im Bild unter die Lupe nehmen, um nach unsicheren Mustern zu suchen. Stattdessen kam mir ein anderer Gedanke: „Was passiert, wenn ich diesen Go-Code in meine IDE einfüge und mit meiner Snyk VS Code-Erweiterung scanne? Erkennt sie die Schwachstelle?“

Ist dieser Golang-Code anfällig oder nicht?
Sehen wir uns zunächst den Go-Programmcode in einem übersichtlich formatierten Layout an, damit wir ihn im Rahmen eines gründlichen Code-Reviews genauer untersuchen können.
Dieses Golang-Programm verarbeitet Dateien und enthält daher eine Funktion downloadHandler(), die als HTTP-Controller fungiert. Sie erwartet den Abfrageparameter filename, bereinigt den Pfad und nimmt eine Sicherheitsbereinigung vor. Anschließend erstellt sie einen Dateipfad zu einem Speicherordner auf der Festplatte (baseDir := “public/files/”), indem sie den Dateinamen an ein Basisverzeichnis anhängt.
package main
import (
// ... imports ...
)
func main() {
// ... main function code ...
}
func downloadHandler(w http.ResponseWriter, r *http.Request) {
filename := r.URL.Query().Get("filename")
if filename == "" {
http.Error(w, "Missing filename parameter", http.StatusBadRequest)
return
}
// Preventing Path Traversal
sanitizedFilename := strings.Replace(filename, "../", "", -1)
cleanedFilename := filepath.Clean(sanitizedFilename)
baseDir := "public/files/"
fullPath := filepath.Join(baseDir, cleanedFilename)
// ... code to handle file serving ...
}Wie setzt dieses Go-Programm Sicherheitskontrollen um? Es verwendet eine String-Ersetzungslogik, um alle Vorkommen von ../ im angegebenen Dateinamen durch eine leere Zeichenfolge zu ersetzen und sie so vollständig aus dem vom Benutzer eingegebenen Dateinamen zu entfernen.
Stellen Sie sich folgende HTTP-Anfrage vor:
curl "http://localhost:8080/download?filename=../../app/flag.txtBei dieser HTTP-Anfrage werden alle ../-Pfade aus der Variable filename entfernt. Dadurch bleibt als Eingabe für filename nur app/flag.txt übrig. Dieser Wert wird dann mit dem Pfad baseDir verknüpft, sodass sich als vollständiger Pfad public/files/app/flag.txt ergibt.
Wie ließe sich diese Schutzmaßnahme also umgehen?
Wie müssten Sie die HTTP-Anfrage gestalten, um die Capture-the-Flag-Datei /app/flag.txt abzurufen, die Herausforderung zu meistern und den Preis zu gewinnen?
Bevor ich die Payload verrate, zeige ich Ihnen, was passiert, wenn Sie dieses Golang-Programm in die IDE einfügen.
Code mit Machine Learning schützen
Zunächst habe ich diese Logik als neue Route in meine Webanwendung eingebunden, die Gin verwendet. Deshalb sieht die Routendeklaration hier etwas anders aus. Anschließend habe ich den Code nach der Variable fullPath vervollständigt, um eine grundlegende Dateiüberprüfung durchzuführen und die Datei schließlich an den Client zurückzusenden.

Stellen Sie sich nun vor, die Snyk-Erweiterung wäre in Ihrer IDE installiert.
Sie müssen die Datei nur speichern. Sekunden später – tatsächlich dauert es nur Sekunden – erhalten Sie ein Code-Sicherheitsaudit, das Ihren Quellcode analysiert, einschließlich Abhängigkeiten, Dockerfile, Terraform und mehr.
Die Snyk IDE-Erweiterung liefert nicht nur einen Sicherheitsbericht, sondern hebt die anfällige Codezeile auch im Stil eines Linters hervor, um Ihre Aufmerksamkeit darauf zu lenken. Darüber hinaus stellt sie weitere Tools bereit, mit denen Sie das jeweilige Sicherheitsproblem genauer untersuchen können:
Name und Details der Sicherheitslücke.
Der Datenfluss von Quelle zu Senke zeigt, wie nicht bereinigte Daten in sensible APIs gelangen.
Erfahren Sie mehr über diese Path-Traversal-Schwachstelle, falls Sie noch nicht davon gehört haben.
Wenn Sie nicht sicher sind, wie Sie die Schwachstelle beheben können, erhalten Sie Beispiele für Fixes, die Sie übernehmen können.
In manchen Fällen bietet Snyk außerdem den Snyk Agent Fix an. Er behebt das Sicherheitsproblem automatisch, indem er den Code so umstrukturiert, dass die Schwachstelle entfernt wird, ohne die Logik zu verändern.

Was hat Machine Learning damit zu tun? Nun, alles.
Snyks SAST (Static Application Security Testing) analysiert Ihren Quellcode und verarbeitet ihn anschließend mit der proprietären Machine-Learning-Engine von Snyk. Diese Sicherheits-Engine basiert auf einem leistungsstarken Symbolic-AI-Algorithmus, der mit umfangreichen Codebasen trainiert wurde. Sicherheitsexperten haben unsichere Codemuster erkannt, klassifiziert und in einem Feinabstimmungsprozess gekennzeichnet.
Dieser anspruchsvolle technische Prozess läuft innerhalb von Sekunden direkt in meiner IDE ab und erkennt Sicherheitslücken in meinem Code mit unübertroffener Geschwindigkeit und Genauigkeit. Die Engine wurde auch darauf trainiert, wie guter Code aussieht. Außerdem analysierte sie echte Sicherheitskorrekturen in Open-Source-Code-Repositories, um Änderungen mit Beispielen für korrigierten Code vorzuschlagen, die ich übernehmen kann, wenn ich unsicher bin, wie ein Sicherheitsproblem behoben werden muss.
Die Kombination generativer Machine-Learning-Algorithmen und symbolischer KI sorgt dafür, dass Snyk Code-Schwachstellen mit außergewöhnlicher Produktivität erkennt. Erfahren Sie mehr darüber, wie Snyk die sichere Einführung von KI gewährleistet.
Golang für Path Traversal ausnutzen
Ach ja, zurück zu unserer Security-Herausforderung. Wie nutzen wir die Path-Traversal-Schwachstelle im gezeigten Golang-Programm aus und holen uns die Flagge?
Zur Erinnerung: Hier ist die Logik zur Abwehr von Path Traversal im Golang-Programm:
// Preventing Path Traversal
sanitizedFilename := strings.Replace(filename, "../", "", -1)
cleanedFilename := filepath.Clean(sanitizedFilename)Die String-Ersetzungslogik sucht nach dem Text ../. Das bedeutet: Wenn der Dateiname das klassische Path-Traversal-Muster enthält, etwa „../“, wird es ersetzt.
Was passiert jedoch, wenn wir den Path-Traversal-Text so verändern, dass er die genaue Übereinstimmungslogik umgeht? Sehen Sie sich die folgende HTTP-Payload mit der geänderten Eingabe für filename an:
curl "http://localhost:8080/download?filename=....//....//app/flag.txtWenn der Wert des Query-Strings filename zu ....//....//app/flag.txt, wird, werden die Vorkommen von „../“ gefunden (sie befinden sich innerhalb der Zeichenfolge des Dateinamens) und entfernt. Übrig bleiben die Zeichenfolgen „..“ und das einzelne „/“ im tatsächlichen Dateinamen. Dadurch erhält sanitizedFilename den Wert ../../app/flag.txt. Der Pfad führt aus dem Basisverzeichnis (public/files/) heraus, und die Datei flag.txt wird an den Client gesendet.
Machen Sie bei Fetch the Flag 2026 mit!
Stellen Sie Ihre Security-Kenntnisse bei unserem Capture-the-Flag-Event vom 12. bis 13. Februar auf die Probe, von 12 Uhr mittags bis 12 Uhr mittags ET.