19 min read
High
By

Shai-Hulud bohrt weiter — 323 npm-Pakete im @antv-Cluster in einer Stunde, und was das für die Build-Pipeline-Disziplin bedeutet

22. Mai 2026. Am 19. Mai wurden über das kompromittierte npm-Konto atool rund 639 bösartige Paketversionen verteilt auf 323 Pakete in etwas über einer Stunde publiziert — die bisher dichteste Einzel-Stunden-Welle der Shai-Hulud-Reihe (JFrog Security Research, The Register). Schwerpunkt ist das @antv-Ökosystem (Charting, Graph-Visualisierung, Mapping); davor schon @tanstack, @mistralai und @uipath (11.–12. Mai), und mit intercom/intercom-php@5.0.2 am 30. April ist auch Packagist betroffen. Wer im Node- oder Mixed-Stack baut, prüft die eigene Build-Pipeline heute ein zweites Mal — die Welle ist keine Ausnahme mehr, sondern der laufende Zustand.

Walnuss-und-Messing-Karteischrank-Auszug mit cremefarbenen Karteikarten auf mattem Schiefer; sieben Karten mit oxblutroten Wachsfäden untereinander verbunden, eine halbherausgezogen mit gespannten Verbindungsfäden.
AI-generated · gpt-image 2.0

TL;DR — die 90-Sekunden-Zusammenfassung

FrageAntwort
Betroffen?Jede Build-Pipeline, die seit dem 19. Mai 2026, 16:00 UTC, npm install, yarn install oder pnpm install gegen das öffentliche npm-Registry ohne Lockfile-Pinning oder ohne signaturgeprüfte Provenance gefahren hat — sofern im Tree Pakete aus dem @antv-Cluster, dem @tanstack-Cluster (11.–12. Mai), dem @mistralai-/@uipath-/@opensearch-project-Cluster (11.–12. Mai) oder den April-Wellen stehen. Auf Composer-Seite: jede composer install gegen intercom/intercom-php@5.0.2 am 30. April zwischen ~20:53 und ~22:37 UTC.
Risiko?Credential- und Token-Exfiltration zur Install-Zeit, vor dem ersten Application-Run. Der Worm liest ~/.npmrc, GitHub-Tokens, AWS-, Azure- und GCP-Credentials, ~/.docker/config.json und SSH-Keys; in der Umgebung sucht er nach CI/CD-Secrets. Findet er einen gültigen npm-Token, validiert er ihn gegen das npm-Registry, listet die Pakete des Opfers und republiziert sie mit injiziertem Payload — die Self-Propagation, die Shai-Hulud zum Worm macht.
Sofortmaßnahme?Build-Pipeline inventarisieren: welche npm install- oder composer install-Schritte sind seit dem 19. Mai (npm) bzw. 30. April (Packagist) gegen das öffentliche Registry gelaufen? CI- und Build-Agent-Secrets rotieren (npm-Tokens, GitHub-PATs, Cloud-Credentials, SSH-Keys), npm whoami gegen die Token-Liste prüfen, npm audit signatures als Pre-Install-Gate setzen, Lockfile-Diffs in CI vor dem Merge erzwingen.
Empfehlung?Mittelstand: einmalige Pipeline-Inventur, Token-Rotation, npm audit signatures als Standard. Enterprise: zusätzlich interner Mirror (Verdaccio, JFrog Artifactory, Sonatype Nexus) mit Allow-Liste, signaturgeprüfter Pull, npm install --ignore-scripts für Production-Builds, SBOM als Artefakt jedes Builds. Wer schon Wolfi-Distroless- oder Chainguard-Images fährt: die Pull-Schicht bleibt intakt, aber die Build-Schicht, die das Wolfi-Image produziert, ist genauso anfällig wie jede andere Node- oder Composer-Build-Schicht.
Kritikalität?Siehe Hero-Badge — high. Keine Mass-Exploitation gegen Endkunden, aber die Worm-Welle läuft weiter gegen jeden, der ohne Lockfile-Pinning und ohne signaturgeprüften Pull baut. Sie setzt sich seit September/November 2025 in Phasen fort; die Welle vom 19. Mai ist die bisher dichteste der Reihe.

