Stačil jeden npm install: jak se v roce 2026 kradou API klíče a jak se bránit
Útočníci letos nemuseli hackovat vaši aplikaci. Stačilo, když jste si nainstalovali knihovnu, kterou ovládli oni. Na konci března 2026 převzali účet hlavního správce Axiosu, jedné z nejpoužívanějších JavaScriptových knihoven, a vydali verze s trojským koněm pro Windows, macOS i Linux (Security Boulevard). Kdo v tu chvíli spustil npm install, mohl útočníkům předat klíče od své infrastruktury.

Cílem těchto útoků jsou skoro vždy přístupové údaje: tokeny ke GitHubu, klíče ke cloudu a hesla k databázím. A těch leží na očích víc než kdy dřív. Jen ve veřejných commitech na GitHubu přibylo za rok 2025 28,65 milionu tajných údajů, o 34 % víc než rok předtím (GitGuardian). V interních repozitářích je to ještě horší: nějaký tajný údaj obsahuje 32,2 % z nich (The Hacker News, podle GitGuardian).
OWASP proto zařadil selhání dodavatelského řetězce softwaru v žebříčku Top 10:2025 rovnou na třetí místo (OWASP). Proti většině z nich přitom stačí pár nastavení na jedno odpoledne. Kompletní checklist se 105 body pro celou aplikaci je v článku Spouštíte webovou aplikaci? Těchto 105 věcí zkontrolujte dřív než útočníci.
01Rok útoků na závislosti
Od září 2025 přichází jeden velký útok za druhým. Útočníci se učí rychle: když npm zpřísnil tokeny, našli cestu i přes legitimní publikační proces.

