Stačil jeden npm install: ako sa v roku 2026 kradnú API kľúče a ako sa brániť
V roku 2026 bola jednou z najľahších ciest do vašej aplikácie knižnica, ktorú ste si sami nainštalovali. Koncom marca 2026 útočníci prevzali účet hlavného správcu Axiosu, jednej z najpoužívanejších JavaScriptových knižníc, a vydali verzie s trójskym koňom pre Windows, macOS aj Linux (Security Boulevard). Kto v tej chvíli spustil npm install, mohol útočníkom odovzdať kľúče od svojej infraštruktúry.

Cieľom týchto útokov sú takmer vždy prístupové údaje: tokeny ku GitHubu, kľúče ku cloudu a heslá k databázam. A tých leží na očiach viac ako kedykoľvek predtým. Len vo verejných commitoch na GitHube pribudlo za rok 2025 28,65 milióna tajných údajov, o 34 % viac ako rok predtým (GitGuardian). V interných repozitároch je to ešte horšie: aspoň jeden tajný údaj obsahuje 32,2 % z nich (The Hacker News, podľa GitGuardian).
OWASP preto zaradil zlyhania dodávateľského reťazca softvéru v rebríčku Top 10:2025 rovno na tretie miesto (OWASP). Proti väčšine z nich pritom stačí pár nastavení na jedno popoludnie. Kompletný checklist so 105 bodmi pre celú aplikáciu je v článku Spúšťate webovú aplikáciu? Týchto 105 vecí skontrolujte skôr ako útočníci.
01Rok útokov na závislosti
Od septembra 2025 prichádza jeden veľký útok za druhým. Útočníci sa učia rýchlo: keď npm sprísnil tokeny, našli cestu aj cez legitímny publikačný proces.

