
Ein statisches Analysetool zur Sicherung von Go-Code
GoKart ist ein statisches Analysetool für Go, das Schwachstellen mithilfe der SSA (Single Static Assignment)-Form des Go-Quellcodes findet. Es kann die Quelle von Variablen und Funktionsargumenten zurückverfolgen, um zu bestimmen, ob Eingabequellen sicher sind, was die Anzahl der Fehlalarme im Vergleich zu anderen Go-Sicherheitsscannern reduziert. Beispielsweise wird eine SQL-Abfrage, die mit einer Variable verkettet ist, herkömmlich möglicherweise als SQL-Injection markiert; GoKart kann jedoch herausfinden, ob die Variable tatsächlich eine Konstante oder ein Konstantenäquivalent ist – in diesem Fall liegt keine Schwachstelle vor.
GoKart unterstützt auch Chariot, die Sicherheitsplattform von Praetorian, die Ihnen hilft, Schwachstellen in Ihrem Quellcode und in Cloud-Umgebungen zu finden, zu verwalten und zu beheben. Chariot macht es einfach, automatische, kontinuierliche GoKart-Scans Ihres Quellcodes durchzuführen. Wenn Sie GoKart ausprobieren möchten, können Sie innerhalb weniger Minuten ein kostenloses Chariot-Konto einrichten, indem Sie hier klicken.
Statische Analyse ist eine leistungsstarke Technik zum Auffinden von Schwachstellen im Quellcode. Allerdings leidet der Ansatz unter Rauschanfälligkeit – das heißt, viele statische Analysetools finden eine ganze Reihe von „Schwachstellen", die gar nicht real sind. Dies hat zu Reibungen bei Entwicklern geführt, da die Benutzer es leid sind, dass die Tools zu oft „falschen Alarm" schlagen.
Die Motivation für GoKart war, dies anzugehen: Könnten wir einen Scanner mit deutlich niedrigeren Fehlalarmraten als bei vorhandenen Tools erstellen? Basierend auf unseren Experimenten lautet die Antwort ja. Durch die Nutzung von Source-to-Sink-Tracing und SSA ist GoKart in der Lage, den Variablen-Taint zwischen Variablenzuweisungen zu verfolgen, was die Genauigkeit der Ergebnisse erheblich verbessert. Unser Fokus liegt auf der Benutzerfreundlichkeit: Pragmatisch bedeutet das, dass wir unsere Ansätze optimiert haben, um Fehlalarme zu reduzieren.
Weitere Informationen finden Sie in unserem Blogbeitrag.
Sie können GoKart lokal mit einer der unten aufgeführten Optionen installieren.
go install$ go install github.com/praetorian-inc/gokart@latest
Laden Sie die Binary für Ihr Betriebssystem von der Releases-Seite herunter.
(OPTIONAL) Laden Sie die Datei checksums.txt herunter, um die Integrität des Archivs zu überprüfen.
# Überprüfen Sie die Prüfsumme des heruntergeladenen Archivs
$ shasum -a 256 gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ cat gokart_${VERSION}_${ARCH}_checksums.txt | grep gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ tar -xvf gokart_${VERSION}_${ARCH}.tar.gz
gokart-Binary in Ihren Pfad:$ mv ./gokart /usr/local/bin/
# Klonen Sie das GoKart-Repository
$ git clone https://github.com/praetorian-inc/gokart.git
# Navigieren Sie in das Repository-Verzeichnis und bauen Sie
$ cd gokart
$ go build
# Verschieben Sie die gokart-Binary in Ihren Pfad
$ mv ./gokart /usr/local/bin
Erstellen des Docker-Images
docker build -t gokart .
Ausführen des Containers mit einem lokalen Scan (das lokale Scan-Verzeichnis muss in das Container-Image eingebunden werden)
docker run -v /path/to/scan-dir:/scan-dir gokart scan /scan-dir
Ausführen des Containers mit einem Remote-Scan (bei Angabe eines privaten Schlüssels für die Authentifizierung muss dieser ebenfalls in den Container eingebunden werden)
docker run gokart scan -r https://github.com/praetorian-inc/gokart
# einen privaten Schlüssel für die SSH-Authentifizierung bei privaten Repositorys angeben
docker run -v /path/to/key-dir/:/key-dir gokart scan -r [email protected]:praetorian-inc/gokart.git -k /key-dir/ssh_key
# Die Ausführung ohne Angabe eines Verzeichnisses verwendet standardmäßig '.'
gokart scan <flags>
gokart scan <directory> <flags>
gokart help
Sie können die folgenden Schritte ausführen, um GoKart auf Go Test Bench auszuführen, einer absichtlich verwundbaren Go-Anwendung des Contrast Security Teams.
# Beispiel einer verwundbaren Anwendung klonen
git clone https://github.com/Contrast-Security-OSS/go-test-bench.git
gokart scan go-test-bench/
Die Ausgabe sollte einige identifizierte Schwachstellen anzeigen, jede mit einer verwundbaren Funktion und einer identifizierten Quelle von Benutzereingaben.
Um einige zusätzliche GoKart-Funktionen zu testen, können Sie mit den unten vorgeschlagenen CLI-Flags scannen.
# Verwenden Sie das verbose-Flag, um vollständige Ablaufverfolgungen dieser Schwachstellen anzuzeigen
gokart scan go-test-bench/ -v
# Verwenden Sie das globalsTainted-Flag, um whitelistierte Quellen zu ignorieren
# kann die Anzahl der Fehlalarme erhöhen
gokart scan go-test-bench/ -v -g
# Verwenden Sie das debug-Flag, um interne Analyseinformationen anzuzeigen
# nützlich für Entwicklung und Debugging
gokart scan go-test-bench/ -d
# Ergebnisse im Sarif-Format ausgeben
gokart scan go-test-bench/ -s
# Ergebnisse in eine Datei ausgeben
gokart scan go-test-bench/ -o gokart-go-test-bench.txt
# Sarif-Ergebnisse in eine Datei ausgeben
gokart scan go-test-bench/ -o gokart-go-test-bench.txt -s
# Remote-öffentliches Repository scannen
# Das Repository wird lokal geklont, gescannt und anschließend gelöscht
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -v
# Den zu scannenden Remote-Branch angeben
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -b actions_fix
# Remote-privates Repository per SSH scannen
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git
# Remote-privates Repository scannen und optional einen Schlüssel für die SSH-Authentifizierung angeben
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git -k /home/gokart/.ssh/github_rsa_key
# Remote-Scan und Ausgabe-Flags zusammen für nahtlose Sicherheitsüberprüfungen verwenden
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -v
# Remote-Scan, Ausgabe- und Sarif-Flags für reibungslose Integration in CI/CD verwenden
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -s
Um die Erweiterbarkeit von GoKart zu testen, können Sie die Konfigurationsdatei ändern, die GoKart verwendet, um eine neue verwundbare Senke in die Analyse einzuführen. In der mitgelieferten Standardkonfigurationsdatei util/analyzers.yml ist ein Test-Sink-Analyzer definiert. Ändern Sie util/analyzers.yml, um die Kommentare zum Test-Sink-Analyzer zu entfernen, und weisen Sie GoKart dann mit dem Flag -i an, die geänderte Konfigurationsdatei zu verwenden.
# Mit geänderter analyzers.yml-Datei scannen und vollständige Ablaufverfolgungen ausgeben
gokart scan go-test-bench/ -v -i <path-to-gokart>/util/analyzers.yml
Die Ausgabe sollte nun zusätzliche Schwachstellen enthalten, darunter neue „Testsenke durch Benutzereingabe erreichbar"-Schwachstellen.
Sie können die enthaltenen Tests mit dem folgenden Befehl ausführen, der aus dem GoKart-Stammverzeichnis aufgerufen wird.
go test -v ./...