Přeskočit na obsah
Bezpečnost

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.

Obálka článku API klíče a npm: 28,65 mil. tajných údajů na GitHubu za rok 2025, o 81 % víc uniklých klíčů k AI službám, dodavatelský řetězec na 3. místě OWASP

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.

Rok útoků přes npm: září 2025 červ Shai-Hulud, 9. 12. 2025 konec klasických tokenů, březen 2026 TeamPCP, 31. 3. 2026 Axios, duben 2026 další kampaně Shai-Hulud, 11. 5. 2026 TanStack, Mistral AI a UiPath, červen až červenec 2026 další čtyři útoky
Velké útoky na npm od září 2025.
KdyCo se staloZdroj
Červen až červenec 2026Další čtyři útoky na npm a PyPI: nová varianta červa Shai-Hulud, podvržené platební SDK, ukradený publikační token a napadená CI pipelineGitGuardian
11. května 2026Škodlivé verze balíčků TanStack, Mistral AI a UiPath vyšly přes legitimní trusted publishing s platnou identitou GitHub ActionsWiz
Duben 2026Kampaně Shai-Hulud: The Third Coming a Mini Shai-HuludUnit 42
31. března 2026Převzatý účet správce Axiosu, dvě verze s trojským koněm pro vzdálený přístupStepSecurity, CISA
Březen 2026Skupina TeamPCP napadla bezpečnostní skener Trivy, nástroj KICS a knihovnu LiteLLMSecurity Boulevard
9. prosince 2025npm zrušil všechny klasické tokeny, přihlášení platí dvě hodinyGitHub Changelog
Září 2025Samošířící červ Shai-Hulud napadl přes 500 npm balíčků a kradl tokeny ke GitHubu, AWS, Google Cloudu a AzureCISA

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).

Meziroční nárůst uniklých tajných údajů
  • 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).

  1. Žá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.
  2. 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.
  3. 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.
  4. 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.
  5. Každé prostředí má vlastní klíče. Produkční klíče nemají vývojáři na svých noteboocích.
  6. Klíč má jen nezbytná oprávnění. Když aplikace potřebuje číst z jednoho bucketu, klíč nesmí umět smazat celý účet.
  7. 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.

  1. 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.
  2. 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.
  3. Swagger a GraphQL introspekce jsou na produkci vypnuté, nebo za přihlášením.
  4. 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é.
  5. Výpis obsahu adresářů je vypnutý.
  6. Hlavičky Server a X-Powered-By neukazují verzi softwaru.
  7. 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.
  8. 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ěží.

  1. 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.
  2. 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).
  3. 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.
  4. 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.
  5. 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).
  6. 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).
  7. 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

  1. 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.
  2. Oprávnění GITHUB_TOKEN nastavte na minimum (permissions: contents: read) a přidávejte jen to, co konkrétní job potřebuje.
  3. 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.
  4. 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á.
  5. 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í.
  6. 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).
  7. 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

  1. Používejte minimální základní obrazy (distroless, Alpine, slim) připnuté na digest.
  2. Aplikace v kontejneru neběží pod rootem a souborový systém je, kde to jde, jen pro čtení.
  3. 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:

  1. 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ý.
  2. Nový klíč nasaďte do všech prostředí, kde se používal. Tady se vyplatí seznam z kapitoly o tajných klíčích.
  3. 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.
  4. 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č.
  5. 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).
  6. Zjistěte, jak klíč unikl, a zaveďte opatření, aby se to neopakovalo. Nejčastěji chybí pre-commit hook nebo push protection.
Šest kroků, když klíč unikne: zneplatnit a vydat nový, nasadit ho všude, projít logy poskytovatele, při zneužití řešit incident, po škodlivé závislosti vyměnit vše, zjistit, jak klíč unikl
Postup si sepište dřív, než ho budete potřebovat.

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í:

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.

Tým LISTIFYWeby, aplikace a marketing z Prahy od roku 2008

Další články

Všechny články →
Bezpečnost27. 9. 2026 · 11 min čtení

Spouštíte webovou aplikaci? Těchto 105 věcí zkontrolujte dřív než útočníci

Bezpečnost27. 9. 2026 · 15 min čtení

Stačí změnit číslo v adrese: chyby v kódu, přes které unikají data

Bezpečnost27. 9. 2026 · 11 min čtení

Váš staging už znají. Jak zabezpečit server, HTTPS a cloud před spuštěním webu

Sdílet stránku

E-mailem

Máte nápad? Za 15 minut víte, jak na něj.

Krátký hovor, žádná prezentace. Řekneme vám, co dává smysl, kolik to bude stát a jak rychle to zvládneme.

+420 771 166 199Po až Pá 8:30 až 16:00 · info@listify.cool

Kdy vám máme zavolat?

Vyberte den a časové rozmezí. Zavoláme my, hovor trvá zhruba 15 minut.

Den