| Kedy | Čo sa stalo | Zdroj |
|---|---|---|
| Jún až júl 2026 | Ďalšie štyri útoky na npm a PyPI: nový variant červa Shai-Hulud, podvrhnuté platobné SDK, ukradnutý publikačný token a napadnutá CI pipeline | GitGuardian |
| 11. mája 2026 | Škodlivé verzie balíkov TanStack, Mistral AI a UiPath vyšli cez legitímny trusted publishing s platnou identitou GitHub Actions | Wiz |
| 31. marca 2026 | Prevzatý účet správcu Axiosu, dve verzie s trójskym koňom na vzdialený prístup | StepSecurity, CISA |
| Marec 2026 | Skupina TeamPCP napadla bezpečnostný skener Trivy, nástroj KICS a knižnicu LiteLLM | Security Boulevard |
| 9. decembra 2025 | npm zrušil všetky klasické tokeny, prihlásenie platí dve hodiny | GitHub Changelog |
| September 2025 | Samošíriaci sa červ Shai-Hulud napadol viac ako 500 npm balíkov a kradol tokeny ku GitHubu, AWS, Google Cloudu a Azure | CISA |
Májový útok ukázal, že podpis a doložený pôvod balíka nezaručujú, že je verzia bezpečná, pretože útočník vydal škodlivý kód legitímnou cestou. Obrana preto musí mať viac vrstiev.
02Tajné kľúče: kde nesmú byť a kde ich hľadať
Kľúč v kóde je ako kľúč od bytu pod rohožkou. Kým o ňom nikto nevie, nič sa nedeje. Lenže repozitár vidia kolegovia, CI, externé nástroje a po jednej chybe v nastavení aj celý internet. Najrýchlejšie pribúdajú uniknuté kľúče k AI službám: za rok 2025 ich bolo 1 275 105, o 81 % viac ako rok predtým (The Hacker News, podľa GitGuardian).
- Kľúče k AI službám81 %
- Všetky tajné údaje vo verejných commitoch34 %
Rok 2025 oproti roku 2024. GitGuardian, State of Secrets Sprawl 2026 (The Hacker News).
- Žiadne heslo, token ani API kľúč v kóde, v Dockerfile ani v konfigurácii CI. Patria do správcu tajomstiev: AWS Secrets Manager, Google Secret Manager, Azure Key Vault, HashiCorp Vault, Doppler, Infisical alebo 1Password.
- Prejdite celú históriu Gitu. Kľúč zmazaný v novšom commite v histórii zostáva a nájde ho ktokoľvek s prístupom k repozitáru.
- Zapnite automatickú kontrolu skôr, ako kľúč unikne: pre-commit hook (gitleaks, ggshield, TruffleHog) na počítačoch vývojárov a push protection v GitHube alebo GitLabe.
- Dávajte pozor na frontend. Všetko, čo začína NEXT_PUBLIC_, VITE_ alebo REACT_APP_, skončí v JavaScripte v prehliadači a prečíta si to každý. Kľúč k platobnej bráne, k AI službe alebo servisný kľúč Supabase (service_role) tam nesmie byť nikdy.
- Každé prostredie má vlastné kľúče. Produkčné kľúče nemajú vývojári na svojich notebookoch.
- Kľúč má len nevyhnutné oprávnenia. Keď aplikácia potrebuje čítať z jedného bucketu, kľúč nesmie vedieť zmazať celý účet.
- Spíšte si, ako ktorý kľúč vymeniť. Pri incidente nebude čas pátrať, kde všade sa používa.
Ako to overíte
Spustite nad celou históriou repozitára gitleaks: gitleaks git --log-opts="--all". Potom otvorte produkčný web, zobrazte zdrojový kód a v súboroch JavaScriptu vyhľadajte slová key, secret a token.
03Konfigurácia produkcie
Chybná bezpečnostná konfigurácia je v OWASP Top 10:2025 na druhom mieste (OWASP). Typicky ide o súbory a režimy, ktoré zostali zapnuté z vývoja. Útočník ich nájde automatickým skenerom za pár minút.
- Debug režim vypnutý: DEBUG=False v Djangu, APP_DEBUG=false v Laraveli, NODE_ENV=production. Debug stránka prezradí cesty, premenné prostredia a často aj heslá.
- Cez web nie sú dostupné /.git/, /.env, zálohy typu backup.zip či db.sql, phpinfo, /actuator v Spring Boote ani /server-status v Apache.
- Swagger a GraphQL introspekcia sú v produkcii vypnuté alebo za prihlásením.
- Predvolené účty a heslá (admin/admin pri databázach, CMS a administrácii servera) sú zmenené alebo zmazané, ukážkové aplikácie a testovacie endpointy odstránené.
- Výpis obsahu adresárov je vypnutý.
- Hlavičky Server a X-Powered-By neukazujú verziu softvéru.
- CORS povoľuje len vaše konkrétne domény. Zástupný znak * spolu s credentials je chyba, rovnako ako server, ktorý slepo vracia Origin z požiadavky.
- Source mapy nie sú verejné. Nahrajte ich len do nástroja na sledovanie chýb (Sentry), inak prezradia celý zdrojový kód frontendu vrátane komentárov.
Ako to overíte
Otvorte v prehliadači vasa-domena.sk/.env, /.git/config a /debug. Všetky musia vrátiť 404. Nástroj nuclei s verejnými šablónami prejde stovky podobných miest za pár minút.
04Závislosti: ako si nenainštalovať trójskeho koňa
Bežná aplikácia v Node.js stojí na stovkách balíkov, ktoré nikto z tímu nečítal. Každý z nich môže jedného dňa vydať škodlivú verziu. Väčšina útokov sa pritom spustí už pri inštalácii. Zasiahne tak počítače vývojárov a build servery skôr, ako aplikácia vôbec pobeží.
- Commitujte lockfile (package-lock.json, pnpm-lock.yaml, poetry.lock, composer.lock) a v CI inštalujte presne podľa neho: npm ci namiesto npm install.
- Nové verzie nepreberajte hneď. Nastavte odklad niekoľkých dní: v npm voľba min-release-age, v pnpm a Renovate minimumReleaseAge. Dependabot od júla 2026 čaká s novými verziami v predvolenom stave tri dni (GitHub Changelog). Škodlivé verzie spravidla zmiznú z registra v priebehu hodín, pri Axiose išlo zhruba o tri hodiny (UNU C3).
- Obmedzte inštalačné skripty. Väčšina útokov sa spúšťa cez postinstall alebo preinstall. npm od verzie 12 z júla 2026 spúšťa skripty závislostí len pri výslovne povolených balíkoch (allowScripts v package.json, povolenie príkazom npm approve-scripts), pnpm to vie cez allowBuilds a Bun cez trustedDependencies (GitHub Changelog). V starších verziách npm použite voľbu ignore-scripts. Pozor, časť letných útokov sa spúšťala až pri importe balíka, proti nim obmedzenie skriptov nepomôže.
- Zapnite sledovanie zraniteľností: Dependabot alebo Renovate na aktualizácie, npm audit, OSV-Scanner alebo Snyk na známe chyby. Nástroje typu Socket navyše sledujú podozrivé správanie nových verzií, ktoré ešte nemajú žiadne CVE.
- Skôr než pridáte nový balík, overte, že naozaj existuje a je to ten správny. AI asistenti si občas vymyslia názov balíka a útočníci si takéto názvy registrujú vopred (slopsquatting).
- Interné balíky držte vo vlastnom scope a v .npmrc alebo pip.conf určte, odkiaľ sa sťahujú. Inak hrozí zámena s verejným balíkom rovnakého mena (dependency confusion).
- Vygenerujte SBOM, teda zoznam všetkých komponentov, vo formáte CycloneDX alebo SPDX. Keď vyjde ďalšia kritická chyba, do minúty viete, či sa vás týka.
Ako to overíte
Spustite npm audit --omit=dev alebo ekvivalent pre váš jazyk a OSV-Scanner nad lockfilom. Do produkcie nesmie ísť žiadna známa kritická zraniteľnosť bez písomne zdôvodnenej výnimky.
05CI/CD pipeline a kontajnery
Build server má prístup ku všetkému: ku kódu, k tajným kľúčom aj k produkcii. Pre útočníka má preto väčšiu cenu ako samotná aplikácia.
Pipeline
- Akcie v GitHub Actions pripínajte na konkrétny commit (SHA). Tag ako @v4 môže útočník presmerovať na inú verziu.
- Oprávnenia GITHUB_TOKEN nastavte na minimum (permissions: contents: read) a pridávajte len to, čo konkrétny job potrebuje.
- Pozor na spúšťač pull_request_target a na workflow, ktoré pracujú s kódom z cudzích forkov. Kód útočníka potom beží s prístupom k vašim tajomstvám.
- Do cloudu sa z CI prihlasujte cez OIDC s krátkodobými prístupmi. Dlhodobý kľúč uložený v nastavení CI je prvá vec, ktorú škodlivý balík hľadá.
- Produkčné nasadenie chráňte ochranou hlavnej vetvy, povinnou revíziou kódu a schválením nasadenia v prostredí production. Tajomstvá pre produkciu majú byť dostupné len tomuto prostrediu.
- Balíky publikujte cez trusted publishing (OIDC). npm od novembra 2025 obmedzuje platnosť granulárnych tokenov s oprávnením na zápis na najviac 90 dní (GitHub Changelog) a od konca júla 2026 tokeny s obídením dvojfaktorového overenia nesmú spravovať účet, tokeny ani správcov balíkov (GitHub Changelog).
- Vývojárske účty na GitHube, GitLabe, npm a PyPI majú dvojfaktorové overenie odolné proti phishingu. Väčšina prevzatí balíkov sa začala ukradnutým účtom správcu.
Kontajnery
- Používajte minimálne základné obrazy (distroless, Alpine, slim) pripnuté na digest.
- Aplikácia v kontajneri nebeží pod rootom a súborový systém je, kde sa dá, len na čítanie.
- Obrazy skenujte pri builde aj pravidelne potom. Nové zraniteľnosti sa objavujú aj v starých obrazoch.
Ako to overíte
Prejdite priečinok .github/workflows. Každá akcia tretej strany musí byť pripnutá na SHA a každý workflow musí mať nastavený blok permissions. V nastaveniach CI skontrolujte, či tam neležia dlhodobé kľúče ku cloudu.
06Čo robiť, keď kľúč unikne
Počítajte s tým, že sa to raz stane. Rozhoduje, či kľúč zneplatníte za desať minút, alebo za desať dní. Postup si spíšte vopred:
- Kľúč okamžite zneplatnite a vydajte nový. Zmazanie commitu ani prepísanie histórie Gitu nestačí, kópiu už môže mať niekto iný.
- Nový kľúč nasaďte do všetkých prostredí, kde sa používal. Tu sa oplatí zoznam z kapitoly o tajných kľúčoch.
- V logoch poskytovateľa (CloudTrail v AWS, audit log v GitHube, prehľad volaní pri AI službe) zistite, či kľúč medzitým niekto nepoužil.
- Ak áno, riešte to ako bezpečnostný incident: zistite, k akým dátam mal útočník prístup, a zvážte povinnosti podľa GDPR. Lehoty na hlásenie opisuje článok Únik dát stojí v priemere zhruba 4,4 milióna eur.
- Po škodlivej verzii závislosti preverte všetky počítače a build servery, kde prebehla inštalácia, a vymeňte všetky kľúče, ktoré na nich boli. CISA po útoku Shai-Hulud odporučila vymeniť všetky vývojárske prístupové údaje (CISA).
- Zistite, ako kľúč unikol, a zaveďte opatrenie, aby sa to neopakovalo. Najčastejšie chýba pre-commit hook alebo push protection.

