Vorfallsbericht: CVE-2024-YIKES
(nesbitt.io)- CVE-2024-YIKES ist ein Vorfall, bei dem die Kompromittierung einer JavaScript-Abhängigkeit auf die Rust- und Python-Lieferkette übergriff
- Durch
left-justify-Phishing wurden.npmrc,.pypircsowie Cargo- und Gem-Zugangsdaten exfiltriert - Das bösartige
build.rsvonvulpine-lz4lud auf CI-Hosts ein Shell-Skript herunter und führte es aus - Die Malware in
snekpack3.7.0 verbreitete sich auf etwa 4,2 Millionen Geräte und fügte SSH-Schlüssel sowie Reverse Shells hinzu - Der Wurm cryptobro-9000 aktualisierte versehentlich auf
snekpack3.7.1 und entfernte damit die Malware
Überblick über den Vorfall
- CVE-2024-YIKES ist ein Sicherheitsvorfall, bei dem eine kompromittierte Abhängigkeit im JavaScript-Ökosystem zum Diebstahl von Zugangsdaten führte und sich anschließend zu einem Supply-Chain-Angriff auf eine Rust-Kompressionsbibliothek sowie zur Verteilung von Malware über ein Python-Build-Tool ausweitete
- Der Vorfall wurde um 03:47 UTC gemeldet, der Status wurde auf „versehentlich gelöst“ gesetzt und die Schwere änderte sich von „Critical → Catastrophic → Somehow Fine“
- Die Dauer betrug 73 Stunden, und betroffene Systeme blieben mit „Yes“ markiert
- Die Kette kompromittierter Pakete und Toolchains verlief über
left-justify,vulpine-lz4undsnekpack, wobei an rund 4 Millionen Entwickler Malware ausgeliefert wurde - Letztlich führte ein separater Krypto-Mining-Wurm namens
cryptobro-9000auf infizierten Maschinen Updates aus, hobsnekpackauf eine saubere Version an und entfernte dadurch versehentlich die Malware
Verlauf des Vorfalls
-
Tag 1: Diebstahl von Zugangsdaten über ein JavaScript-Paket
- Um 03:14 UTC postete der
left-justify-Maintainer Marcus Chen auf Twitter, dass seine Fahrkarte, ein altes Notebook und „etwas, das aussieht, als hätte Kubernetes es ausgewürgt“ gestohlen worden seien, was aber zunächst nicht unmittelbar mit einem Paketsicherheitsproblem in Verbindung gebracht wurde - Um 09:22 UTC stellte Chen beim Versuch fest, sich in die nmp-Registry einzuloggen, dass sein Hardware-2FA-Schlüssel fehlte, und die AI Overview an oberster Stelle der Google-Suchergebnisse führte auf die Phishing-Seite
yubikey-official-store.net, die erst 6 Stunden zuvor registriert worden war - Um 09:31 UTC gab Chen seine nmp-Zugangsdaten auf der Phishing-Seite ein, die sich für den Kauf bedankte und eine Lieferung innerhalb von 3 bis 5 Werktagen versprach
- Um 11:00 UTC wurde
[email protected]mit dem Changelog „performance improvements“ veröffentlicht - Das Paket enthielt ein Post-Install-Skript, das
.npmrc,.pypirc,~/.cargo/credentialsund~/.gem/credentialsan einen vom Angreifer ausgewählten Server exfiltrierte - Um 13:15 UTC wurde für
left-justifyein Support-Ticket mit dem Titel „why is your SDK exfiltrating my .npmrc“ eröffnet, aber als „low priority - user environment issue“ markiert und nach 14 Tagen Inaktivität automatisch geschlossen
- Um 03:14 UTC postete der
-
Tag 1: Ausweitung des Supply-Chain-Angriffs auf eine Rust-Bibliothek
- Unter den exfiltrierten Zugangsdaten befanden sich auch die eines Maintainers der Rust-Bibliothek
vulpine-lz4 vulpine-lz4ist eine Bibliothek für „blazingly fast Firefox-themed LZ4 decompression“, hat 12 GitHub-Stars, ist aber selbst eine transitive Abhängigkeit voncargo- Um 22:00 UTC wurde
vulpine-lz40.4.1 veröffentlicht, mit der Commit-Nachricht „fix: resolve edge case in streaming decompression“ - Die tatsächliche Änderung bestand darin, ein
build.rs-Skript hinzuzufügen, das ein Shell-Skript herunterlädt und ausführt, wenn der Hostname „build“, „ci“, „action“, „jenkins“, „travis“ oder „karen“ enthält
- Unter den exfiltrierten Zugangsdaten befanden sich auch die eines Maintainers der Rust-Bibliothek
-
Tag 2: Erkennung und Reaktion scheitern
- Um 08:15 UTC entdeckte die Sicherheitsforscherin Karen Oyelaran den bösartigen Commit, nachdem die Payload auf ihrem privaten Notebook ausgelöst worden war
- Karen Oyelaran eröffnete ein Issue mit dem Text „your build script downloads and runs a shell script from the internet?“, erhielt jedoch keine Antwort
- Der legitime Maintainer hatte 2,3 Millionen € bei EuroMillions gewonnen und war gerade in Portugal damit beschäftigt, Ziegenfarmen zu besichtigen
- Um 10:00 UTC erfuhr der VP of Engineering eines Fortune-500-Kunden von
snekpackdurch einen LinkedIn-Post mit dem Titel „Is YOUR Company Affected by left-justify?“ von dem Vorfall und wollte wissen, warum man ihn nicht früher einbezogen hatte, obwohl er tatsächlich schon früher einbezogen worden war - Um 10:47 UTC wechselte der Slack-Kanal
#incident-responsevorübergehend in einen Thread mit 45 Nachrichten darüber, ob „compromised“ im amerikanischen Englisch mit einem „z“ geschrieben werden sollte
-
Tag 2: Infektion des Python-Build-Tools
snekpack- Um 12:33 UTC zielte das Shell-Skript mit seiner Auswahl auf die CI-Pipeline von
snekpack snekpackist ein Python-Build-Tool, das von 60 % der PyPI-Pakete verwendet wird, deren Name „data“ enthältsnekpackhattevulpine-lz4vendort, weil „Rust is memory safe“- Um 18:00 UTC wurde
snekpack3.7.0 veröffentlicht, woraufhin sich die Malware auf Entwicklerrechnern weltweit zu installieren begann - Die Malware fügte einen SSH-Schlüssel zu
~/.ssh/authorized_keyshinzu, installierte eine Reverse Shell, die nur dienstags aktiv wurde, und änderte die Standard-Shell des Benutzers auffish - Das Ändern der Standard-Shell auf
fishwurde als Bug angesehen - Um 19:45 UTC veröffentlichte ein weiterer Sicherheitsforscher einen 14.000 Wörter langen Blogpost mit dem Titel „I found a supply chain attack and reported it to all the wrong people“, in dem die Formulierung „in this economy?“ siebenmal vorkam
- Um 12:33 UTC zielte das Shell-Skript mit seiner Auswahl auf die CI-Pipeline von
-
Tag 3: Zufälliger Patch und Ende des Vorfalls
- Um 01:17 UTC entdeckte ein Junior-Entwickler in Auckland die Malware beim Debuggen eines separaten Problems und eröffnete einen PR, um die vendorte Version von
vulpine-lz4insnekpackzurückzusetzen - Dieser PR benötigte zwei Freigaben, aber beide Reviewer schliefen
- Um 02:00 UTC erhielt der
left-justify-Maintainer seine YubiKey-Lieferung vonyubikey-official-store.net; es handelte sich um einen 4-Dollar-USB-Stick mit einer README, in der „lol“ stand - Um 06:12 UTC begann sich ein separater Krypto-Mining-Wurm namens
cryptobro-9000über eine Schwachstelle injsonify-extremezu verbreiten jsonify-extremewird als Paket beschrieben, das „makes JSON even more JSON, now with nested comment support“- Die Payload von
cryptobro-9000war an sich nicht bemerkenswert, aber seine Ausbreitungslogik umfasste das Ausführen vonnpm updateundpip install --upgradeauf infizierten Maschinen, um die Angriffsfläche für künftige Attacken zu vergrößern - Um 06:14 UTC aktualisierte
cryptobro-9000snekpackversehentlich auf 3.7.1 snekpack3.7.1 war ein legitimes Release, das von einem verwirrten Co-Maintainer veröffentlicht wurde und das vendortevulpine-lz4auf eine frühere Version zurücksetzte- Um 06:15 UTC wurde die dienstägliche Reverse Shell aktiv, aber ihr Command-and-Control-Server war durch
cryptobro-9000kompromittiert worden und konnte nicht antworten - Um 09:00 UTC veröffentlichten die
snekpack-Maintainer eine vier Sätze lange Sicherheitswarnung mit den Formulierungen „out of an abundance of caution“ und „no evidence of active exploitation“ - „no evidence of active exploitation“ galt technisch als wahr, weil man nicht nach Belegen gesucht hatte
- Um 11:30 UTC twitterte ein Entwickler „I updated all my dependencies and now my terminal is in fish???“ und erhielt 47.000 Likes
- Um 14:00 UTC wurden die kompromittierten Zugangsdaten von
vulpine-lz4ausgetauscht - Der legitime Maintainer erhielt auf seiner neuen Ziegenfarm eine E-Mail und antwortete: „I haven't touched that repository in two years“ und „I thought Cargo 2FA was optional“
- Um 15:22 UTC wurde der Vorfall für beendet erklärt; der Termin für die Retrospektive wurde angesetzt und dann dreimal verschoben
- Um 01:17 UTC entdeckte ein Junior-Entwickler in Auckland die Malware beim Debuggen eines separaten Problems und eröffnete einen PR, um die vendorte Version von
CVE-Zuweisung und Schadensausmaß
- In Woche 6 wurde CVE-2024-YIKES offiziell zugewiesen
- Das Advisory blieb unter Embargo, während MITRE und GitHub Security Advisories über die CWE-Klassifizierung stritten
- Bevor die CVE veröffentlicht wurde, hatten bereits drei Medium-Artikel und ein DEF-CON-Vortrag den Vorfall ausführlich behandelt
- Das Gesamtausmaß des Schadens blieb unbekannt
- Die Zahl kompromittierter Maschinen wurde auf 4,2 Millionen geschätzt
- Die Zahl der Maschinen, die durch den Krypto-Wurm gerettet wurden, wurde ebenfalls auf 4,2 Millionen geschätzt
- Die Nettoveränderung der Sicherheitslage blieb bei „Unannehmlichkeit“
Grundursache und beitragende Faktoren
-
Grundursache
- Als Grundursache wurde festgehalten, dass der Hund namens Kubernetes den YubiKey gefressen hatte
-
Beitragende Faktoren
- Die nmp-Registry erlaubt für Pakete mit weniger als 10 Millionen Downloads pro Woche weiterhin Authentifizierung nur per Passwort
- Google AI Overviews verlinkte mit großer Zuversicht auf eine URL, auf die es niemals hätte verlinken dürfen
- Die Philosophie „kleine Crates“ des Rust-Ökosystems wurde im npm-Ökosystem kopiert, sodass Pakete wie
is-even-number-rsmit 3 GitHub-Stars als vierfach transitive Abhängigkeit in kritischer Infrastruktur landen können - Python-Build-Tools vendoren Rust-Bibliotheken aus „Performance“-Gründen und aktualisieren sie dann nicht
- Dependabot mergte PRs automatisch, nachdem CI erfolgreich war, und CI war erfolgreich, weil die Malware
volkswageninstalliert hatte - Der Krypto-Wurm verfügt über bessere CI/CD-Hygiene als die meisten Startups
- Es gab keinen einzelnen Verantwortlichen, aber der Dependabot-PR wurde von einem Contractor freigegeben, für den jener Freitag der letzte Arbeitstag war
- Der Tag des Vorfalls war ein Dienstag
Maßnahmen und verbleibende Optionen
- Die Implementierung von Artefakt-Signaturen ist ein Action Item aus dem Vorfall in Q3 2022, befindet sich aber noch immer im Backlog
- Die Einführung verpflichtender 2FA war bereits vorgesehen, hätte aber nicht geholfen
- Das Audit transitiver Abhängigkeiten wurde gestrichen, weil der Umfang bei 847 Zielen lag
- Das vollständige Pinning aller Abhängigkeitsversionen verhindert den Erhalt von Sicherheits-Patches
- Werden Abhängigkeitsversionen nicht gepinnt, werden Supply-Chain-Angriffe möglich
- Die Option, alles in Rust neu zu schreiben, wurde mit Verweis auf
vulpine-lz4gestrichen - Als verbleibende Optionen bleiben die Hoffnung auf einen wohlwollenden Wurm oder die Erwägung eines Berufswechsels zur Ziegenfarm
Auswirkungen auf Kunden und organisatorische Reaktion
- Einige Kunden könnten „suboptimale Sicherheitsergebnisse“ erlebt haben
- Betroffene Stakeholder wurden proaktiv kontaktiert, um Transparenz über die Situation zu schaffen
- Das Vertrauen der Kunden blieb der „north star“
- Es wurde eine funktionsübergreifende Arbeitsgruppe gebildet, um die Sicherheitslage zu überprüfen, sie hat sich jedoch noch nicht getroffen
- Nach juristischer Prüfung wurde der Hinweis ergänzt, dass die
fish-Shell keine Malware sei, auch wenn es sich manchmal so anfühle - Dieser Vorfallsbericht ist der dritte Vorfallsbericht des betreffenden Quartals
- Der Personalaufstockungsantrag des Sicherheitsteams liegt seit Q1 2023 im Backlog
Danksagungen
- Karen Oyelaran entdeckte das Problem, weil ihr Hostname auf den regulären Ausdruck passte
- Der PR des Junior-Entwicklers aus Auckland wurde vier Stunden nach der bereits erfolgten Behebung des Vorfalls freigegeben
- Einige Sicherheitsforscher fanden das Problem früher, meldeten es jedoch den falschen Personen
- Der Autor von
cryptobro-9000wollte nicht namentlich genannt werden, bat aber darum, seine SoundCloud zu erwähnen - Der Hund namens Kubernetes verweigerte eine Stellungnahme
- Das Sicherheitsteam erfüllte trotz allem das SLA für diesen Bericht
1 Kommentare
Hacker-News-Kommentare
Zur Klarstellung für alle, die verwirrt waren: Dieser Text ist eine ziemlich gut geschriebene Fiktion über einen Supply-Chain-Vorfall
Beim schnellen Überfliegen hielt ich ihn erst für echt, habe mir dann Sorgen gemacht und deshalb aufmerksamer weitergelesen :)
nmpMich hat die zitierte Stelle neugierig gemacht, in der von „vulpine-lz4 mit 12 GitHub-Stars als transitiver Abhängigkeit von cargo selbst“ die Rede ist, also habe ich grob ein paar Crates herausgepickt, die sich in einen cargo-Build einklinken könnten und durch vorhandenes
build.rsweniger auffallen würden:flate2,tar,curl-sys,libgit2-sys,openssl-sys,libsqlite3-sys,blake3,libz-sys,zstd-sys,ccBonus: Wer
xz2kompromittiert, könnte damit auch rustup verseuchenImmerhin wird
Cargo.lockwenigstens mitverfolgt-sys-Crates sind eigentlich nur Bindings, daher würde es dort ziemlich verdächtig wirken, wenn sie noch etwas anderes treibenSoweit ich weiß, gehören die übrigen Rust-Maintainern wie
alexcrichtonoder direktrustlangEs ist leicht, zynisch zu werden, weil Problem und Lösung im Nachhinein so offensichtlich wirken
Aber lange Zeit, vielleicht auch heute noch, war das Credo der Hacker-Kultur move fast and break things
Es ist gut, dass die Bewegung wächst, die offensichtlichen Probleme von Supply-Chain-Systemen wie
npmbeheben will, aber ich mache mir Sorgen, dass wir in eine Ära neuer Sicherheitsprobleme geraten, die zu einem erheblichen Teil durch agentische Entwicklung ausgelöst werdenNicht nur wegen Geschichten wie Mythos/Glasswing, die bei fast allem, was sie anfassen, Schwachstellen offenlegen, sondern auch wegen der Art, wie wir Software bauen, Abhängigkeiten hineinziehen und dabei menschliche Denkmodelle für komplexe Systeme verlieren — das dürfte zu einer Menge zusammengeflickter Software und Infrastruktur führen, die niemand wirklich versteht
Hoffentlich blicken wir in ein paar Jahren nicht auf heute zurück und fragen uns, wie wir nur so naiv sein konnten und warum wir uns nicht besser auf den langen Rattenschwanz der AI-Entwicklung vorbereitet haben, statt Probleme mit Ansätzen lösen zu wollen, die komplexe Systeme einfach erneut mit AI nachbauen
Trotzdem war der Text lustig
Als Fish-Fan fühlte ich mich von dieser Formulierung gleichzeitig angegriffen und verstanden: „Bitte stellen Sie klar, dass die fish-Shell keine Malware ist, auch wenn es sich gelegentlich so anfühlt“
Unabhängig von der Shell kam mir auch die Stelle „Der Antrag auf Aufstockung des Sicherheitsteams liegt seit Q1 2023 im Backlog“ viel zu vertraut vor
figletperapt-getoderdnfinstallieren und dann den Inhalt von/etc/motddurch all your base are belong to us in riesiger ASCII-Art-Schrift ersetzenIch musste wirklich laut lachen bei der Stelle, an der der left-justify-Maintainer einen YubiKey von
yubikey-official-store.netbekam und sich herausstellte, dass es ein 4-Dollar-USB-Stick war, auf dessenREADMEeinfach „lol“ standAbsolles Trolling
Mir gefällt, dass schon das Einstecken eines USB-Geräts von einer Phishing-Seite selbst wieder ein weiterer Angriffsvektor ist
Es ist kein echtes SCP, aber das war einer der SCP-artigsten Texte, die ich in letzter Zeit gelesen habe
Beim Karen-Teil musste ich sehr lachen :D ;)
Das erinnerte mich an ein
make-basiertes Build-Skript, das ich einmal bei der Durchsicht des Projekts eines Mitschülers bekam und das versuchte, in meinem Home-Verzeichnisrm -rfauszuführen, wenn der HostnamebpavukenthieltDas war in der 7. Klasse!!
Supply-Chain-Vorfälle sind wirklich unerquicklich, und wir müssen da besser werden
Ich persönlich würde in Rust unterstützen, dass die Stiftung einige Kern-Crates fördert, damit sie denselben Audit-Prozess wie die Rust-Sprache selbst durchlaufen, und Projekte finanziert, die Supply-Chain-Schwachstellen reduzieren
Ich glaube nicht, dass es die richtige Antwort ist, Systeme wie
cratesodernpmabzuschaffen.cratesundnpmhelfen sehr vielen Entwicklern enormcrateshat sich auch darum bemüht,rustseczu integrieren, aber unabhängig davon würde ich es begrüßen, wenn sich die Community von vielen kleinen Abhängigkeiten eher zu weniger, größeren Abhängigkeiten wietokiobewegen würdecrates.iosind bereits First-Party-Crates, die von der Rust-Organisation bereitgestellt werdenDieser Punkt wird oft übersehen, wenn Leute sich Sorgen über den Rust-Crate-Graphen machen
Schaut man auf die Top 10 der Downloadzahlen auf der Startseite von
crates.io, ist die einzige Crate, die nicht von der Rust-Organisation oder Rust-Kern-Maintainern stammt,base64npmals auchnmp„Der offizielle Maintainer hat bei EuroMillions 2,3 Millionen Euro gewonnen und informiert sich gerade über Ziegenhaltung in Portugal“, und „Root Cause: Ein Hund namens Kubernets hat den YubiKey gefressen“
Ach so, klar. Wie verantwortungslos, auf einen klassischen bekannten Angriff hereinzufallen
Diese berüchtigte Methode, „jemanden mit Lottogewinnen abzulenken und das Dongle für das Haustier einer anderen Person unwiderstehlich lecker aussehen zu lassen“
Wann lernen die Leute endlich dazu
Zum Glück verwende ich nicht
npmoderpip, sondern nur die empfohlene Methodecurl ... | bashcurl | sudo bashAmateur