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.
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.
Auf den falschen Pfad gelockt
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.
Der Teufel steckt im Detail
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()
Doppelt flickt besser
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.
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)