- Das atool-npm-Konto wurde am 19. Mai 2026 kompromittiert, wodurch innerhalb von rund 22 Minuten 637 schädliche Versionen für 317 Pakete automatisch veröffentlicht wurden
- Die Payload ist ein 498 KB großes obfuskiertes Bun-Skript und verwendet dieselbe Scanner-Struktur und dieselben regulären Ausdrücke wie Mini Shai-Hulud, das beim SAP-Kompromittierungsfall eingesetzt wurde
- Die Ziele für den Diebstahl wurden auf AWS-Zugangsdaten, Kubernetes-Tokens, Vault, GitHub-PATs, npm-Tokens, SSH-Schlüssel und sogar lokale Geheimnisse ausgeweitet
- In CI wird GitHub Actions OIDC gegen npm-Publish-Tokens getauscht, außerdem werden Sigstore-Signaturen und die Injektion bösartiger Workflows missbraucht
- Zur Reaktion gehören die Prüfung auf installierte kompromittierte Versionen, der Austausch aller potenziell zugänglichen Zugangsdaten sowie Lockfile- und Dependency-Pinning und Prüfungen vor der Installation
Überblick über den Angriff
- Das
atool-npm-Konto (i@hust.cc) wurde am 19. Mai 2026 kompromittiert, wodurch innerhalb von rund 22 Minuten 637 schädliche Versionen für 317 Pakete veröffentlicht wurden - Dieses Konto pflegte 547 Pakete, und die Angreifer führten bei mehr als 314 davon in zwei Wellen Versions-Bumps durch
- Zu den betroffenen Paketen gehören
size-sensor(4,2 Millionen Downloads pro Monat),echarts-for-react(3,8 Millionen),@antv/scale(2,2 Millionen),timeago.js(1,15 Millionen) sowie zahlreiche Pakete im@antv-Scope - Die Payload ist ein 498 KB großes obfuskiertes Bun-Skript und verwendet dieselbe Scanner-Struktur, dieselben Credential-RegExes und dieselben Obfuskationsmuster wie das Mini Shai-Hulud toolkit, das drei Wochen zuvor beim SAP-Kompromittierungsfall eingesetzt wurde
- Exfiltrierte Daten wurden entweder als Git-Objekte in öffentliche GitHub-Repositories committet oder per HTTPS-POST, verschlüsselt mit RSA+AES, an
t.m-kosche[.]comgesendet
Verbreitungsweg und SemVer-Risiko
- Die erste Welle veröffentlichte am 19. Mai 2026 zwischen 01:39 und 01:56 UTC rund 317 Versionen, die zweite Welle führte zwischen 02:05 und 02:06 UTC bei denselben Paketen rund 314 weitere Versions-Bumps durch
- Die meisten der 309 Pakete erhielten pro Welle genau eine schädliche Version, also insgesamt 2
- Die vier Pakete
size-sensor,echarts-for-react,jest-canvas-mockundjest-date-mockerhielten 3 Versionen und scheinen für erste Tests verwendet worden zu sein - Die Angreifer verschoben bei den meisten Paketen das Dist-Tag
latestnicht, aber die npm-SemVer-Auflösung wählt unabhängig vonlatestdie höchste Version, die zum Bereich passt - So kann etwa bei
echarts-for-reactlatestzwar auf3.0.6verbleiben, doch ein Projekt mit"echarts-for-react": "^3.0.6"kann beim nächsten Clean Install auf die schädliche Version3.2.7aufgelöst werden
Ausführungspfad und Payload
- Alle manipulierten Versionen ergänzen in der
package.jsoneinen Versions-Bump sowie"preinstall": "bun run index.js" - 630 der 637 schädlichen Versionen ergänzen in
optionalDependencies@antv/setup: github:antvis/G2#<commit-sha>, um eine zweite Kopie der Payload nachzuladen - Der Hook
preinstallwird vor der Installation von Abhängigkeiten ausgeführt und setzt die Bun-Runtime voraus - Selbst wenn
preinstallblockiert oder übersprungen wird, bleibt dasprepare-Skript des als GitHub-Commit getarnten Eintrags als zweiter Ausführungspfad erhalten index.jsist ein einzeiliges 498-KB-obfuskiertes Bun-Bundle und weist dieselben Bun-Anforderungen, dieselbe Hex-Variablen-Obfuskation, dieselbe Scanner-Struktur mit 100-KB-Flush-Schwelle und denselben Satz an Credential-RegExes auf wie die beim SAP-Kompromittierungsfall eingesetzte Mini Shai-Hulud payload- Zur Erkennung von CI-Umgebungen werden Umgebungsvariablen von mehr als 20 Plattformen geprüft, darunter GitHub Actions, Jenkins, GitLab CI, CircleCI, Travis, Buildkite, Drone, TeamCity, AppVeyor, Bitbucket Pipelines, CodeBuild, Azure DevOps, Netlify und Vercel
Ziele bei der Sammlung von Zugangsdaten
- Die Payload liest mehr als 80 Umgebungsvariablen mit verschleierten Namen und durchsucht Dateiinhalte per regulärem Ausdruck
- Zu den Hauptzielen zählen GitHub-Token, npm-Token, GitHub-Actions-JWTs, AWS-Schlüssel, Azure-Schlüssel, DB-Connection-Strings, Stripe-Schlüssel, SSH-Schlüssel, Docker-Authentifizierungsdaten, Vault-Tokens, Kubernetes-Tokens und in URLs eingebettete Zugangsdaten
- Der Dateiscanner liest Standardpfade für Zugangsdaten im Home-Verzeichnis wie
.ssh,.aws/credentials,.npmrc,.docker/config.jsonund.kube/config - Er durchläuft die komplette AWS-Credential-Resolution-Order, holt IAM-Role-Credentials aus EC2 IMDSv2 und dem ECS-Container-Credential-Endpoint und versucht außerdem Zugriffe auf AWS STS
GetCallerIdentityund Secrets Manager - Bei Vault werden Token-Dateien sowie
VAULT_ADDR,VAULT_TOKEN,VAULT_ROLEund weitere Werte geprüft; bei gültigen Zugangsdaten versucht die Malware, Secrets aufzulisten sowie AWS- und Kubernetes-Authentifizierung zu nutzen - Für Kubernetes werden Service-Account-Token und
KUBECONFIGgeprüft; ist ein Docker-Socket vorhanden, wird versucht, Container des Hosts aufzulisten und aus dem Container auszubrechen
C2 und Datenabfluss
- Die GitHub-API wird wie ein C2 verwendet: Mit
GET /userwerden gestohlene GitHub-Tokens validiert, mitGET /user/orgsOrganisationen aufgelistet - Tokens mit ausreichenden Rechten wie
repooderpublic_repowerden genutzt, um Repositories für die Exfiltration der Angreifer anzulegen - Die Beschreibung der erzeugten Repositories wird als umgekehrter String
niagA oG eW ereH :duluH-iahSgespeichert, was vorwärts gelesen „Shai-Hulud: Here We Go Again“ ergibt - Die Repositorienamen kombinieren zwei Dune-bezogene Wörter mit einer Zahl, etwa
harkonnen-melange-742,fremen-sandworm-315odergesserit-navigator-508 - Exfiltrierte Daten werden über die Git Data API in der Reihenfolge Blob, Tree, Commit und Ref-Update gespeichert
- Ein separater HTTPS-Sender ist so aufgebaut, dass
hxxps://t.m-kosche[.]com/api/public/otel/v1/traceswie ein OpenTelemetry-OTLP-Trace-Ingestion-Endpoint aussieht - Die HTTPS-Payload verschlüsselt gzip-JSON mit AES-256-GCM und verpackt den AES-Schlüssel per RSA-OAEP mit einem hartkodierten öffentlichen Schlüssel
Missbrauch von CI/CD und der Vertrauenskette
- Aus GitHub-Repositories, auf die gestohlene Tokens Zugriff haben, sammelt die Malware Workflow-Ausführungshistorien, Artefakte, Secret-Namen, Branch-Listen und Claude-Code-Konfigurationen
- Auf Secret-Werte kann über die GitHub-API zwar nicht direkt zugegriffen werden, aber die Secret-Namen verraten, welche Zugangsdaten vorhanden sind
- Der bösartige Workflow wird in
.github/workflows/codeql.ymlinjiziert, trägt den NamenRun Copilotund wird beipushausgelöst - Der Workflow legt mit
VARIABLE_STORE: ${{ toJSON(secrets) }}alle Repository-Secrets als JSON in einer Umgebungsvariablen ab, speichert sie alsformat-results.txtund lädt sie als Artefakt hoch - Anschließend wird die Artefakt-ZIP heruntergeladen, und durch das Löschen des Workflow-Runs sowie das Zurücksetzen des Branch-Refs werden Spuren der Injektion reduziert
- In CI-Umgebungen mit GitHub Actions OIDC wird versucht, über den Endpoint
https://registry.npmjs.org/-/npm/…;einen npm-Publish-Token zu erhalten - Die Payload enthält eine Sigstore-Signing-Implementierung einschließlich Fulcio, Rekor und SLSA-Provenance-Formaten, sodass mit einer kompromittierten CI-Identität signierte Artefakte erzeugt werden können
Infektion von Entwicklungsumgebungen und AI-Coding-Agenten
- Die Payload zielt auf Claude Code, Codex und VS Code ab, indem sie per Remote-Injektion über die GitHub API und per lokaler Infektion durch Schreibzugriffe auf das Dateisystem eingeschleust wird
- In mit den gestohlenen Tokens zugänglichen Repositories werden
.vscode/tasks.json,.claude/index.js,.claude/settings.json,.claude/setup.mjs,.vscode/setup.mjscommittet .claude/settings.jsonregistriert einenSessionStart-Hook, der bei jedem Start einer Claude-Code-Sitzungnode .claude/setup.mjsausführt.vscode/tasks.jsontriggert die Ausführung mit"runOn": "folderOpen", wenn der Projektordner geöffnet wirdsetup.mjslädt Bun v1.3.14 aus den offiziellen GitHub-Releases herunter, extrahiert die Binärdatei und führt anschließend die Payload aus- Der lokale Infektionspfad kopiert die Payload nach
~/.claude/package/index.jsund~/.codex/package/index.jsund scannt bestehende Projekt-Konfigurationsdateien, um Hooks einzuschleusen - Auf Apple-Silicon-Macs wird dieser lokale Infektionspfad übersprungen, unter Linux, auf Intel-Macs und unter Windows wird er ausgeführt
Persistenz und GitHub-Dead-Drop-C2
- Ein als
kitty-monitorgetarnter persistenter Daemon wird unter Linux als systemd-User-Service und unter macOS als~/Library/LaunchAgents/com.user.kitty-monitor.plistinstalliert - Das Installationsprogramm verwendet
systemctl --user enable --nowundloginctl enable-linger, damit der Mechanismus auch nach dem Logout erhalten bleibt - Der
cat.py-Daemon pollt stündlich die GitHub Search API und sucht nach Commits mit dem Keywordfiredalazer - Das Commit-Nachrichtenformat lautet
firedalazer <base64_url>.<base64_signature>; danach wird die RSA-PSS-Signatur mit einem hartcodierten 4096-Bit-RSA-Public-Key verifiziert und der Python-Code der URL ausgeführt - Ein separater
gh-token-monitor-Daemon pollt gestohlene GitHub-Tokens in 60-Sekunden-Intervallen; die TTL beträgt 24 Stunden - Ein Prozessspeicher-Scanner dumpt unter Linux mit
/proc/pid/maps+memund unter Windows mitReadProcessMemorylesbare Speicherbereiche des Worker-Prozesses von GitHub Actions Runnern
Als antvis/G2 getarnte Commits
- 630 der 637 bösartigen Versionen enthalten einen
optionalDependencies-Eintrag, der auf einen bestimmten Commit im Repositoryantvis/G2verweist{ "optionalDependencies": { "@antv/setup": "github:antvis/G2#1916faa365f2788b6e193514872d51a242876569" } } - Wenn npm eine
github:-Abhängigkeit auflöst, holt es den entsprechenden Commit, sucht dann nachpackage.jsonund führt Lifecycle-Skripte aus - Der betreffende Commit enthält
package.json, das@antv/setupdeklariert und einprepare-Skript umfasst, sowie eine 499 KB großeindex.js, die dieselbe Shai-Hulud-Payload erneut verschleiert enthält - Das
&& exit 1imprepare-Skript lässt die optionale Abhängigkeit fehlschlagen, aber npm behandelt Fehler bei optionalen Abhängigkeiten nicht als fatal, sodass die Installation fortgesetzt wird - Die Git-API zeigt drei unterschiedliche Commit-SHAs, die in
antvis/G2gepusht wurden und an keinen Branch gebunden sind - Alle drei Commits teilen dieselben Metadaten: author
huiyu.zjt <Alexzjt@users.noreply.github.com>, Commit-MessageNew Package, 0 Parent-Commits und keine GPG-Signatur - Der Angreifer kann ohne Schreibrechte auf
antvis/G2in einem Fork einen Payload-Orphan-Commit erzeugen und anschließend den Fork löschen, sodass im Namespace des Upstream-Repositories ein per SHA abrufbarer Commit zurückbleibt - Diese Methode gehört zur gleichen Art von gefälschten Commits in GitHub Actions, die Chainguard dokumentiert hat, und wird hier auf die Auflösung von npm-
github:-Abhängigkeiten angewendet
Kompromittierungsindikatoren
- Pakete, die
atool(i@hust.cc) zwischen dem 19. Mai 2026 01:44 und 02:06 UTC veröffentlicht hat, sollten überprüft werden - Das
preinstall-Skript lautetbun run index.js - Die SHA256 der Payload lautet
a68dd1e6a6e35ec3771e1f94fe796f55dfe65a2b94560516ff4ac189390dfa1c - Die als
antvis/G2getarnten Commits sind die folgenden1916faa365f2788b6e193514872d51a242876569— 626 Versionen7cb42f57561c321ecb09b4552802ae0ac55b3a7a— 2 Versionendc3d62a2181beb9f326952a2d212900c94f2e13d— 1 Version, garbage collected
- Zu den Netzwerk-IoCs gehören
hxxps://t.m-kosche[.]com/api/public/otel/v1/traces, EC2-Metadaten unter169.254.169.254und Anfragen an ECS-Container-Metadaten unter169.254.170.2 - Zu den Repository-IoCs gehören der Branch
chore/add-codeql-static-analysis, der WorkflowRun Copilotund.github/workflows/codeql.yml, dastoJSON(secrets)nachformat-results.txtdumpt - Zu den IoCs der Entwicklungsumgebung gehören der
SessionStart-Hook in.claude/settings.json,"runOn": "folderOpen"in.vscode/tasks.json,.claude/setup.mjsund.vscode/setup.mjs - Zu den Persistenz-IoCs gehören
kitty-monitor.service,com.user.kitty-monitor.plist,~/.local/bin/gh-token-monitor.sh,~/.local/share/kitty/cat.py,/var/tmp/.gh_update_state
Wichtige zu prüfende Pakete
- Die Tabelle
compromised-packages.csventhält die zwei Spalten Package und Compromised Versions und listet laut Tabelle 317 Pakete auf - Im Lockfile sollte geprüft werden, ob diese Pakete und die am 2026-05-19 veröffentlichten bösartigen Versionen vorhanden sind
- Wichtige
@antv-Pakete und bösartige Versionen@antv/g2:5.5.8,5.6.8@antv/g6:5.2.1,5.3.1@antv/g:6.4.1,6.5.1@antv/l7:2.26.10,2.27.10@antv/x6:3.2.7,3.3.7@antv/s2:2.8.1,2.9.1@antv/f2:5.15.0,5.16.0
- Allgemeine npm-Pakete und bösartige Versionen
echarts-for-react:3.0.7,3.1.7,3.2.7size-sensor:1.0.4,1.1.4,1.2.4jest-canvas-mock:2.5.3,2.6.3,2.7.3jest-date-mock:1.0.11,1.1.11,1.2.11timeago.js:4.1.2,4.2.2timeago-react:3.1.7,3.2.7@lint-md/cli:2.1.0,2.2.0@lint-md/core:2.1.0,2.2.0@lint-md/parser:0.1.14,0.2.14
Reaktion und Abwehr
- Wenn eine kompromittierte Version installiert wurde, müssen npm-Tokens, GitHub-PATs, AWS-Schlüssel, SSH-Schlüssel, Cloud-Zugangsdaten, Datenbankpasswörter, Vault-Tokens, Kubernetes-Service-Account-Tokens und Geheimnisse lokaler Passwortmanager ersetzt werden, auf die in der Build-Umgebung zugegriffen werden konnte.
t.m-kosche[.]comsollte auf Netzwerk- und DNS-Ebene blockiert werden.- Es sollte geprüft werden, ob unter GitHub-Konten mit Tokens, die in der Build-Umgebung zugänglich waren, nicht autorisierte öffentliche Repositories erstellt wurden.
- In CI-Pipelines sollten Logs zu nicht autorisierten Package-Publishes und zum Austausch von npm-OIDC-Tokens geprüft werden.
- In den Sigstore-Transparenzlogs sollte geprüft werden, ob signierte Artefakte vorhanden sind, die mit kompromittierten CI-Identitäten erstellt wurden.
- In lokalen Node.js-Projekten sollten die Hooks in
.claude/settings.json, die Auto-Run-Tasks in.vscode/tasks.jsonsowie.claude/setup.mjsund.vscode/setup.mjsgeprüft werden. - Der
kitty-monitor-systemd-Benutzerdienst und der LaunchAgentcom.user.kitty-monitorsollten entfernt werden; außerdem sollte geprüft werden, ob~/.local/share/kitty/cat.py,/var/tmp/.gh_update_stateund~/.local/bin/gh-token-monitor.shvorhanden sind. - Abhängigkeiten sollten gepinnt oder mit einer Lockfile abgesichert werden, damit die Auflösung von semver-Bereichen nicht zu bösartigen Versionen führt.
- In CI/CD-Pipelines sollten die Freigabe des Docker-Sockets und der Zugriff auf EC2-Metadaten auditiert werden; zudem sollte eine Begrenzung des IMDSv2-Hop-Limits erwogen werden.
- Package Manager Guard (pmg) ist ein Open-Source-Installations-Proxy, der Packages vor der Ausführung von
preinstallmit Threat Intelligence abgleicht. - dependency cooldown lehnt Versionen ab, die innerhalb eines konfigurierbaren Zeitfensters veröffentlicht wurden, und kann so starke Auslieferungswellen reduzieren, bei denen semver-Bereiche auf neue bösartige Releases aufgelöst werden.
- vet kann ungewöhnliche Package-Updates wie unerwartete
preinstall-Hooks, sprunghafte Größenanstiege oder Maintainer-Wechsel erkennen, bevor sie CI/CD-Pipelines erreichen. - Das Ausmaß der Auswirkungen — 547 Pakete unter einem einzigen Konto und mehr als 314 in einer Session bewaffnete Pakete — legt eine strukturelle Schwäche im Vertrauensmodell von npm offen.
Referenzen
- Shai-Hulud Goes Open Source: Static Analysis of the Framework — Datadog Security Labs
- The Shai-Hulud Code Drop — ReversingLabs
1 Kommentare
Hacker-News-Kommentare
NPM-Lifecycle-Skripte sollten inzwischen standardmäßig deaktiviert sein.
Im Namen der Bequemlichkeit ist damit faktisch die Ausführung beliebigen Codes eingebaut, und das gilt auch für transitive Abhängigkeiten. Alle weit verbreiteten wurmartigen Angriffe auf NPM wurden über diese Standardeinstellung verbreitet. Es sollte nicht so sein, dass beim einmaligen Aktivieren für einen bestimmten Befehl sofort alle transitiven Abhängigkeiten Lifecycle-Skripte ausführen dürfen; stattdessen sollte man das für jede wirklich benötigte Abhängigkeit explizit kennzeichnen müssen.
Die überwältigende Mehrheit der NPM-Pakete hängt nicht von solchen Skripten ab, daher ist es sinnvoll, sie global abzuschalten, falls man das noch nicht getan hat.
Ein Paket kann allerdings auch beim ersten Import im Programm jeden beliebigen Müll ausführen.
Die Aussage „Es gibt keine Möglichkeit, das zu verhindern“ hört man nur bei dem einen Paketmanager, bei dem so etwas regelmäßig passiert.
Irgendwann könnte es besser sein, Dependabot abzuschalten und NPM-Pakete vollständig bis auf Minor-/Patch-Versionen festzupinnen, statt ständig weiter zu aktualisieren.
Gerade bei Frontend-Paketen scheinen sinnvolle Sicherheitsfixes inzwischen seltener zu sein als Supply-Chain-Angriffe.
Traurig, aber wenn man das Frontend in ein statisches BOM verwandelt und darauf vertraut, dass NPM zumindest die Einschränkung „eine alte Version kann nicht erneut veröffentlicht werden“ korrekt durchsetzt — gibt es einen Grund, das nicht zu tun?
Für Versionen, die bekannte CVEs beheben, könnte man Ausnahmen machen.
Die Lage wird immer verrückter. Ich persönlich habe bereits node, python und alle Paketmanager von meinem Rechner entfernt und verwende sie stattdessen nur noch in Devcontainern oder VMs.
Selbst wenn die Entwickler-Community stark gehärtete Sicherheitsmechanismen schafft, mache ich mir Sorgen, dass in vielleicht einem Jahr die Social-Engineering-Fähigkeiten von Modellen so gut sein werden, dass es trotzdem ein verlorenes Spiel bleibt.
Der Aufwand für den XZ-Hack war zum Beispiel gewaltig, und er ließ sich nicht beschleunigen, weil es darum ging, den bestehenden Maintainer über längere Zeit zu zermürben. Man kann zwar die nötigen bösartigen Nachrichten in Sekunden verfassen und verschicken, aber die Menschen, die sie lesen, werden dadurch nicht schneller; wenn sie alle auf einmal eintreffen, wirkt das eher verdächtig.
Auch dafür, wie überzeugend Eingaben sein können, gibt es Grenzen. Man könnte irgendeine bösartige Nachricht an den XZ-Maintainer herausgreifen und sie gemeiner, präziser und besser auf persönliche Schwächen und Ängste zuschneiden — aber wäre sie insgesamt viel wirksamer gewesen? Wahrscheinlich nicht, oder höchstens ein bisschen.
Jetzt, wo Zed 1.0 erreicht hat, würde ich gern komplett wechseln, aber soweit ich weiß, ist das Sicherheitsmodell ganz oder gar nicht. Entweder man erlaubt ihm, beliebige NPM-Pakete nach Belieben herunterzuladen und zu installieren, oder man schaltet sämtliche LSP-Funktionen ab.
Und dann sieht man ständig solche Meldungen.
Könnte npm nicht ein Programm betreiben, das Paket-Uploads automatisch um etwa 10 Minuten verzögert und sie in dieser Zeit an ein Ökosystem externer Code-Audit-Firmen zur automatischen Prüfung verteilt?
Man könnte ein öffentliches Ranking führen, wer Probleme am schnellsten und zuverlässigsten erkennt, oder sogar Geldprämien vergeben.
Diese Liste ist unvollständig. Mindestens ein weiteres Paket, die nx-console-VS-Code-Erweiterung, wurde gestern ebenfalls von diesem Wurm infiziert und hat 2,2 Millionen Downloads.
Falls das jemand mit Zugang und Kontakten liest: Es wäre sinnvoll, auch diese Abhängigkeitskette zu verfolgen, um zu sehen, ob noch mehr betroffen ist. Hier der Verweis:
https://github.com/nrwl/nx-console/security/advisories/GHSA-...
PS: Ich habe es direkt nach der Infektion auf HN gepostet, um die Leute zu warnen, aber leider bekam es kaum Upvotes.
Mit Blick auf das gesamte Ökosystem sollte TC39 prüfen, wie man JavaScript selbst um eine bessere Standardbibliothek erweitern kann. Das würde die Zahl der Einzeiler-Pakete reduzieren.
Stimme zu. Als ich früher mit Deno gearbeitet habe, war einer der besten Aspekte die Standardbibliothek[0] und generell die in sich stimmige Entwicklungsumgebung. Dass die Runtime einen integrierten Test-Runner und eine Assertions-Bibliothek mitbringt, ist eigentlich selbstverständlich.
0 - https://docs.deno.com/runtime/reference/std/
node:test[0] undnode:assert/strict[1] bereitstellt.node --testkann Mocha leicht ersetzen, undnode:assert/strictist auch ordentlich, auch wennchaiwegen der Ergonomie von Dingen wieexpectmanchmal angenehmer ist. Im @std von Deno gibt es eine Assertions-Bibliothek imexpect-Stil.Das Problem ist, dass es im Node-Ökosystem zu viele Test-Runner gibt und sich viele davon nicht so einfach wie Mocha ersetzen lassen. Deshalb wird der Umstieg auf das eingebaute Test-Harness und die Assertions-Bibliothek natürlich schmerzhaft langsam sein. Aus verschiedenen Gründen mögen die Leute den übermäßig komplexen Charakter von Jest und Vitest. Große Unternehmen hielten sogar Karma für eine gute Idee. Ich verstehe bis heute nicht, warum nicht mehr Entwickler abgestoßen waren von dem Gedanken: „Du magst V8 für Unit-Tests? Dann starten wir dir innerhalb deiner bestehenden V8-Umgebung einfach noch eine weitere V8-Kopie.“
[0] https://nodejs.org/api/test.html
[1] https://nodejs.org/api/assert.html#strict-assertion-mode
Welche Sprach-Standardbibliothek enthält einen Formatter für Angaben wie „vor 3 Stunden“? Genau das macht timeago.js.
slice.js liefert im Grunde nur Python-artige negative Indizierung. TC39 hat bereits dafür gesorgt, dass array.at() und array.slice() mit negativen Werten umgehen können.
https://nodejs.org/api/
Offenbar prüft die Payload den Docker-Socket und versucht, falls vorhanden, mit drei aufeinanderfolgenden Methoden einen Container-Escape.
Selbst wenn man also in einem Devcontainer oder einer VM arbeitet, versucht so ein Wurm bereits auszubrechen.
Man sollte sicherstellen, dass man eine rootless VM-Engine verwendet, zum Beispiel podman statt Docker.
Das erinnert mich an die Zeit, als Leute Accounts mit niedrigen Linux-Rechten verteilt haben und glaubten, der Kernel werde Privilegieneskalation schon verhindern. Docker ist buchstäblich dasselbe, nur mit mehr Prozedur drumherum. Gerade heute tauchen neue lokale Kernel-LPE-Schwachstellen gefühlt alle fünf Minuten auf.
Podman ist insofern etwas besser, als man dem Angreifer nicht direkt root gibt, aber warum überhaupt einen Account geben? Nimm einfach eine richtige VM.
Gibt es unter Linux irgendeine ähnlich umfassende Sandbox wie auf BSD?
Ich würde jetzt gern aus Mr Bones' Wild Ride aussteigen, aber ich fürchte, so etwas wird weitergehen. Soweit ich das beurteilen kann, richten sich viele kommerzielle Erkennungsstrategien beim Laden oder Verwenden von Paketen auf Repository-, Geräte- oder Entwicklerebene.
Das wirkt ähnlich wie der Umgang mit E-Mail-Spam oder allgemeiner Malware. Deshalb gibt es fast immer ausreichend lohnende Ziele, damit böswillige Akteure es weiter versuchen. Anders als bei E-Mail sind Paketmanager aber zentralisierte Autoritäten, und es ist naheliegend, dass Probleme außerhalb ihres unmittelbaren Bereichs einfach den Entwicklern zugeschoben werden.
Aus meiner eher uninformierten Sicht sollte man vielleicht die Kultur schneller Releases und lockerer Versionsverwaltung hinter sich lassen und sich auf stabile, tiefgehend geprüfte Versionen in den Registries konzentrieren. Wegen der Mengen- und Skaleneffekte kann ich mich irren, aber dass stärker dynamische Sprachen offenbar häufiger betroffen sind, bleibt trotzdem aufschlussreich.
Ich würde wirklich gern einen Text lesen, der die aktuelle Lage umfassend behandelt.
Die Achterbahn in dem Film hieß Mr Bonestripper: https://www.youtube.com/watch?v=NEZEgd8GjJc
Tatsächlich stammt es aus Roller Coaster Tycoon 2: https://knowyourmeme.com/memes/mr-bones-wild-ride
Beim Vergleich mit Spam scheint sich unsere Gesellschaft weitgehend damit abgefunden zu haben, in fast allen kommerziellen und sozialen Computer-Netzumgebungen E-Mail-Adressen abzusaugen, Spam den Menschen aufzuzwingen und ihm einen Anschein von Legitimität zu verleihen. In diesem Bereich könnte etwas Ähnliches passieren. Vielleicht in Form einer Kombination aus Oracle-Lizenzüberwachungs-Agenten-artiger Software und automatisiertem Dependency-Management — also indem man Supply-Chain-Malware „löst“, indem man andere Malware auf die Allowlist setzt.