Was ist das Problem? — der Worm, der seinen eigenen Vorrat aufbaut

Erste große WelleSeptember 2025 (Erst-Disclosure als „Shai-Hulud“-Worm), Wiederaufnahme November 2025 (~796 Pakete kompromittiert, 132 Mio. Monats-Downloads)
„Mini Shai-Hulud“-Wellen Mai 2026Mehrere Sub-Wellen: 11.–12. Mai (172 Pakete: @tanstack, @mistralai, @uipath, @opensearch-project), 19. Mai (323 Pakete, @antv-Cluster, JFrog), dazwischen kleinere Schwester-Wellen
Packagist-Ausweitung30. April 2026, intercom/intercom-php@5.0.2 als Composer-Plugin-Variante — selber Payload, andere Trigger-Schicht (Composer\Plugin\PluginInterface statt npm-preinstall)
Self-PropagationJa — der Payload listet die Pakete des kompromittierten Token-Owners (npm token list + npm pkg), zieht die Tarballs, injiziert seinen Payload in die Tarball-Stage und republiziert mit angehobener Version
Primär-VektorÜbernahme einzelner Maintainer-Konten (Phishing, Token-Diebstahl von einer kompromittierten Entwickler-Maschine); danach Massen-Publish über die kompromittierte Identität
Detection-ZeitStepSecurity und Socket erkannten Pakete im Schnitt 20–26 Minuten nach Publish; einzelne Wellen lagen bei 14 Minuten
Vulnerability-TypSupply Chain Compromise (CWE-1357), Credential Disclosure (CWE-200), Self-Propagating Code (CWE-829)

Wie der Worm in der Praxis aussieht

Der Standard-Payload — in der Mai-Variante leicht abgewandelt gegenüber der September-2025-Vorlage — läuft im npm-preinstall-Hook bzw. bei Composer im PluginInterface::activate()-Hook. Beide Hooks feuern vor dem ersten Application-Code, oft sogar bevor die Anwendung überhaupt geladen ist. Ablauf:

  1. Environment-Inventur — Auslesen von HOME, USER, PWD; Suche nach .npmrc, .yarnrc, .pnpmfile.cjs, ~/.config/configstore/, GitHub-Tokens (GH_TOKEN, GITHUB_TOKEN), Standard-Pfaden für AWS-, Azure- und GCP-Credentials, ~/.docker/config.json, SSH-Keys.
  2. Validierung gegen Provider-APIs — gefundene Tokens werden gegen die Provider-API auf Gültigkeit geprüft. Inaktive Tokens werden nicht weiter genutzt.
  3. Exfiltration — aktive Credentials werden an einen C2-Endpoint geliefert (in der Mai-Welle: rotierende GitHub-Releases- bzw. Cloudflare-Worker-Endpoints).
  4. Self-Propagation (nur npm-Variante mit gültigem npm-Token) — der Payload listet die Pakete des Token-Owners, lädt das aktuelle Tarball jedes Pakets, injiziert den eigenen preinstall-Hook in das package.json des Tarballs, packt es neu und publiziert mit angehobener Version. Effekt: aus einem kompromittierten Maintainer-Konto werden in Minuten Hunderte Pakete kompromittiert. Das ist der Worm-Charakter.

Die @antv-Welle vom 19. Mai ist das bisher dichteste Beispiel dieses Propagations-Schritts: das atool-Konto hatte direkten Push-Zugriff auf das gesamte @antv-Ökosystem, binnen einer Stunde gingen 323 Pakete in 639 Versionen kompromittiert raus.

Warum npm und Packagist

Die Composer-Ausweitung am 30. April ist strukturell aufschlussreich. Composer hat keinen direkten preinstall-Hook wie npm, aber Composer\Plugin\PluginInterface ist semantisch nahe genug: ein Composer-Plugin wird beim ersten composer install/composer update mit dem Plugin im Tree aktiviert, und activate() ist die Standard-Methode, die als Erstes läuft. Die Angreifer haben das intercom/intercom-php@5.0.2-Tarball so umgebaut, dass die Bibliothek formal wie zuvor aussah (gleiche Klassen, gleiche API), aber zusätzlich ein eingebettetes Composer-Plugin mitlieferte, das in activate() den Worm-Payload startet. Effekt: jeder composer install oder composer update einer Anwendung mit intercom/intercom-php im Tree triggerte den Payload — bei ~20,7 Mio. Lifetime-Installs ist die Angriffsfläche entsprechend.

