- Eine seit Mitte 2023 laufende Kampagne zur Repository-Verwechslung (repo confusion) breitet sich erneut aus; auf GitHub wurden mehr als 100.000 Repositories mit ähnlichen bösartigen Payloads entdeckt
- Die Angreifer erstellen bösartige Kopien, die legitimen Repositories ähneln, um Entwickler zu Fehlgriffen zu verleiten, und kombinieren Klonen, Einfügen von Loadern, erneutes Hochladen, massenhaftes Forken und verdeckte Bewerbung
- Wird ein bösartiges Repository ausgeführt, werden nach 7 Stufen der Verschleierung Python-Code und Binärdateien nachgeladen; dabei werden sensible Daten wie Anmeldedaten, Browser-Passwörter und Cookies gestohlen
- Selbst wenn GitHub die meisten Forks automatisch löscht, bleiben nicht erkannte Repositories und manuell hochgeladene Kopien bestehen; selbst wenn nur 1 % überlebt, bleiben Tausende bösartige Repositories erhalten
- Der Angriffsablauf verlagert sich von bösartigen PyPI-Paketen zu GitHub-Repositories, wodurch auch die Software-Lieferkette außerhalb von Paketmanagern zu einer direkten Angriffsfläche wird
Funktionsweise des Repository-Verwechslungsangriffs
- Repository-Verwechslung ähnelt Dependency Confusion insofern, als Benutzer dazu verleitet werden, statt des legitimen ein bösartiges Repository herunterzuladen
- Der Unterschied liegt im Ausnutzungspunkt
- Dependency Confusion nutzt die Funktionsweise von Paketmanagern aus
- Repository-Verwechslung beruht darauf, dass Menschen versehentlich ein ähnlich aussehendes Repository falsch auswählen
- Diese Kampagne erhöht die Infektionswahrscheinlichkeit, indem sie bösartige Repositories massenhaft auf GitHub verbreitet
- Vorhandene Repositories wie
TwitterFollowBot,WhatsappBOT,discord-boost-tool,Twitch-Follow-Botwerden kopiert - In die Kopien wird ein Malware-Loader eingefügt
- Anschließend werden sie unter demselben Namen erneut auf GitHub hochgeladen
- Jedes Repository wird automatisiert tausendfach geforkt
- In Foren und auf Discord werden sie verdeckt beworben
- Vorhandene Repositories wie
Ablauf nach dem Ausführen eines bösartigen Repositories
- Wenn ein Benutzer ein bösartiges Repository verwendet, entschlüsselt der versteckte Payload eine 7-stufige Verschleierung
- Danach werden schädlicher Python-Code und binäre ausführbare Dateien nachgeladen
- Der Schadcode basiert überwiegend auf einer modifizierten Version von BlackCap-Grabber
- Gesammelt werden Anmeldeinformationen verschiedener Apps, Browser-Passwörter und Cookies sowie andere vertrauliche Daten
- Die exfiltrierten Daten werden an den C&C-Server (command-and-control) der Angreifer übertragen, worauf weitere bösartige Aktivitäten folgen
- Eine Analyse des zugehörigen Codes findet sich in der technical analysis von Trend Micro
Automatische Löschung durch GitHub und verbleibende Repositories
- GitHub erkennt die Automatisierung und entfernt den Großteil der geforkten Repositories schnell
- Allerdings übersieht die Automatisierungserkennung viele Repositories, und manuell hochgeladene Repositories überleben
- Da die Angriffskette in großem Maßstab automatisiert ist, entstehen selbst wenn nur 1 % übrig bleibt noch Tausende bösartige Repositories
- Wer auf GitHub nach
🔥 2024 language:pythonsucht, kann einige derzeit verbreitete Repositories sehen - Rechnet man auch gelöschte Repositories mit ein, erreicht das Gesamtvolumen Millionenhöhe
- Die Löschung erfolgt meist erst einige Stunden nach dem Upload, was die Dokumentation erschwert
- Viele Original-Repositories bleiben bestehen, und die Löschungen zielen hauptsächlich auf die Fork-Bombe
- Als Beispiel zeigt die Repository-Liste von Mattia69 in der Zusammenfassung Tausende Forks, die in den Fork-Details jedoch nicht erscheinen
- Einige Nutzer forken bösartige Repositories unwissentlich und erzeugen so zusätzlich einen sekundären Social-Engineering-Netzwerkeffekt
Zeitlicher Verlauf der Kampagne
- Mai 2023: Phylum meldet bösartige Pakete auf PyPI
- Diese Pakete enthalten frühe Teile des aktuellen Payloads
- Sie verbreiteten sich über in Forks populärer GitHub-Repositories wie
chatgpt-apiplatzierte Aufrufe wieos.system("pip install package")
- Juli–August 2023: Mehrere bösartige Repositories wurden auf GitHub hochgeladen und lieferten den Payload direkt aus, statt PyPI-Pakete nachzuladen
- Das war eine Veränderung, nachdem PyPI die bösartigen Pakete entfernt hatte und die Aufmerksamkeit der Security-Community gestiegen war
- Aliakbar Zahravi und Peter Girnus von Trend Micro veröffentlichten eine technische Analyse
- November 2023 bis heute: Mehr als 100.000 Repositories mit ähnlichen bösartigen Payloads wurden entdeckt, und die Zahl steigt weiter
- Warum diese Methode für Angreifer vorteilhaft ist, liegt auf der Hand
- GitHub ist so groß, dass selbst Masseninstanzen im Verhältnis klein wirken und schwer zu erkennen sind
- Anders als früher ist kein Paketmanager mehr beteiligt, sodass kein expliziter Name eines bösartigen Pakets als Indikator zurückbleibt
- Ziel-Repositories liegen oft in kleinen Nischen mit geringer Popularität, wodurch Entwickler eher versehentlich ein bösartiges Imitat klonen
Vom Paketmanager zum SCM
- Die Verlagerung von bösartigen PyPI-Paketen zu bösartigen GitHub-Repositories entspricht einem Muster, das über verschiedene Paketmanager und SCM-Plattformen hinweg beobachtet wurde
- Weil sich die Security-Community stärker auf Paketmanager konzentrierte, wurde der Angriffsweg gewissermaßen an andere Orte verlegt
- GitHub und ähnliche Plattformen erleichtern die automatische Erstellung von Konten und Repositories und bieten komfortable APIs sowie lockere Rate Limits, die sich leicht umgehen lassen
- Da man sich zwischen unzähligen Repositories verstecken kann, ist SCM ein gutes Ziel für die verdeckte Infektion der Software-Lieferkette
- Kampagnen mit Dependency Confusion, Schadcode in Paketregistern und die Verbreitung über SCM zeigen, dass die Sicherheit der Software-Lieferkette trotz vieler Tools und Schutzmechanismen verwundbar bleibt
Indikatoren zur Überprüfung einer Infektion
- Im Python-Code sollte nach folgenden Mustern gesucht und jeder Treffer untersucht werden
exec(Fernetexec(requestsexec(__importexec(bytesexec("""\nimportexec(compile__import__("builtins").exec(
- Es sollte geprüft werden, ob lokal Repositories zu Social-Platform-Automatisierung, Bots oder Spielen vorhanden sind, und diese sollten entfernt werden
- Falls sie unbedingt benötigt werden, sollten sie neu installiert werden, wobei die Herkunft sorgfältig zu prüfen oder die Ausführung in einer Sandbox vorzunehmen ist
- Wenn die Möglichkeit besteht, dass ein Repository dieses Typs geklont wurde, sollte man davon ausgehen, dass folgende Cookies, Zugangsdaten und Schlüssel kompromittiert wurden, und entsprechend reagieren
- Browser: Finanzdienste, E-Mail-Dienste, Krypto-Dienste, Amazon, eBay, AliExpress, Facebook, Instagram, Twitter, Youtube, Discord, TikTok, Telegram, Twitch, Steam, Yahoo, ExpressVPN, Spotify, Streaming-Dienste
- Apps: Exodus, Atomic Wallet, Guarda, Coinomi, Ethereum
- Eine vollständige Liste der Datei-Checksummen ist praktisch schwer handhabbar, einige gemeinsame Elemente lassen sich aber im VirusTotal graph einsehen
- Cloudflare deaktivierte nach der Benachrichtigung die DNS-Einträge der entdeckten bösartigen Adressen
Abwehr und Reaktion
- GitHub wurde benachrichtigt und hat die meisten bösartigen Repositories gelöscht, doch die Kampagne geht weiter
- Angriffe, die Schadcode in die Lieferkette einschleusen wollen, verbreiten sich zunehmend
- Es gibt viele Lösungen, die Malware auf System- und Netzwerkebene erkennen, aber die Lieferkette bleibt für Angreifer weiterhin eine große und profitable Angriffsfläche
- Wird ein bösartiges Repository entdeckt, kann es unabhängig davon, ob es Teil dieser Kampagne ist, über GitHubs abuse or spam report gemeldet werden
- Apiiro hat ein System zur Malware-Erkennung aufgebaut, das verbundene Codebasen überwacht
- LLM-basierte Codeanalyse
- Zerlegung von Code in vollständige Ausführungsflussgraphen
- Heuristische Engine
- Dynamisches Decoding, Entschlüsselung und Entschleierung
- Ohne die Überwachung eingeschleuster bösartiger Payloads hängt die Sicherheit einer Organisation davon ab, dass Entwickler nicht versehentlich nahezu identische falsche Repositories auswählen, dass es keinerlei Fehler in CI/CD-Konfigurationen gibt und dass Drittanbieter-Code zu 100 % sicher ist
- Über die allgemeine Erkennung und Sammlung von Schwachstellen hinaus ist ein Ansatz nötig, der die nächste Generation von Risiken in der Software-Lieferkette und bei Anwendungen sichtbar macht
1 Kommentare
Meinungen auf Hacker News
Über die allgemeine Warnung hinaus, bei Code aus öffentlichen Repositories oder externen Quellen vorsichtig zu sein und den Dependency Tree zu prüfen, frage ich mich, welche Auswirkungen es auf LLMs und Automatisierungstools hat, wenn öffentliche Repositories massenhaft Schadcode enthalten und diese Modelle darauf trainiert wurden.
Es scheint durchaus möglich, dass bei Tools wie Copilot in längeren Code-Antworten zufällig schädliche Teile mit hineingeraten.
Einfache Injection-Schwachstellen sieht man ja schon häufig.
Vielleicht noch nicht jetzt, aber in ein paar Jahren wirkt das durchaus möglich.
KI gibt keinerlei Garantie für Korrektheit.
Es wurde gezeigt, dass ein Angreifer einen Service-Bot übernehmen kann, der mit dem Hugging-Face-Safetensors-Konvertierungs-Space verbunden ist; das ist ein beliebter Dienst im Ökosystem, der unsichere Machine-Learning-Modelle in sicherere Versionen konvertiert.
Wer LLMs nutzt, muss mehr Aufwand in Code Reviews investieren, und ich halte diesen Kompromiss für lohnend.
Allerdings gibt es meist zwei Hürden, bevor daraus ein tatsächlicher Vorfall wird: Der Generator erhält interne Anweisungen, solchen Code zu vermeiden, und aufgrund der Eigenschaften von LLMs ist es unwahrscheinlich, dass sie die Adresse eines realen Angreifers exakt wiederholen.
Trotzdem bleiben verschiedene Angriffsvektoren wie Bind Shells, Denial of Service oder Exfiltration vor Ort bestehen.
GitHub scheitert auf ähnliche Weise, wie Usenet gescheitert ist.
Jeder kann ein Repository erstellen, und es gibt nichts, das offizielle Repositories von Spam-Repositories unterscheidet.
So wie Amazon das Ziel hatte, „der Laden für alles“ zu sein, dann aber von „90 % von allem ist Müll“ getroffen wurde und zu einem Laden wurde, der größtenteils aus Müll besteht, muss GitHub entscheiden, ob sein Produkt „Repositories für alle“ oder „vertrauenswürdiger Code“ ist.
Beim offiziellen PG JDBC zum Beispiel sehe ich nichts, was ein Spammer nicht nachbilden könnte. Wie kann man also darauf vertrauen, dass dies kein infiziertes Repository ist: https://github.com/pgjdbc
Sonatype verlangt einen Nachweis des Besitzes der Reverse-Domain, die in der
groupIdverwendet wird; in diesem Fall ist dasorg.postgresql.Die Anleitung steht hier: https://central.sonatype.org/faq/how-to-set-txt-record/
Wenn man noch mehr Sicherheit will, kann man auch die GPG-Signaturen prüfen, da alle in Maven Central veröffentlichten Artefakte signiert sind; der Nachteil ist allerdings, dass man den von Postgres für die Signatur verwendeten Schlüssel über einen von Sonatype unabhängigen Weg beziehen muss.
Im Fall von PG habe ich den Schlüssel bei einer schnellen Suche nicht gefunden.
GitHub hat etwa 500 Millionen Repositories, daher ist diese Größenordnung tatsächlich ziemlich gut.
Ein Entwickler, der ein infiziertes Repository verwenden würde, findet auch ohne solche Repositories auf GitHub genügend andere Wege, ein unsicheres Produkt zu bauen.
Die als Beispiel genannte Organisation scheint das einfach nicht getan zu haben.
Supply-Chain-Probleme sind wirklich ein Albtraum
Wir zielen zwar nicht direkt auf npm-Releases ab, erstellen aber npm-Releases, um mit socket.dev ein leichtgewichtiges Virtualisierungs-Webbrowser-Projekt namens BrowserBox zu überwachen
Auch dieses Projekt nutzt inklusive aller transitiven Abhängigkeiten etwa 800 Pakete und nur 19 direkte Abhängigkeiten; bezogen auf den gesamten Stack ist es damit vergleichsweise leichtgewichtig
Ich überlege nun, alle 800 Abhängigkeiten im npm-Namespace
@browserboxals Snapshots abzulegen und gefundene Schwachstellen nachzuverfolgen und zu patchenDas klingt verrückt, aber so ist die Lage nun einmal; zumindest könnte man damit die Supply-Chain-Schwachstellen auf der Node/JS-Seite direkt auf dem Sicherheitsniveau des Unternehmens garantieren
https://socket.dev
https://github.com/BrowserBox/BrowserBox
Da die Lock-Datei den sha256 des gesamten Trees festhält, muss man nicht spiegeln, nur um Änderungen zu verhindern, selbst wenn das Repository gehackt wird
Auf Versionen zu pinnen, die ein paar Monate hinter der neuesten liegen, scheint ein guter Kompromiss zu sein: neue CVEs vermeiden, ohne auf so alten Versionen festzusitzen, dass man später alles auf einmal groß reparieren muss
Die Download-Zahlen wirken als Maßstab ganz brauchbar, wenn man sie mit direkten Abhängigkeiten für ähnliche Zwecke vergleicht, aber das ist eine subjektive Einschätzung
Austral vergibt mit linearen Typen feingranulare Berechtigungen an Abhängigkeiten
Etwa: Eine Grafikbibliothek braucht keinen Datei-I/O, und eine Bibliothek für Netzwerkübertragung braucht keinen Zugriff aufs Mikrofon
Das ist nur eine Abmilderung, aber ich würde so etwas gern auch in anderen Sprachen sehen
Als ich vor rund 10 Jahren von .NET zu Java wechselte, war ich überrascht, wie viel mehr Zeit in Dependency Hell floss; heute ist der Aufwand für Sicherheitsupdates und Dependency-Probleme sowohl in Java- als auch in Python-Projekten erschreckend hoch
Dass dieses Problem bei .NET weniger ausgeprägt war, lag wohl daran, dass automatisches Paketmanagement dort relativ spät eingeführt wurde und auch NuGet noch recht jung war; damals hatten viele Projekte es noch nicht übernommen, und es gab eine starke Kultur, riesige transitive Dependency-Trees zu vermeiden
Die jüngsten Probleme bei Boeing wirken ähnlich
In den vergangenen Jahrzehnten wurde immer mehr Produktion an externe Zulieferer ausgelagert und auf Kostenoptimierung fokussiert, wodurch Supply-Chain-Management immer schwieriger wurde; im großen Bild ähnelt das der Supply-Chain-Kultur moderner Softwareentwicklung
Als ich bei einem Finanzunternehmen arbeitete, das Paketmanager aus Gründen der Supply-Chain-Sicherheit verboten hatte, war Dependency-Management am wenigsten lästig und es gab auch die wenigsten Qualitätsprobleme
Code, der sich nie ändert, solange man ihn nicht ausdrücklich ändert, hat Vorteile
Vieles, wofür andere Pakete herangezogen hätten, haben wir selbst implementiert; weil wir nur das Nötige taten und höhere Code-Standards anlegten, war es leichter zu verstehen, zu debuggen und zu ändern
Die anfänglichen Kosten beim Schreiben fallen einmalig an und amortisieren sich gut, aber die wiederkehrenden Kosten für Code, der für alle alles tun will, werden langfristig größer und häufen sich meist an
Rich Hickeys „Simple Made Easy“ zeigt dieses Phänomen gut: Einfach und leicht sind nicht dasselbe, und die einfache Option wirkt anfangs zwar schwerer, wird aber langfristig leichter, wenn sich die Zweitrundeneffekte aufsummieren
Mir war so etwas schon aufgefallen, als ich zufällig auf ähnliche Repositories stieß
Ich führe ohnehin nicht einfach Code aus beliebigen Repositories aus, aber inzwischen starte ich selbst dann eine Sandbox-VM, wenn ich dem Repository und dem Besitzer vertraue
Als Entwickler sollte man heute Arbeit, Hobby und Privates wohl mindestens sauber in drei Umgebungen trennen
Es gibt Projekte, die zwar nicht bösartig sind, aber vom Design her schlampig oder töricht geschrieben wurden
Ein Programm, das ich vor Kurzem ausgeführt habe, fügte meiner
~/.bashrcdrei Zeilen hinzu, noch bevor ich überhaupt irgendetwas angefordert hatte; ich bemerkte es erst ein paar Tage späterIch kann nicht verstehen, welcher Entwickler das für eine gute Idee hält, und deshalb nutze ich inzwischen jedes Mal eine Sandbox, wenn ich fremden Code ausführe
Das ist mein Alltags-OS
Gibt es wirklich Arbeitgeber, die so etwas erlauben?
Ich bin neugierig, welche Tools ihr bei der Arbeit nutzt, um solche Probleme zu vermeiden, und ob ihr mit eurer aktuellen Konfiguration zufrieden seid.
Wir entwickeln mit einem ziemlich kleinen Team ein SDK mit vielen wöchentlichen Downloads und haben Lösungen auf Basis von snyk, aikido.dev, renovate usw. evaluiert, aber es ist nicht klar, ob sie bei solchen Problemen helfen.
Da wir noch ein kleines Team sind, ist es auch belastend, Tools mit vielen False Positives wie snyk zu betreuen.
Sonatype analysiert alle Pakete, versieht sie mit diversen Metadaten und definiert Richtlinien, die in der Firewall genutzt werden können, um den Rest herauszufiltern.
Das funktioniert nur für öffentliche Abhängigkeiten, aber nach einigen Jahren Nutzung funktioniert es ziemlich gut.
Bisher hatten wir keine Malware-Probleme; Pakete mit bekannten Schwachstellen kommen nicht in die Codebasis, und wenn in etwas, das wir nutzen, eine Schwachstelle gefunden wird, werden wir benachrichtigt.
Es teilt gefundene Supply-Chain-Schwachstellen in erreichbar, nicht erreichbar und unklar ein, was die Triage viel einfacher gemacht und die Zeit zur Bewertung neuer Schwachstellen deutlich reduziert hat.
Die genannten Anbieter erkennen keinen bösartigen Code, sondern nur Schwachstellen.
Selbst wenn die Schwachstellenerkennung gut ist, schützt sie euch weiterhin nicht vor in die Codebasis eingeschleustem bösartigem Code.
Es führt statische, dynamische und Metadaten-Analysen durch und prüft mehr als 40 Eigenschaften wie Shell-Ausführung, Nutzung von SSH-Schlüsseln, Netzwerkkommunikation und die Verwendung von decode+eval, um riskante Pakete zu markieren.
https://github.com/ossillate-inc/packj
Bisher hat es ziemlich gut funktioniert.
https://trivy.dev/
Ich frage mich, ob die Praxis, Shell-Installationsskripte per
curlherunterzuladen und mitsudoauszuführen, bald ein Ende findet.Ein Ansatz wie „Um unsere Software zu installieren, führen Sie
curl [https://somesite/install.sh](<https://somesite/install.sh>)' | sudo shaus“ scheint sehr gut zu dem im Artikel erwähnten infizierten Code zu passen.Unser System listet jede Woche etwa 100 der erwähnten Muster auf, und davon sind rund 3 % bösartig.
Ich würde gerne sehen, dass diese Praxis endet.
npm idieselben Berechtigungen.Unter den heute gängigen Tools zum Herunterladen von Abhängigkeiten kenne ich nur
go get, bei dem zur Installations- oder Build-Zeit kein feindlicher Code ausgeführt wird.Wir brauchen zumindest bessere Tools, um in einer Sandbox zu arbeiten, damit die Explosion eingegrenzt bleibt.
Der Ansatz von ChromeOS, bei dem „eine virtuelle Maschine Wayland-Fenster auf dem Haupt-Desktop öffnen kann“, ist elegant, aber als ich mir den Code zuletzt angesehen habe, war er nicht besonders sauber oder wiederverwendbar.
Diese Domain ist für genau diesen Zweck reserviert: https://www.rfc-editor.org/rfc/rfc2606.html#section-3
.deb/.rpm/einen Installer herunter“ oder, im schlimmsten Fall, „vertrauen Sie etwas, das nicht vom Herausgeber, sondern von Dritten paketiert wurde“.In npm kann man die Ausführung von Malware mit
--ignore-scriptsabmildern.https://blog.uirig.com/getting-rid-of-npm-scripts
Mit Glück verhält er sich in CI auffällig und wird entdeckt.
Die eigentliche Lösung wäre ein Reputationssystem wie https://github.com/crev-dev/cargo-crev, aber leider wird so etwas kaum genutzt.
Auch der Kommentar, dass man ein Makefile braucht, ist beachtenswert.
Solche Berichte tauchen immer wieder auf, und in den letzten Monaten verbessere ich die Sicherheit meiner Entwicklungsumgebung Schritt für Schritt.
Ich nutze VSCode dev containers für die Entwicklung: https://code.visualstudio.com/docs/devcontainers/create-dev-...
Einmal eingerichtet, sind sie auch ohne viel Docker-Wissen leicht zu verwenden und gut geeignet, um Web-/Konsolen-Apps zu starten; Dinge wie Flutter oder Electron waren aber schwierig.
An GitHub Codespaces habe ich mich bei kleinen Projekten ebenfalls gewöhnt: https://github.com/codespaces
Früher hatte ich in einem Vorstellungsgespräch einmal Live-Coding, bei dem ein einfaches Node-Projekt geändert werden sollte; heute würde ich in so einer Situation sicher Container oder Codespaces nutzen: https://www.welivesecurity.com/en/eset-research/lazarus-luri...
Best Practices für npm, Node und Docker setze ich um, indem ich regelmäßig die OWASP-Leitlinien lese und bei Docker nach Möglichkeit kleine Images sowie explizite Image-Tags verwende: https://cheatsheetseries.owasp.org/cheatsheets/NodeJS_Docker...
Bei npm-/Python-Paketen prüfe ich vor der Installation mit socket.dev den Zugriff auf Umgebungsvariablen, Netzwerkaufrufe, Supply-Chain-Angriffe und jüngste Änderungen an der Code-Eigentümerschaft; außerdem kann man, wie von OWASP empfohlen, postinstall-Skripte global deaktivieren: https://cheatsheetseries.owasp.org/cheatsheets/NPM_Security_...
Vor weniger als einem Jahr gab es einen Fall mit einem Repository, das einen Trojaner enthielt: https://github.com/orgs/community/discussions/63603
Es hat im Grunde genau das getan, was das Repository behauptet hat.
Schon eine einfache Kennzeichnung als offizielles Repository könnte eine gewisse Aufmerksamkeit erzeugen.
Was soll da schon passieren /s
Trotzdem stimme ich zu, dass GitHub besser sichtbar machen sollte, welches Repository das offizielle Repository eines Projekts ist.