Programmiersprache: Go-Team stopft Sicherheitslücke in go-get-Befehl

Ein Update für die Versionen 1.14 und 1.15 von Googles Programmiersprache behebt eine Schwachstelle, die vor allem unter Windows auftreten kann.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen

(Bild: Tatiana Popova/Shutterstock.com)

Von
  • Rainald Menge-Sonnentag

Das Team hinter der Programmiersprache Go hat Sicherheits-Updates für die Versionen 1.14 und 1.15 der Programmiersprache veröffentlicht. Die Releases 1.15.7 und 1.14.14 beheben eine Schwachstelle, die in der Eingabeaufforderung von Windows und unter bestimmten Umständen auch in der Unix-Shell das Ausführen beliebigen Codes während des Build-Prozesses eines Programms ermöglicht.

Das unter CVE-2021-3115 (Common Vulnerabilities and Exposures) aufgeführte Problem betrifft den Befehl go get, der zum Einbinden von Dependencies beim Erstellen der Anwendung dient. Betroffen sind keine Go-Anwendungen, sondern der entwicklerseitige Build-Prozess.

Wenn der Befehl ein Paket herunterlädt, das über die Anweisung import "C" anzeigt, dass es C-Code ausführt, ruft er den Befehl cgo auf, um Go-Ausgabedateien für den eingebetteten C-Codes zu erstellen. Im Anschluss ruft der go-Befehl den Go-Compiler für die Go-Dateien und den auf dem Rechner vorhandenen C-Compiler gcc oder clang für den C-Code auf.

Um benötigte Executables wie gcc oder clang zu finden, durchsucht go den Pfad des Systems, also $PATH auf Unix-Systemen und %PATH% unter Windows. Für die Schwachstelle kommt eine Besonderheit der Eingabeaufforderung von Windows (cmd.exe) zum Tragen: Sie schaut immer zuerst im aktuellen Verzeichnis nach, bevor sie den Inhalt der %PATH%-Umgebungsvariable durchsucht.

Unix durchsucht aus gutem Grund nicht implizit das aktuelle Verzeichnis vor den Pfadangaben, und Microsoft hat für die Windows PowerShell ebenfalls die implizite Suche im aktuellen Verzeichnis entfernt, sie aber für die Eingabeaufforderung beibehalten. Unix-Nutzer sind nur betroffen, wenn sie zahlreichen Empfehlungen zum Trotz das aktuelle Verzeichnis vor den Systemverzeichnissen in $PATH eintragen.

Beim Aufruf des C-Compilers lässt sich die Schwachstelle noch nicht verwenden. Sollte ein Angreifer in einem Verzeichnis "badpkg" eine eigene "gcc.exe"-Datei ablegen und versuchen über folgenden Code aus einem Blogbeitrag zur Schwachstelle zu aktivieren

cmd := exec.Command("gcc", "file.c")
cmd.Dir = "badpkg"
cmd.Run()

Läuft der Angriff ins Leere, da das Durchsuchen des Pfads nicht aus dem aktuellen Verzeichnis erfolgt, sondern aus demjenigen, in dem der go-Befehl ausgeführt wurde. Auch ein Aufruf eines modifizierten "cgo.exe" in einem entsprechenden Verzeichnis ist auf die Weise nicht möglich, da der Aufruf immer aus GOROOT ohne Berücksichtigung der Umgebungsvariable für den Pfad erfolgt.

Allerdings ruft der cgo-Befehl seinerseits den C-Compiler zum Übersetzen der von ihm erstellten temporären Dateien auf, und dabei gilt das aktuelle Verzeichnis als Ausführungsort. Um an obigen Code anzuknüpfen, greift in dem Fall das Ausführen von go get für Programme mit C-Code aus einem Verzeichnis, in dem sich Schadcode als ein vermeintlicher C-Compiler tarnt, also ein badpkg-Verzeichnis mit einem als gcc.exe benannten Programm:

// running in cgo in badpkg dir
cmd := exec.Command("gcc", "tmpfile.c")
cmd.Run()

Zusammengefasst erfolgt der Angriff über ein Schadpaket, das durch die Anweisung import "C" den Aufruf von cgo auslöst, das wiederum für den C-Code einen als "gcc.exe" oder "clang.exe" getarnte Schaddatei im aktuellen Verzeichnis aufruft.

Die aktualisierten Releases der Programmiersprache 1.15.7 und 1.14.14 bringen gleich zwei Gegenmaßnahmen mit. Zum einen übergibt der go-Befehl nun grundsätzlichen den vollständigen Pfad des C-Compilers an cgo, womit sich die Compilersuche auf dem Pfad erübrigt. Zum zweiten ignoriert cgo die implizite oder über . explizite Angabe des lokalen Verzeichnisses.

Googles Programmiersprache für Server und Cloud

(Bild: Golang.org)

Google hat die Programmiersprache Go erstmals 2009 der Öffentlichkeit vorgestellt und sie als Alternative zu C positioniert. 2015 befreite sich das Projekt von den letzten C-Überbleibseln im Code und besitzt seitdem eine komplett in Go geschriebene Toolchain und Laufzeitumgebung. Die Programmiersprache unterstützt Nebenläufigkeit und entstand vor allem mit Blick auf verteilte Cloud- und Serveranwendungen. Zu den Vorzeigeprojekten gehören Kubernetes, Istio und Docker.

Im August 2020 ist mit Go 1.15 das jüngste Release der Programmiersprache erschienen.

Vorsichtshalber hat das Golang-Team ähnliche Fixes für Befehle wie goimports und gopls sowie einige Libraries vorgenommen. Bereits seit April 2020 existiert ein Vorschlag im GitHub-Repository, für LookPath unter Windows grundsätzlich nicht implizit das aktuelle Verzeichnis zu durchsuchen.

(rme)