| Kdy | Co se stalo | Zdroj |
|---|---|---|
| Červen až červenec 2026 | Další čtyři útoky na npm a PyPI: nová varianta červa Shai-Hulud, podvržené platební SDK, ukradený publikační token a napadená CI pipeline | GitGuardian |
| 11. května 2026 | Škodlivé verze balíčků TanStack, Mistral AI a UiPath vyšly přes legitimní trusted publishing s platnou identitou GitHub Actions | Wiz |
| Duben 2026 | Kampaně Shai-Hulud: The Third Coming a Mini Shai-Hulud | Unit 42 |
| 31. března 2026 | Převzatý účet správce Axiosu, dvě verze s trojským koněm pro vzdálený přístup | StepSecurity, CISA |
| Březen 2026 | Skupina TeamPCP napadla bezpečnostní skener Trivy, nástroj KICS a knihovnu LiteLLM | Security Boulevard |
| 9. prosince 2025 | npm zrušil všechny klasické tokeny, přihlášení platí dvě hodiny | GitHub Changelog |
| Září 2025 | Samošířící červ Shai-Hulud napadl přes 500 npm balíčků a kradl tokeny ke GitHubu, AWS, Google Cloudu a Azure | CISA |
Z květnového útoku plyne nepříjemné poučení. Podpis a doložený původ balíčku nezaručují, že je verze bezpečná, protože útočník vydal škodlivý kód legitimní cestou. Obrana proto musí mít víc vrstev.
02Tajné klíče: kde nesmí být a kde je hledat
Klíč v kódu je jako klíč od bytu pod rohožkou. Dokud o něm nikdo neví, nic se neděje. Jenže repozitář vidí kolegové, CI, externí nástroje a po jednom omylu v nastavení i celý internet. Nejrychleji přibývají uniklé klíče k AI službám: za rok 2025 jich bylo 1 275 105, o 81 % víc než rok předtím (The Hacker News, podle GitGuardian).
- Klíče k AI službám81 %
- Všechny tajné údaje ve veřejných commitech34 %
Rok 2025 proti roku 2024. GitGuardian, State of Secrets Sprawl 2026 (The Hacker News).
- Žádné heslo, token ani API klíč v kódu, v Dockerfile ani v konfiguraci CI. Patří do správce tajemství: AWS Secrets Manager, Google Secret Manager, Azure Key Vault, HashiCorp Vault, Doppler, Infisical nebo 1Password.
- Projděte celou historii Gitu. Klíč smazaný v novějším commitu v historii zůstává a kdokoli s přístupem k repozitáři ho najde.
- Zapněte automatickou kontrolu dřív, než klíč unikne: pre-commit hook (gitleaks, ggshield, TruffleHog) na počítačích vývojářů a push protection v GitHubu nebo GitLabu.
- Hlídejte frontend. Všechno, co začíná NEXT_PUBLIC_, VITE_ nebo REACT_APP_, skončí v JavaScriptu v prohlížeči a přečte si to každý. Klíč k platební bráně, k AI službě nebo servisní klíč Supabase (service_role) tam nesmí být nikdy.
- Každé prostředí má vlastní klíče. Produkční klíče nemají vývojáři na svých noteboocích.
- Klíč má jen nezbytná oprávnění. Když aplikace potřebuje číst z jednoho bucketu, klíč nesmí umět smazat celý účet.
- Sepište si, jak který klíč vyměnit. Při incidentu nebude čas pátrat, kde všude se používá.
Jak to ověříte
Pusťte nad celou historií repozitáře gitleaks: gitleaks git --log-opts="--all". Pak otevřete produkční web, dejte zobrazit zdrojový kód a v souborech JavaScriptu vyhledejte slova key, secret a token.
03Konfigurace produkce
Chybná bezpečnostní konfigurace je v OWASP Top 10:2025 na druhém místě (OWASP). Typicky jde o soubory a režimy, které zůstaly zapnuté z vývoje. Útočník je najde automatickým skenerem za pár minut.
- Debug režim vypnutý: DEBUG=False v Djangu, APP_DEBUG=false v Laravelu, NODE_ENV=production. Debug stránka prozradí cesty, proměnné prostředí a často i hesla.
- Přes web nejsou dostupné /.git/, /.env, zálohy typu backup.zip nebo db.sql, phpinfo, /actuator ve Spring Boot ani /server-status v Apache.
- Swagger a GraphQL introspekce jsou na produkci vypnuté, nebo za přihlášením.
- Výchozí účty a hesla (admin/admin u databází, CMS a administrací serveru) jsou změněné nebo smazané, ukázkové aplikace a testovací endpointy odstraněné.
- Výpis obsahu adresářů je vypnutý.
- Hlavičky Server a X-Powered-By neukazují verzi softwaru.
- CORS povoluje jen vaše konkrétní domény. Zástupný znak \* spolu s credentials je chyba, stejně jako server, který slepě vrací Origin z požadavku.
- Source mapy na produkci nezveřejňujte, nahrajte je jen do nástroje na sledování chyb (Sentry). Jinak prozradí celý zdrojový kód frontendu včetně komentářů.
Jak to ověříte
Otevřete v prohlížeči vaše-domena.cz/.env, /.git/config a /debug. Všechny musí vrátit 404. Nástroj nuclei s veřejnými šablonami projde stovky podobných míst za pár minut.
04Závislosti: jak nenainstalovat trojského koně
Průměrná aplikace v Node.js dnes stojí na stovkách balíčků, které nikdo z týmu nečetl. Každý z nich může jednoho dne vydat škodlivou verzi. Většina útoků se přitom spustí už při instalaci. Zasáhne tak počítače vývojářů a build servery dřív, než aplikace vůbec poběží.
- Commitujte lockfile (package-lock.json, pnpm-lock.yaml, poetry.lock, composer.lock) a v CI instalujte přesně podle něj: npm ci místo npm install.
- Nové verze nepřebírejte hned. Nastavte odklad několika dní: v npm volba min-release-age, v pnpm a Renovate minimumReleaseAge. Dependabot od července 2026 čeká s novými verzemi ve výchozím stavu tři dny (GitHub Changelog). Škodlivé verze obvykle zmizí z registru během hodin, u Axiosu šlo zhruba o tři hodiny (UNU C3).
- Omezte instalační skripty. Většina útoků se spouští přes postinstall nebo preinstall. npm od verze 12 z července 2026 spouští skripty závislostí jen u výslovně povolených balíčků (allowScripts v package.json, povolení příkazem npm approve-scripts), pnpm to umí přes allowBuilds a Bun přes trustedDependencies (GitHub Changelog). Ve starších verzích npm použijte volbu ignore-scripts. Pozor, část letních útoků se spouštěla až při importu balíčku, proti nim omezení skriptů nepomůže.
- Zapněte hlídání zranitelností: Dependabot nebo Renovate pro aktualizace, npm audit, OSV-Scanner nebo Snyk pro známé chyby. Nástroje typu Socket navíc sledují podezřelé chování nových verzí, které ještě nemají žádné CVE.
- Před přidáním balíčku ověřte, že skutečně existuje a je to ten správný. AI asistenti si občas vymyslí název balíčku a útočníci takové názvy registrují dopředu (slopsquatting).
- Interní balíčky držte ve vlastním scope a v .npmrc nebo pip.conf určete, odkud se stahují. Jinak hrozí záměna s veřejným balíčkem stejného jména (dependency confusion).
- Vygenerujte SBOM, tedy seznam všech komponent, ve formátu CycloneDX nebo SPDX. Když vyjde další kritická chyba, za minutu víte, jestli se vás týká.
Jak to ověříte
Spusťte npm audit --omit=dev nebo ekvivalent pro váš jazyk a OSV-Scanner nad lockfilem. Na produkci nesmí jít žádná známá kritická zranitelnost bez písemně zdůvodněné výjimky.
05CI/CD pipeline a kontejnery
Build server má přístup ke všemu: ke kódu, k tajným klíčům i k produkci. Pro útočníka je proto cennější než samotná aplikace.
Pipeline
- Akce v GitHub Actions připínejte na konkrétní commit (SHA). Tag jako @v4 může útočník přesměrovat na jinou verzi.
- Oprávnění GITHUB_TOKEN nastavte na minimum (permissions: contents: read) a přidávejte jen to, co konkrétní job potřebuje.
- Pozor na spouštěč pull_request_target a na workflow, které pracují s kódem z cizích forků. Kód útočníka pak běží s přístupem k vašim tajemstvím.
- Do cloudu se z CI přihlašujte přes OIDC s krátkodobými přístupy. Dlouhodobý klíč uložený v nastavení CI je první věc, kterou škodlivý balíček hledá.
- Produkční nasazení chraňte ochranou hlavní větve, povinnou revizí kódu a schválením nasazení v prostředí production. Tajemství pro produkci mají být dostupná jen tomuto prostředí.
- Balíčky publikujte přes trusted publishing (OIDC). npm od listopadu 2025 omezuje platnost granulárních tokenů s oprávněním k zápisu na nejvýš 90 dní (GitHub Changelog) a od konce července 2026 tokeny s obejitím dvoufázového ověření nesmějí spravovat účet, tokeny ani správce balíčků (GitHub Changelog).
- Vývojářské účty na GitHubu, GitLabu, npm a PyPI mají dvoufázové ověření odolné proti phishingu. Většina převzetí balíčků začala ukradeným účtem správce.
Kontejnery
- Používejte minimální základní obrazy (distroless, Alpine, slim) připnuté na digest.
- Aplikace v kontejneru neběží pod rootem a souborový systém je, kde to jde, jen pro čtení.
- Obrazy skenujte při buildu i pravidelně potom. Nové zranitelnosti se objevují i ve starých obrazech.
Jak to ověříte
Projděte složku .github/workflows. Každá akce třetí strany musí být připnutá na SHA a každý workflow musí mít nastavený blok permissions. V nastavení CI zkontrolujte, jestli tam neleží dlouhodobé klíče ke cloudu.
06Co dělat, když klíč unikne
Počítejte s tím, že se to jednou stane. Rozhoduje, jestli klíč zneplatníte za deset minut, nebo za deset dní. Postup si sepište dopředu:
- Klíč okamžitě zneplatněte a vydejte nový. Smazání commitu ani přepsání historie Gitu nestačí, kopie už může mít někdo jiný.
- Nový klíč nasaďte do všech prostředí, kde se používal. Tady se vyplatí seznam z kapitoly o tajných klíčích.
- V logech poskytovatele (CloudTrail v AWS, audit log v GitHubu, přehled volání u AI služby) zjistěte, jestli někdo klíč mezitím použil.
- Pokud ano, řešte to jako bezpečnostní incident: zjistěte, k jakým datům měl útočník přístup, a zvažte povinnosti podle GDPR. Lhůty pro hlášení popisuje článek Únik dat stojí průměrně 107 milionů Kč.
- Po škodlivé verzi závislosti prověřte všechny počítače a build servery, kde proběhla instalace, a vyměňte všechny klíče, které na nich byly. CISA po útoku Shai-Hulud doporučila vyměnit všechny vývojářské přístupové údaje (CISA).
- Zjistěte, jak klíč unikl, a zaveďte opatření, aby se to neopakovalo. Nejčastěji chybí pre-commit hook nebo push protection.

