10 Punkte von GN⁺ 2024-11-05 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-11-05
Hacker-News-Kommentare
  • govulncheck ist ein Tool, das prüft, ob verwundbarer Code tatsächlich erreichbar ist, und damit nützlicher als eine reine Überprüfung der Programmabhängigkeiten
  • Man sollte nicht vergessen, sich auch Googles Projekt capslock anzusehen
  • Enthält nützliche Tipps zu go vet und go test -race
  • Go ist nicht speichersicher, aber es ist einfacher, darin sicher zu programmieren als in anderen Sprachen
    • Dank der klaren Syntax von Go lassen sich das Verhalten von Funktionen und Datenstrukturen leicht verstehen
    • AI-Tools funktionieren gut mit Go, weil der Kontext innerhalb von Funktionen klar ist
  • Semgrep ist ein hervorragendes Tool, das per statischer Analyse Prüfungen für Sprachen und gängige Frameworks durchführt
    • Die offenen Regeln von Semgrep sind auf GitHub einsehbar
  • Es werden Zweifel am Sicherheitsruf von Go geäußert
    • Go gilt im Allgemeinen als sicher und stabil und liegt auf einem ähnlichen Niveau wie andere Werkzeuge wie .NET
  • gosec war eine neue Entdeckung
  • Während der Wartung von Go-Apps über 9 Jahre hinweg konnten Go-Versionen und Module leicht aktualisiert werden
    • GitHub meldet Schwachstellen automatisch, und in 99 % der Fälle funktioniert alles ohne Änderungen
  • Go ist tatsächlich nicht speichersicher
    • Atomarität ist nur für wortgroße Werte garantiert; Zwei-Wort-Werte wie Interface-Pointer oder Slices können bei Nebenläufigkeit die Speichersicherheit beeinträchtigen
  • Go ist gut, aber mit der jüngsten Zunahme der Nutzung von Generics leidet die Lesbarkeit des Codes
    • Dadurch ist der Code schwerer zu lesen als früherer Go-Code, der kaum Generics verwendet hat