Die Lehre aus den Schwester-Wellen: jeder Paketmanager mit einem Lifecycle-Hook ist ein Worm-Träger. PyPI ist seit Mai 2026 ebenfalls im Pfad (Mini-Shai-Hulud-Sub-Welle am 11.–12. Mai trifft PyPI mit), RubyGems und Maven sind bisher nicht angegriffen, aber das Pattern lässt sich grundsätzlich übertragen.

Wer ist betroffen?

SetupStatusBedingung
Build-Pipeline mit npm install gegen public npm seit dem 19. Mai, ohne Pinning, @antv-Pakete im TreeVoll betroffen — Token-Rotation PflichtWahrscheinlich wurden Build-Time-Credentials abgegriffen; bei vorhandenem npm-Token auf dem Build-Agent weitere Propagation möglich.
Build-Pipeline mit npm install und striktem Lockfile-Hash-Pinning, Lockfile älter als 19. MaiWahrscheinlich nicht betroffenLockfile-Pinning mit Hash-Sum (integrity: in package-lock.json) verhindert den Bezug der kompromittierten Tarballs.
Build-Pipeline mit composer install gegen Packagist und intercom/intercom-php im Tree, am 30. April zwischen ~20:53 und ~22:37 UTCVoll betroffen — Token-Rotation PflichtComposer-Plugin-Worm-Payload lief beim Install ab.
Build-Pipeline ohne npm-/Composer-Lifecycle-Hooks (z. B. npm install --ignore-scripts)Reduziertes RisikoPayload triggert nicht; sobald die App lokal ohne --ignore-scripts gebaut wird (Entwickler-Workstation), bleibt das Risiko aber bestehen.
Interner Mirror (Verdaccio, Artifactory, Nexus) mit Allow-Liste und manueller Pull-FreigabeGeschütztSolange die Allow-Liste keine kompromittierten Versionen mitgezogen hat und die Pull-Freigabe nicht automatisiert ist.
Interner Mirror im Proxy-Modus (alles automatisch pullen)Teilweise betroffenDer Mirror kann kompromittierte Versionen während der Welle gezogen haben.
Container-Image-Build (Dockerfile mit RUN npm install oder RUN composer install)Voll betroffen, wenn Build-Args Tokens enthaltenBuild-Context-Tokens (NPM_TOKEN, COMPOSER_AUTH) werden vom Worm-Payload abgegriffen; neue Images können infiziert sein.
Wolfi-Distroless- oder Chainguard-Image-Pull (kein Build auf dem Host)Pull-Seite geschütztPull-Schicht ist signaturgeprüft. Wer aus dem Wolfi-Basis-Tag selbst weitere npm install oder composer install in seinem Anwendungs-Layer fährt, hat die Anfälligkeit dort.
Reine Distribution-Pakete (apt, apk, dnf), kein npm/Composer im PfadNicht betroffenDistribution-Schicht ist kein Shai-Hulud-Vektor.

Bei Moselwal: SBOM sauber, Auswirkung null

Unsere produktiven Builds fahren Lockfile-Pinning mit Integrity-Hash, die CI-Gates über npm audit signatures und composer audit, und SBOM-Generation (CycloneDX) als Build-Artefakt. Das @antv-Cluster ist in keiner unserer produktiven Anwendungen im Tree (wir nutzen Recharts und Chart.js, kein @antv). @tanstack/react-query ist im Tree; die SBOM-Auswertung gegen die zur Welle publizierten Versionslisten zeigte, dass die kompromittierten Versionen ausserhalb unseres Pinning-Bandes lagen. Composer-Seite: intercom/intercom-php ist nicht im Tree.

Auswirkungen

Build-Time-Credential-Exfiltration. Der grösste reale Schaden: jeder Build-Agent, der während der Welle eine npm install mit den kompromittierten Versionen im Tree gefahren hat, hat seine Build-Time-Secrets an den C2-Endpoint geliefert. Das umfasst:

Second-Order-Impact: kompromittierte Pakete im eigenen Tree. Wer in den letzten Wochen ein npm- oder Composer-Update gefahren hat und ein kompromittiertes Paket in den dependencies oder devDependencies hat, transportiert den Worm im Code-Tree weiter — bei jedem npm install an einer beliebigen Stelle (CI, Entwickler-Workstation, lokaler Test) feuert der Payload erneut. Lockfile-Cleanup und Force-Reinstall mit gepinnten sauberen Versionen sind notwendig, sobald der Sicherheits-Provider die kompromittierten Versionen markiert hat (Socket, Snyk, Phylum, GitHub Advisory Database — alle pflegen aktuelle Listen).

Third-Order-Impact: kompromittierte Produktions-Artefakte. Wenn der Build-Agent mit Push-Token zur Container-Registry kompromittiert wurde, können neue Images mit injiziertem Code in der eigenen Tag-Linie sein. Image-Rebuild aus sauberer Quelle nach Token-Rotation ist Pflicht.

Nicht-Auswirkung: Runtime-Exploit. Der Worm ist ein Build-Time-Phänomen. Wer einen kompromittierten Tarball gezogen hat, aber nie npm install oder composer install mit Lifecycle-Hooks darauf gefahren hat (z. B. nur das Tarball lokal entpackt und manuell inspiziert), hat den Payload nicht aktiviert.

Mitigation / Sofortmaßnahmen

Pfad 1 — Inventur: lief unsere Build-Pipeline durch die Welle?

 