07Checklist
Tajné kľúče a konfigurácia
- Sken celej histórie Gitu je bez nálezu, všetky kedykoľvek uniknuté kľúče sú vymenené.
- Tajomstvá sú v správcovi tajomstiev, nie v kóde, Dockerfile ani v konfigurácii CI.
- Vo frontendových premenných nie je žiadny tajný kľúč.
- Produkcia má vlastné kľúče s minimálnymi oprávneniami.
- Pre-commit hook a push protection sú zapnuté.
- Existuje zoznam kľúčov a postup ich výmeny.
- Debug režim je vypnutý.
- Adresy /.env, /.git/, zálohy, phpinfo a /actuator vracajú 404.
- Swagger a GraphQL introspekcia sú vypnuté alebo za prihlásením.
- Predvolené účty a ukážkové aplikácie sú odstránené.
- CORS povoľuje len konkrétne domény.
- Source mapy nie sú verejné.
Závislosti a CI/CD
- Lockfile je v repozitári a CI inštaluje cez npm ci.
- Žiadna známa kritická zraniteľnosť bez zdôvodnenej výnimky.
- Nové verzie sa preberajú s odkladom niekoľkých dní.
- Inštalačné skripty sú obmedzené.
- Existuje SBOM.
- Akcie v GitHub Actions sú pripnuté na SHA, GITHUB_TOKEN má minimálne oprávnenia.
- CI sa do cloudu prihlasuje cez OIDC.
- Nasadenie do produkcie vyžaduje schválenie.
- Účty vývojárov majú dvojfaktorové overenie odolné proti phishingu.
- Kontajnery bežia bez práv roota z minimálneho obrazu.
Oprávnenia a vstupy v kóde rieši článok Stačí zmeniť číslo v adrese, server a cloud článok Váš staging už poznajú.
08Celá séria o bezpečnosti webovej aplikácie
Séria piatich článkov pokrýva celú aplikáciu, od kódu cez server až po povinnosti vedenia:
- Checklist so 105 bodmi pre celú aplikáciu
- Chyby v kóde, cez ktoré unikajú dáta
- API kľúče, závislosti a útoky cez npm (práve čítate)
- Server, HTTPS, cloud, zálohy a logy
- Čo musí zariadiť vedenie: GDPR, NIS2, CRA a pentest
09Časté otázky
Ako zistím, či mi unikol API kľúč?
Spustite nad celou históriou repozitára nástroj gitleaks alebo TruffleHog a zapnite v GitHube alebo GitLabe skenovanie tajomstiev. U poskytovateľa kľúča potom v logu skontrolujte, či ho niekto nepoužil z neznámej IP adresy.
Stačí zmazať kľúč z GitHubu?
Nie. Kľúč zostáva v histórii Gitu a niekto si ho už mohol skopírovať. Vždy ho zneplatnite a vydajte nový.
Môžem dať API kľúč do frontendu?
Len ak je určený ako verejný, napríklad publishable key pri Stripe alebo anon key pri Supabase so zapnutým row-level security. Tajné kľúče k platbám, AI službám alebo databáze do frontendu nikdy nepatria, prečíta si ich každý návštevník.
Stačí npm audit?
Nie. npm audit nájde len problémy, ktoré už niekto nahlásil a zverejnil. Novo napadnutú verziu balíka v prvých hodinách nespozná, preto sa kombinuje s odkladom aktualizácií a nástrojmi, ktoré sledujú správanie balíkov.
Čo bol útok na Axios?
Útok na dodávateľský reťazec z noci na 31. marca 2026. Útočníci prevzali účet hlavného správcu knižnice Axios a vydali dve verzie, ktoré pri inštalácii stiahli trójskeho koňa na vzdialený prístup do Windows, macOS aj Linuxu (Security Boulevard).
Čo je Shai-Hulud?
Samošíriaci sa červ v registri npm. V septembri 2025 napadol viac ako 500 balíkov, kradol tokeny ku GitHubu a cloudom a s ich pomocou sa šíril ďalej (CISA). V roku 2026 sa objavili jeho ďalšie varianty.
10Zdroje
Údaje platia k 27. septembru 2026.
- OWASP Top 10:2025
- CISA: Widespread Supply Chain Compromise Impacting npm Ecosystem
- GitGuardian: State of Secrets Sprawl 2026
- The Hacker News: State of Secrets Sprawl 2026
- GitGuardian: ďalšie štyri ú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
- GitHub Changelog: npm classic tokens revoked
- GitHub Changelog: npm v12, inštalačné skripty len pre povolené balíky
- GitHub Changelog: obmedzenie tokenov s obídením 2FA
- StepSecurity: Axios compromised on npm