GhostAction fügt 94 repositories einen persistenten stealer hinzu
GhostAction hat seine supply chain attack von bösartigen GitHub Actions workflows auf Phishing und einen credential stealer ausgeweitet, der in einer als web font präsentierten Datei versteckt war. OpenSourceMalware identifizierte die Komponente der zweiten Stufe in 94 kompromittierten repositories und erklärte, dass sie auf dem Computer eines Entwicklers aktiv bleiben kann, nachdem der ursprüngliche workflow entfernt wurde. Eine supply chain attack kompromittiert software oder deren Entwicklungsprozess, damit bösartiger Code Maintainer, Projekte und nachgelagerte Nutzer erreichen kann.
Die Kampagne stützte sich zunächst auf GitHub Actions workflows, also repository-Dateien, die GitHub mitteilen, wann und wie automatisierte jobs ausgeführt werden sollen. OpenSourceMalware zufolge registrierte der Betreiber anschließend am 9. Oktober 2026 my-github[.]com und leitete die Domain an 193.32.204[.]199 weiter. Diese Adresse wurde bereits verwendet, um Informationen zu empfangen, die der bösartige workflow gesammelt hatte. Die Registrierung erfolgte 17 Tage nach der Registrierung von my-gitlab[.]com, doch die Ermittler konnten nicht feststellen, dass derselbe Betreiber beide Domains kontrolliert. Die Infrastrukturen unterscheiden sich hinsichtlich ihrer Registrare, Registrierungsdaten, Cloudflare-nameserver-Paare, Internetanbieter, IP-Adressen und DNS-Designs. Zudem fanden die Forscher keine Hinweise auf gemeinsam genutzte certificates oder accounts.
Am Tag der Registrierung von my-github[.]com wurde die Domain verwendet, um eine Phishing-Nachricht an einen Open-Source-Maintainer zu senden. Phishing ist eine betrügerische Nachricht, die jemanden dazu bringen soll, den Zugriff auf einen account oder andere sensible Informationen preiszugeben. Die von noreply@my-github[.]com gesendete E-Mail gab sich als GitHub-Sicherheitsbenachrichtigung aus und behauptete, in Moskau, Russland, habe eine verdächtige Anmeldung stattgefunden. Sie verwies den Empfänger auf einen Link, der als Möglichkeit zum Absichern des accounts dargestellt wurde.
OpenSourceMalware zufolge fungierte die verlinkte Seite als reverse proxy, also als Vermittler, der Datenverkehr zwischen einem Nutzer und einem echten Dienst weiterleitet und dabei die session abfängt. Sie erfasste das Passwort und den two-factor authentication (2FA)-Code des Opfers und nutzte anschließend eingeschleustes JavaScript, um eine OAuth-Anwendung zu autorisieren. OAuth ist eine Methode, mit der einer Anwendung Zugriff auf einen account gewährt wird, ohne ihr direkt das Passwort zu geben. Die angeforderten scopes repo, workflow und read:org, die den verlangten Zugriff festlegen, ermöglichten das Lesen und Schreiben in repositories, das Ändern von Actions-workflow-Dateien sowie den Einblick in Organisationsmitgliedschaften und zugehörige Daten.
Die Seite automatisierte außerdem GitHubs OAuth device flow. Ihr script beschaffte einen device code und einen user code, lud die device-login-Seite, extrahierte die relevanten Formulare, fügte den user code ein und übermittelte die Autorisierung über die authentifizierte, durch den reverse proxy geleitete session des Opfers. Das Opfer musste weder den device code eingeben noch die Anwendung bewusst genehmigen. Der daraus resultierende access token, ein wiederverwendbarer digitaler Zugangsnachweis, wurde über TCP-Port 8443 an my-github[.]com gesendet. Mit Zugriff auf repository-Ebene konnte der Betreiber Projekte über GitHubs application programming interface (API) auflisten und bösartige Dateien unter .github/workflows/ ablegen.
Die zweite Stufe war darauf ausgelegt, die Ausführung von GitHubs Systemen auf die Computer von Entwicklern zu verlagern. Sie fügte den betroffenen repositories drei Dateien hinzu. Die erste war eine Microsoft Visual Studio Code-Konfiguration namens tasks.json mit einem runOn: folderOpen-trigger, durch den beim Öffnen des Projektordners in VS Code ein task gestartet wurde. Die zweite Datei war public/fonts/fa-solid-400.woff2, die wie ein font aussah, aber den credential stealer enthielt. Der Dateiname entsprach einem Namen, der im Januar 2026 in der Kampagne Fake Font/PolinRider verwendet worden war. Bei der dritten Datei handelte es sich um einen weiteren GitHub Actions workflow, der ausgeführt werden sollte, falls der lokale stealer nicht startete.
Laut OpenSourceMalware suchte der getarnte payload nach AWS keys, PyPI- und npm-tokens, Git-logins, Kubernetes-cluster-credentials, SSH private keys sowie credentials für Anthropic Claude und Google Gemini. Diese secrets können Zugriff auf Cloud-Ressourcen, Konten zur Veröffentlichung von software, Quellcode-repositories, cluster, entfernte Systeme und KI-Dienste ermöglichen. Der VS Code-task installierte außerdem einen cron job, also einen auf Unix-ähnlichen Systemen zeitgesteuert ausgeführten Befehl, der alle fünf Minuten vom Angreifer bereitgestellten Code startete. Gestohlene Informationen wurden über unverschlüsseltes HTTP auf Port 8080 an denselben Server übertragen.
Der als Fallback dienende continuous integration (CI) workflow, also ein automatisierter repository-job, basierte auf dem ursprünglichen bösartigen workflow, suchte jedoch nach zusätzlichen credential-Formaten. Wenn der direkte upload fehlschlug, versuchte er, die Ergebnisse in einem geheimen GitHub gist abzulegen. OpenSourceMalware beobachtete den workflow unter acht Dateinamen: lint.yml, ci-check.yml, build-check.yml, repo-health.yml, audit.yml, code-review.yml, test-suite.yml und cache-cleanup.yml.
Die 94 betroffenen repositories gehörten 66 Eigentümern. Fünfzehn waren anschließend gelöscht, umbenannt oder auf privat gestellt worden. Von den 79 weiterhin zugänglichen repositories wirkten viele inaktiv. Eines war seit mehr als neun Jahren nicht geändert worden, während 65 seit über einem Jahr keinen commit erhalten hatten. Verlassene repositories bleiben dennoch relevant, weil Entwickler oder automatisierte Systeme möglicherweise alte Kopien behalten und über einen workflow oder einen lokalen clone offengelegte credentials verwendbar bleiben können, bis sie widerrufen werden.
OpenSourceMalware zufolge begann GitHub am 9. Oktober damit, die Ausführung des workflow der ersten Stufe zu verhindern. Angriffswellen am 10. und 12. Oktober extrahierten daher keine secrets. Die zweite Stufe erschien sechs Tage nach der Blockierung und benötigte keinen GitHub-hosted runner, da sie starten konnte, wenn ein Entwickler den Ordner lokal öffnete. Die Forscher konnten nicht feststellen, ob GitHubs Eingreifen diese Änderung verursachte. Sie konnten lediglich bestätigen, dass der Betreiber die Ausführung in eine Umgebung außerhalb dieser workflow-Kontrollen verlagerte.
Potenziell betroffene Entwickler sollten ein sauberes Gerät verwenden, um GitHub-Zugriffe und tokens zu widerrufen, Passwörter zu ändern, repositories auf die hinzugefügten Dateien zu prüfen, sämtliche für die workflows verfügbaren credentials zu ersetzen und alle Personen zu warnen, die die Projekte geklont haben. OpenSourceMalware zufolge ist der Betreiber weiterhin nicht identifiziert und schien nur begrenzte Erfahrung zu besitzen: Der Filter für environment variables übersah die meisten API keys, der Scan des home directory konnte wegen einer Zeitüberschreitung abbrechen und seine eigenen Ergebnisse verlieren, und eine einzelne IP-Adresse wurde für Exfiltration, Phishing und auffällige Internet-scans verwendet. Diese Überschneidung der Infrastruktur machte Infektionen weiterhin durch Suchen nach der Adresse sichtbar.
Für Organisationen, die den Zugriff von Entwicklern und die Gefährdung ihrer repositories neu bewerten, bietet AEU-I sicherheitsorientierte IT, Infrastruktur und Beratung. Der Vorfall zeigt, warum es möglicherweise nicht ausreicht, lediglich einen bösartigen workflow zu entfernen, wenn ein repository zugleich Code ausgeliefert hat, der auf Entwicklercomputern dauerhaft aktiv bleiben und credentials aus mehreren verbundenen Diensten kopieren kann.