# CI-Log-Analyse: wann lief der letzte Public-npm-/Composer-Install seit 19.05.?
grep -E "(npm install|yarn install|pnpm install|composer install)" .github/workflows/*.yaml

# Wer im Build-Tree die kompromittierten Pakete hatte:
npm ls --all | grep -E "@antv/|@tanstack/|@mistralai/|@uipath/|@opensearch-project/"
composer show | grep "intercom/intercom-php"

 

Treffer mit Versionen aus dem Welle-Fenster sind das Signal, dass die Pipeline durch die kompromittierten Versionen gelaufen ist.

Pfad 2 — Token-Rotation (auch bei „wahrscheinlich nicht betroffen“)

 

# npm-Tokens auflisten und alte Tokens rotieren
npm token list
npm token revoke <token-id>
npm token create --read-only   # neuer Token für CI-Pull-only-Setup

# GitHub-PAT: über GitHub UI rotieren (Settings → Developer settings → Personal access tokens)
# AWS/Azure/GCP-Credentials: rotieren via IAM / Subscription / IAM Console
# Docker-Registry-Token: rotieren via Registry-Web-UI

 

Pfad 3 — npm install --ignore-scripts als Standard für CI-Pulls

 

# Für Production-Build-Steps (wo der Anwendungs-Code keine Build-Scripts braucht)
npm ci --ignore-scripts

 

--ignore-scripts stoppt den Worm-Payload, weil preinstall nicht ausgeführt wird. Nachteil: Pakete, die zur Install-Zeit Native Modules kompilieren (node-gyp-Pfad), brauchen postinstall-Scripts. In der Praxis bedeutet das: --ignore-scripts geht für Production-Builds, für Dev-Builds muss man es selektiv fahren.

Pfad 4 — npm audit signatures als Pre-Install-Gate

 

# Vor dem Install: Signatur-Provenance prüfen
npm audit signatures

 

npm audit signatures verifiziert die Sigstore-Signaturen der Pakete im Lockfile gegen die npm-Public-Key-Infrastruktur. Nicht alle npm-Pakete sind signiert, aber für signierte Pakete (npm-CLI ab v9.5, Sigstore-Integration) ist es eine harte Provenance-Schicht.

Pfad 5 — Composer-Audit als Pre-Deploy-Gate

 

composer audit
composer audit --format=plain --abandoned=ignore

 

Composer-Audit zieht aus der Friends-Of-PHP-Datenbank sowie aus dem Packagist-Advisory-Stream. Im Pre-Deploy-Gate ist das die Mindest-Linie.

Pfad 6 — Interner Mirror mit Allow-Liste

Für Plattformen, die regelmäßig gegen npm/Packagist bauen: ein interner Mirror (Verdaccio, JFrog Artifactory, Sonatype Nexus) mit Allow-Liste ist die zweite Verteidigungslinie. Der Mirror pullt nur explizit erlaubte Versionen aus dem öffentlichen Registry; neue Versionen kommen erst nach manueller Freigabe in den Mirror. Effekt: zwischen dem Worm-Publish auf public npm und dem Pull in den eigenen Build-Pfad liegt ein menschlicher Freigabe-Schritt.

Detection / Prüfung

Build-Time-Network-Anomalien

Falco-Rule (Kurzform) für verdächtige Outbound-Verbindungen während npm install oder composer install:

 

- rule: Suspicious Network Activity During Package Install
  desc: npm or composer process opens outbound connection to non-registry domain
  condition: >
    evt.type=connect and
    proc.name in (node, php, composer, npm, yarn, pnpm) and
    not fd.sip in (npm_registry_ranges, packagist_registry_ranges, github_releases_ranges)
  output: "Suspicious outbound connection during package install (proc=%proc.name dest=%fd.sip)"
  priority: WARNING

 

Lockfile-Diff-Enforcement in CI

 

# Bei jedem CI-Run: Diff zwischen Lockfile pre- und post-Install muss leer sein
npm ci
git diff --exit-code package-lock.json || (echo "LOCKFILE DRIFT DETECTED"; exit 1)

 

Wenn der Lockfile sich beim npm ci ändert, ist eine Version-Resolution unsauber — ein Hinweis darauf, dass eine andere Version als die gepinnte gezogen wurde.

Token-Aktivitäts-Audit (npm / GitHub / Cloud)

Betreiberempfehlung

Operational Decision Block

Mittelstand (PHP-, Symfony-, Sylius-, Shopware- und Node-Plattformen)

Einmalige Inventur, Token-Rotation, Pre-Install-Gates aktivieren. Wer kein internes Mirror-Setup hat, beginnt mit den Pre-Install-Gates — npm audit signatures und composer audit kosten nichts und fangen die ersten Wellen-Träger ab.

Enterprise (mehrere Mandanten, mehrere Build-Stacks)

Interner Mirror mit Allow-Liste, signaturgeprüfter Pull, SBOM als Build-Artefakt jedes Builds (CycloneDX oder SPDX), zentrale Rotations-Routine für Tokens alle 30 Tage, Build-Agent-Pool ohne dauerhafte Cloud-Credentials (OIDC-Federation, ephemere Tokens).

Kubernetes und containerisierte Setups

Image-Rebuild gegen saubere Versionen nach Token-Rotation. Build-Context im Dockerfile so führen, dass keine NPM_TOKEN- oder COMPOSER_AUTH-Werte als Build-Args durchgereicht werden — stattdessen Multi-Stage-Build mit BuildKit-Secret-Mount:

 

# syntax=docker/dockerfile:1.4
FROM node:20-bullseye AS builder
WORKDIR /app
COPY package*.json ./
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc \
    npm ci --ignore-scripts

FROM gcr.io/distroless/nodejs20-debian12
COPY --from=builder /app /app
CMD ["/app/dist/server.js"]

 

Deklarative Stacks (NixOS, Talos, Flatcar mit Wolfi-Images)

Wolfi-Distroless-Images sind auf der Image-Pull-Seite signaturgeprüft (Cosign + Rekor). Das heisst nicht, dass die npm install- oder composer install-Schicht innerhalb des Wolfi-Builds nicht angreifbar wäre. Deklarative Stacks brauchen denselben Mirror- und Token-Hygiene-Pfad wie klassische Stacks.

Was wir konkret getan haben

Bei uns laufen npm audit signatures und composer audit als CI-Gates über alle produktiven Builds; Lockfile-Pinning mit Integrity-Hash ist Standard. Die Komponenten-Inventur sitzt in der SBOM (CycloneDX), die pro Build automatisch erzeugt wird. Manuelle composer show | grep-Stichproben oder Ad-hoc-composer audit | grep-Läufe pro Mandant gehören nicht zu unserem Vorgehen.

Beim @tanstack- und @mistralai-Cluster am 11. und 12. Mai 2026 hat das Lockfile-Pinning zusammen mit dem CI-Gate die kompromittierten Versionen ausserhalb unseres Pin-Bandes gehalten — keine Welle-Version landete im produktiven Tree. Während der @antv-Welle am 19. Mai war die Auswirkung null: das @antv-Cluster ist in keiner unserer produktiven Anwendungen im Tree. Auf der Composer-Seite war intercom/intercom-php am 30. April ebenfalls nicht im Tree, der CI-Gate war grün; Token-Rotation lief trotzdem als Vorsichtsmaßnahme über die zentrale Rotations-Routine.

Lessons Learned: die Mai-Welle zeigt, dass Shai-Hulud kein Einmal-Ereignis vom September 2025 war, sondern ein laufender Zustand ist. Wer die Hygiene-Schichten aufgebaut hat (Lockfile-Pinning mit Integrity-Hash, --ignore-scripts als Default, Pre-Install-Gates, Rotations-Routine für Tokens, SBOM als Build-Artefakt), hat ruhigere Tage. Wer 2025 die Welle als Ausnahme abgehakt hat, ist 2026 im Reaktionsmodus. Das ist der eigentliche Erkenntniswert dieser Welle, nicht ein einzelner CVE-Pfad.

Technischer Deep-Dive: die Übernahme des atool-Kontos am 19. Mai ging über einen Phishing-Angriff gegen den Maintainer (JFrog-Bericht hat die Details). Schutz auf Maintainer-Seite wäre 2FA oder WebAuthn auf dem npm-Konto gewesen, was atool nicht aktiv hatte. Auf der Konsumenten-Seite — also bei uns als Plattform-Betreiber — zählt nicht, was der Maintainer macht, sondern ob der eigene Pull-Pfad signaturgeprüft und Allow-list-basiert ist. Beide Schichten sind nötig; eine ohne die andere ist Theatersicherheit.

Häufige Fragen zur Shai-Hulud-Mai-2026-Welle

Müssen wir alle npm-Tokens rotieren, auch wenn wir keine @antv-Pakete nutzen?+

Wenn die Build-Pipeline ohne Lockfile-Pinning gegen public npm läuft und seit dem 19. Mai eine npm install-Operation gefahren hat: ja, vorsichtshalber rotieren. Wenn die Pipeline mit striktem npm ci gegen ein altes Lockfile ohne @antv/*-Einträge läuft: technisch nicht nötig. Im Zweifel rotieren — der Aufwand ist niedriger als die Folgen einer übersehenen Kompromittierung.

Wie prüfen wir, ob ein npm ci während der Welle einen kompromittierten Tarball gezogen hat?+

npm ci pullt streng nach Lockfile-Hash. Wenn das Lockfile vor dem 19. Mai erstellt wurde und im Lockfile die alten Versionen mit integrity: sha512-… stehen, kann npm ci keine neueren kompromittierten Versionen ziehen. Wenn das Lockfile nach dem 19. Mai neu generiert wurde (npm install statt npm ci), die version-Felder im Lockfile gegen die Listen der kompromittierten Versionen prüfen (Socket, JFrog).

Schützt eine Pinning-Strategie wie "@antv/g2": "5.2.1" (Exact-Version) gegen den Worm?+

Ja — wenn das zugehörige package-lock.json ebenfalls die Exakt-Version mit Integrity-Hash trägt und die Pipeline npm ci nutzt. Caret-Ranges ("^5.2.1") reichen nicht — sie würden eine kompromittierte 5.2.2 ziehen, wenn der Worm eine angehobene Version unter dem Caret-Range publiziert hat. Lockfile-Hash-Pinning ist der einzige verlässliche Schutz auf dieser Schicht.

Können wir das @antv-Cluster heute überhaupt noch sicher nutzen?+

Stand 22.05.2026: die @antv-Pakete sind in den meisten Fällen wieder auf saubere Versionen geupdated. Wer sie produktiv nutzt, sollte die Pin-Range explizit über die kompromittierten Versionen heben und das Lockfile neu mit integrity:-Hashes generieren. Mittelfristig stellt sich die Frage, ob das @antv-Ökosystem nach diesem Vorfall die 2FA-Hygiene-Disziplin auf Maintainer-Seite hochzieht — wenn ja, ist das Risiko strukturell reduziert; wenn nein, ist die nächste Welle nur eine Zeitfrage.

Ist intercom/intercom-php heute wieder sicher?+

Der 5.0.2-Tag wurde am 30. April zurückgezogen und durch einen sauberen Stand ersetzt; Packagist hat das kompromittierte Tarball entfernt. Wer aber zwischen 30. April ~20:53 und ~22:37 UTC ein composer install mit dem Paket gefahren hat, hat den Payload getriggert und muss die zugehörigen Build-Time-Credentials rotieren. Spätere Installs (nach 22:37 UTC) sind auf der sauberen Version.

Reicht composer audit zur Detection?+

composer audit zieht aus der Friends-Of-PHP-Datenbank — die Datenbank hat den intercom/intercom-php-Vorfall mit einigen Stunden Verzögerung nach dem Erst-Bericht aufgenommen. Wer am 30. April abends im Zeitfenster gebaut hat, hatte den Audit-Treffer noch nicht. composer audit ist Pre-Deploy-Gate, nicht Worm-Echtzeit-Detection. Letztere kommt aus Network-Telemetrie und Token-Audit-Logs.

Fazit

Die @antv-Welle vom 19. Mai ist die bisher dichteste Einzel-Stunden-Welle in der Shai-Hulud-Reihe — 323 Pakete in 639 Versionen über ein einzelnes kompromittiertes Maintainer-Konto. Sie steht nicht für einen Einzelfehler, sondern für einen anhaltenden Zustand: Konto-Übernahme + Self-Propagation + Lifecycle-Hook = ein automatischer Verteiler-Apparat für Credential-Diebstahl auf der ganzen npm-Population. Composer/Packagist steht seit Ende April im selben Spielfeld. Wer eine produktive PHP-, Node- oder Mixed-Stack-Plattform betreibt und in den letzten 18 Monaten die Hygiene-Schichten aufgebaut hat — interner Mirror, Lockfile-Hash-Pinning, --ignore-scripts, npm audit signatures, composer audit, BuildKit-Secret-Mount, Rotations-Routine für Tokens —, hat in dieser Welle wenig bis nichts zu tun. Wer die Welle als Anlass nimmt, jetzt die Hygiene-Schichten aufzubauen, hat einen klaren Bauplan und einen Trigger. Die Frage lautet nicht „kommt die nächste Welle?“ — sie lautet, ob die eigene Pipeline sie reflexiv übersteht oder jedes Mal in den Reaktionsmodus geht.

Bevor die nächste Welle den Build-Agent erwischt

Build-Pipeline-Hygiene einbauen, damit Shai-Hulud nicht mehr scharf trifft?

Wir prüfen, mitigieren und validieren produktive Build-Pipelines gegen die Shai-Hulud-Welle und ihre Folgewellen: Inventur der npm install- und composer install-Pfade, Token-Rotation, Pre-Install-Gates (npm audit signatures, composer audit), Aufbau eines internen Mirrors (Verdaccio, Artifactory, Nexus) mit Allow-Liste, BuildKit-Secret-Mount-Refactor des Dockerfiles, SBOM als Build-Artefakt, Falco-/Tetragon-Telemetrie für Build-Time-Network-Anomalien.

Plattformbetrieb statt Beratung auf Papier: wir übernehmen den Mirror, die Gate-Konfiguration und die Detection — oder begleiten das eigene Team beim ersten Durchlauf. Cross-Reference zu DevSecOps-Services und AI-Ready-Plattformen / Automation.

Termin direkt vereinbaren

Über den Autor

Foto von Kai Ole Hartwig.

Kai Ole Hartwig

Founder · Moselwal Digitalagentur · OnlyOle

Programmiert seit 2002 – autodidaktisch gelernt, 2012 mit KO-Web selbständig gemacht, heute Moselwal. Über 100 Projekte, Fokus auf Security, Performance, Automatisierung und Qualität.