1 Punkte von GN⁺ 2 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • 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, .pypirc sowie Cargo- und Gem-Zugangsdaten exfiltriert
  • Das bösartige build.rs von vulpine-lz4 lud auf CI-Hosts ein Shell-Skript herunter und führte es aus
  • Die Malware in snekpack 3.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 snekpack 3.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-lz4 und snekpack, wobei an rund 4 Millionen Entwickler Malware ausgeliefert wurde
  • Letztlich führte ein separater Krypto-Mining-Wurm namens cryptobro-9000 auf infizierten Maschinen Updates aus, hob snekpack auf 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/credentials und ~/.gem/credentials an einen vom Angreifer ausgewählten Server exfiltrierte
    • Um 13:15 UTC wurde für left-justify ein 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
  • 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-lz4 ist eine Bibliothek für „blazingly fast Firefox-themed LZ4 decompression“, hat 12 GitHub-Stars, ist aber selbst eine transitive Abhängigkeit von cargo
    • Um 22:00 UTC wurde vulpine-lz4 0.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
  • 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 snekpack durch 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-response vorü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
    • snekpack ist ein Python-Build-Tool, das von 60 % der PyPI-Pakete verwendet wird, deren Name „data“ enthält
    • snekpack hatte vulpine-lz4 vendort, weil „Rust is memory safe“
    • Um 18:00 UTC wurde snekpack 3.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_keys hinzu, installierte eine Reverse Shell, die nur dienstags aktiv wurde, und änderte die Standard-Shell des Benutzers auf fish
    • Das Ändern der Standard-Shell auf fish wurde 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
  • 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-lz4 in snekpack zurückzusetzen
    • Dieser PR benötigte zwei Freigaben, aber beide Reviewer schliefen
    • Um 02:00 UTC erhielt der left-justify-Maintainer seine YubiKey-Lieferung von yubikey-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 in jsonify-extreme zu verbreiten
    • jsonify-extreme wird als Paket beschrieben, das „makes JSON even more JSON, now with nested comment support“
    • Die Payload von cryptobro-9000 war an sich nicht bemerkenswert, aber seine Ausbreitungslogik umfasste das Ausführen von npm update und pip install --upgrade auf infizierten Maschinen, um die Angriffsfläche für künftige Attacken zu vergrößern
    • Um 06:14 UTC aktualisierte cryptobro-9000 snekpack versehentlich auf 3.7.1
    • snekpack 3.7.1 war ein legitimes Release, das von einem verwirrten Co-Maintainer veröffentlicht wurde und das vendorte vulpine-lz4 auf 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-9000 kompromittiert 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-lz4 ausgetauscht
    • 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

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-rs mit 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 volkswagen installiert 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-lz4 gestrichen
  • 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-9000 wollte 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

 
GN⁺ 2 시간 전
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 :)

    • Bei left-justify hat es mich komplett zerlegt :)
    • Anfangs konnte ich es ehrlich gesagt nicht unterscheiden, und es fühlte sich so an: https://github.com/bitcoin/bips/blob/master/bip-0042.mediawi...
    • Wenn man nach CVE-2024-YIKES sucht, findet man auch eine Galerie von AI-generierten Schrottblogs, die den Inhalt dieses Textes umschreiben und dabei todernst tun
    • nmp
  • Mich 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.rs weniger auffallen würden: flate2, tar, curl-sys, libgit2-sys, openssl-sys, libsqlite3-sys, blake3, libz-sys, zstd-sys, cc
    Bonus: Wer xz2 kompromittiert, könnte damit auch rustup verseuchen
    Immerhin wird Cargo.lock wenigstens mitverfolgt

    • -sys-Crates sind eigentlich nur Bindings, daher würde es dort ziemlich verdächtig wirken, wenn sie noch etwas anderes treiben
      Soweit ich weiß, gehören die übrigen Rust-Maintainern wie alexcrichton oder direkt rustlang
  • Es 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 npm beheben will, aber ich mache mir Sorgen, dass wir in eine Ära neuer Sicherheitsprobleme geraten, die zu einem erheblichen Teil durch agentische Entwicklung ausgelöst werden
    Nicht 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

    • War das wirklich so lange das Credo? Ich dachte, diesen schrecklichen Spruch hätte Zuckerberg erfunden
  • 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

    • Als Alternative könnte man figlet per apt-get oder dnf installieren und dann den Inhalt von /etc/motd durch all your base are belong to us in riesiger ASCII-Art-Schrift ersetzen
  • Ich musste wirklich laut lachen bei der Stelle, an der der left-justify-Maintainer einen YubiKey von yubikey-official-store.net bekam und sich herausstellte, dass es ein 4-Dollar-USB-Stick war, auf dessen README einfach „lol“ stand
    Absolles Trolling

    • Ja, das war wirklich großartig
      Mir gefällt, dass schon das Einstecken eines USB-Geräts von einer Phishing-Seite selbst wieder ein weiterer Angriffsvektor ist
    • Normalerweise bekommt man von Phishing-Seiten deutlich weniger. Ein funktionierender USB-Stick ist doch was!
  • Es ist kein echtes SCP, aber das war einer der SCP-artigsten Texte, die ich in letzter Zeit gelesen habe

    • Ach ja, ein äußerst seltener Supply Chain Problem (SCP) also
  • 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-Verzeichnis rm -rf auszuführen, wenn der Hostname bpavuk enthielt
    Das 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 crates oder npm abzuschaffen. crates und npm helfen sehr vielen Entwicklern enorm

    • crates hat sich auch darum bemüht, rustsec zu 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 wie tokio bewegen würde
    • Viele der populärsten Crates auf crates.io sind bereits First-Party-Crates, die von der Rust-Organisation bereitgestellt werden
      Dieser 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, base64
    • Könnte man Crates mit hohem Nutzwert nicht einfach in die Standardbibliothek übernehmen?
    • Aber braucht man wirklich sowohl npm als auch nmp
    • Ehrlich gesagt dachte ich, das sei das Endziel von blessed.rs
  • „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 npm oder pip, sondern nur die empfohlene Methode curl ... | bash

    • Das heißt curl | sudo bash
      Amateur