- Beim Schreiben von Go-Code Sicherheit zu berücksichtigen, ist eine komplexe Aufgabe
- Es werden einige konkrete praktische Maßnahmen vorgestellt, die bei konsequenter Anwendung dabei helfen, robusten, sicheren und leistungsfähigen Code zu schreiben
Go-Version aktuell halten
- Die im Projekt verwendete Go-Version sollte aktuell gehalten werden
- Auch wenn keine neuen Sprachfunktionen verwendet werden, erhält man durch ein Upgrade der Go-Version alle Sicherheitspatches für entdeckte Schwachstellen
- Neue Go-Versionen stellen außerdem die Kompatibilität mit aktuellen Abhängigkeiten sicher
- Auf der Website zur Go-Release-Historie lässt sich prüfen, in welchen Go-Releases welche Sicherheitsprobleme und CVEs behoben wurden, und die Version kann in der
go.mod-Datei des Projekts auf den neuesten Stand gebracht werden
- Nach dem Upgrade der Go-Version sollte geprüft werden, ob Kompatibilitäts- oder Abhängigkeitsprobleme auftreten
- Mit statischen Code-Analysewerkzeugen lassen sich Codequalität und Sicherheit bewerten
vet
- Mit dem von Go selbst bereitgestellten Befehl
go vet lässt sich Go-Code analysieren
- Wird
go vet ohne Argumente ausgeführt, läuft es mit allen standardmäßig erlaubten Optionen
- Es scannt den Quellcode und meldet potenzielle Probleme
- Zu den häufigsten Problemen gehören Fehler bei Goroutinen, ungenutzte Variablen und nicht erreichbare Codebereiche
staticcheck
- Der Third-Party-Linter Staticcheck findet Bugs, erkennt Performance-Probleme und setzt außerdem den Go-Sprachstil durch
- Er erklärt gefundene Probleme und schlägt mit Beispielen Korrekturen vor
- Zusätzlich zur Ausführung in einer CI-Pipeline kann er als eigenständige Binärdatei installiert werden, um Code lokal zu scannen
- Prüfen Sie die installierte Version und ob alles für die Ausführung des Scans bereit ist
- Ohne Argumente werden standardmäßig alle Code-Analyzer aufgerufen
- Im GitHub-Repository NGINX Agent lässt sich beispielhaft sehen, was gefunden werden kann
- Die Scan-Ergebnisse lassen sich in drei Kategorien einteilen: veraltete Pakete/Methoden/Funktionen, ungenutzte Variablen/Felder und Probleme im Zusammenhang mit der Codequalität
golangci-lint
golangci-lint kann mit dem Befehl go install installiert werden
- Prüfen Sie die Version, um sicherzustellen, dass die Installation erfolgreich war
- Ohne Argumente werden alle Linter ausgeführt
- Sehen Sie sich an, welche Warnungen und Vorschläge im zuvor geklonten
agent-Repository angezeigt werden
- Der Linter zeigt auf die genaue Datei und Zeile
- Bewerten und ändern Sie den Code, führen Sie den Linter anschließend erneut aus und lassen Sie alle Unit-Tests laufen
- Wenn die Tests erfolgreich sind, committen Sie den aktualisierten Code und pushen Sie ihn ins Remote-Repository
Race Conditions erkennen
- Race Conditions können auftreten, wenn mehrere Goroutinen gleichzeitig auf eine Ressource zugreifen wollen
- Sie werden erkannt, wenn mindestens eine Goroutine versucht, die Ressource zu verändern
- Go unterstützt standardmäßig das Testen solcher Zustände mit dem
test-Werkzeug zusammen mit dem Argument -race
- Der Race Detector bewertet nur tatsächlich ausgeführten Code und ignoriert nicht ausgeführte Codepfade; deshalb sollte zuerst ein statischer Code-Analyzer laufen, um sicherzustellen, dass kein toter Code vorhanden ist
- Werden Tests parallel ausgeführt, steigt die Wahrscheinlichkeit, Nebenläufigkeitsprobleme zu erkennen
Quellcode auf Schwachstellen scannen
govulncheck
- Ein Werkzeug, das die Codebasis auf bekannte Schwachstellen scannt, die in der CVEs-Datenbank aufgeführt sind
- Es wird vom Go-Team entwickelt, und eine auf Go-Schwachstellen spezialisierte Datenbank liefert dem Scanner die Informationen
- Installieren Sie die aktuelle Version und probieren Sie die Grundfunktionen aus
- Klonen Sie das Repository habit und führen Sie das Werkzeug im Root-Verzeichnis aus
- Es werden keine Schwachstellen gefunden
- Beim Scannen von Binärdateien können andere Schwachstellen entdeckt werden
- Aktualisieren Sie Go auf die neueste Version, holen Sie die Abhängigkeiten und prüfen Sie anschließend, ob Software und Abhängigkeiten frei von CVEs sind
gosec
- Ein statischer Code-Analyzer, der dabei hilft, unsichere Codekonfigurationen zu finden
- Er kann auf dem lokalen System oder in einer CI-Pipeline als GitHub Action ausgeführt werden
- Es gibt zahlreiche Optionen und Regeln zur Konfiguration des Scans
- Klonen Sie ein GitHub-Repository mit zu scannendem Go-Code und starten Sie den Scan im Root-Verzeichnis
- Im Scan-Bericht lässt sich eine Liste potenzieller Probleme anzeigen, sortiert nach Schweregrad und Vertrauenswürdigkeit
- Prüfen Sie die gemeldeten CWEs und lernen Sie mehr über die Details der aufgelisteten Schwachstellen
Fuzzing
- Eine letzte Methode, um die Codequalität zu prüfen und Schwachstellen zu finden
- Spezialisierte automatisierte Tests, die mithilfe der Testabdeckung zufällig erzeugte Eingabedaten manipulieren
- Sehr nützlich, um potenzielle Sicherheitslücken wie Buffer Overflow, SQL Injection, DoS-Angriffe und XSS-Angriffe zu finden
- Da viele Eingabekombinationen automatisch erzeugt werden, müssen Entwickler nicht selbst über Hunderte oder Tausende möglicher Eingabedatenkombinationen nachdenken
1 Kommentare
Hacker-News-Kommentare
govulncheckist ein Tool, das prüft, ob verwundbarer Code tatsächlich erreichbar ist, und damit nützlicher als eine reine Überprüfung der Programmabhängigkeitencapslockanzusehengo vetundgo test -racegosecwar eine neue Entdeckung