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.
- dubna 2026 byl poprvé zaznamenán malware Shai-Hulud — útok na
@bitwarden/clina 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. - 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— commit8bf051251ec3b973e39a313547e53421a2f8d2f6RedHatInsights/javascript-clients— commit608d01124cd6b5b8c55888e984b4c4d9b06fa686RedHatInsights/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í:
- Numerické pole znaků, ze kterého se rekonstruuje JavaScript
- ROT-style transform pro zakrytí před statickými skenery
- Dešifrování dvou AES-128-GCM blobů (hardcoded klíče:
fe0d71d57ecf4fa0a433185bf59a03f5,f5e5dca9b725ec18514c4b322ed35d2b) - Dočasné uložení payloadu do
/tmp/p<random>.jsa 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
curlabunponpm 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-scriptspro 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: writekombinované sbranches: ['*']a spuštěním externího skriptu
IOC — hardcoded hodnoty identifikované výzkumníky
AES-128-GCM klíče (JFrog):
fe0d71d57ecf4fa0a433185bf59a03f5f5e5dca9b725ec18514c4b322ed35d2b
GitHub dead-drop marker:
- Repozitory description:
Miasma: The Spreading Blight
Bun verze použitá pro bootstrap:
bun-v1.3.13
Zdroje:
- JFrog Security Research: Shai-Hulud – Miasma: The Spreading Blight Hits Red Hat npm Packages
- Wiz Research: Miasma: Supply Chain Attack Targeting RedHat npm Packages
- Socket Security: Mini Shai-Hulud Campaign Hits Red Hat Cloud Services npm Packages
- Aikido Security: Red Hat npm Packages Compromised
- OX Security: New Shai-Hulud hits npm: @redhat-cloud-services Compromised
- Red Hat RHSB-2026-006