07Checklist
Tajné klíče a konfigurace
- Scan celé historie Gitu bez nálezu, všechny kdy uniklé klíče jsou vyměněné.
- Tajemství jsou ve správci tajemství, ne v kódu, Dockerfile ani konfiguraci CI.
- Ve frontendových proměnných není žádný tajný klíč.
- Produkce má vlastní klíče s minimálními oprávněními.
- Pre-commit hook a push protection jsou zapnuté.
- Existuje seznam klíčů a postup jejich výměny.
- Debug režim je vypnutý.
- Adresy /.env, /.git/, zálohy, phpinfo a /actuator vracejí 404.
- Swagger a GraphQL introspekce jsou vypnuté nebo za přihlášením.
- Výchozí účty a ukázkové aplikace jsou odstraněné.
- CORS povoluje jen konkrétní domény.
- Source mapy nejsou veřejné.
Závislosti a CI/CD
- Lockfile je v repozitáři a CI instaluje přes npm ci.
- Žádná známá kritická zranitelnost bez zdůvodněné výjimky.
- Nové verze se přebírají s odkladem několika dní.
- Instalační skripty jsou omezené.
- Existuje SBOM.
- Akce v GitHub Actions jsou připnuté na SHA, GITHUB_TOKEN má minimální oprávnění.
- CI se do cloudu přihlašuje přes OIDC.
- Nasazení do produkce vyžaduje schválení.
- Účty vývojářů mají dvoufázové ověření odolné proti phishingu.
- Kontejnery běží bez práv roota z minimálního obrazu.
Oprávnění a vstupy v kódu řeší článek Stačí změnit číslo v adrese, server a cloud článek Váš staging už znají.
08Celá série o bezpečnosti webové aplikace
Série pěti článků pokrývá celou aplikaci, od kódu přes server až po povinnosti vedení:
- Checklist se 105 body pro celou aplikaci
- Chyby v kódu, přes které unikají data
- API klíče, závislosti a útoky přes npm (právě čtete)
- Server, HTTPS, cloud, zálohy a logy
- Co musí zařídit vedení: GDPR, NIS2, CRA a pentest
09Časté otázky
Jak zjistím, jestli mi unikl API klíč?
Pusťte nad celou historií repozitáře nástroj gitleaks nebo TruffleHog a zapněte v GitHubu nebo GitLabu skenování tajemství. U poskytovatele klíče pak v logu zkontrolujte, jestli ho někdo nepoužil z neznámé IP adresy.
Stačí smazat klíč z GitHubu?
Ne. Klíč zůstává v historii Gitu a mohl si ho už někdo zkopírovat. Vždy ho zneplatněte a vydejte nový.
Můžu dát API klíč do frontendu?
Jen pokud je určený jako veřejný, například publishable key u Stripe nebo anon key u Supabase se zapnutým row-level security. Tajné klíče k platbám, AI službám nebo databázi do frontendu nikdy nepatří, přečte si je každý návštěvník.
Stačí npm audit?
Ne. npm audit najde jen problémy, které už někdo nahlásil a zveřejnil. Nově napadenou verzi balíčku v prvních hodinách nepozná, proto se kombinuje s odkladem aktualizací a nástroji, které sledují chování balíčků.
Co byl útok na Axios?
Útok na dodavatelský řetězec z noci na 31. března 2026. Útočníci převzali účet hlavního správce knihovny Axios a vydali dvě verze, které při instalaci stáhly trojského koně pro vzdálený přístup na Windows, macOS i Linux (Security Boulevard).
Co je Shai-Hulud?
Samošířící červ v registru npm. V září 2025 napadl přes 500 balíčků, kradl tokeny ke GitHubu a cloudům a s jejich pomocí se šířil dál (CISA). V roce 2026 se objevily jeho další varianty.
10Zdroje
Údaje platí k 27. září 2026.
- OWASP Top 10:2025 (česky)
- CISA: Widespread Supply Chain Compromise Impacting npm Ecosystem
- GitGuardian: State of Secrets Sprawl 2026
- The Hacker News: 9 poznatků ze State of Secrets Sprawl 2026
- GitGuardian: čtyři další útoky na npm a PyPI
- Security Boulevard: Supply Chain Attacks Surge in March 2026
- UNU C3: The Axios npm Supply Chain Attack
- Wiz: TanStack and other packages compromised
- Unit 42: Monitoring npm supply chain attacks
- GitHub Changelog: npm classic tokens revoked
- GitHub Changelog: npm v12, instalační skripty jen pro povolené balíčky
- GitHub Changelog: omezení tokenů s obejitím 2FA
- StepSecurity: Axios compromised on npm