Programování

Bezpečnost závislostí – npm audit, pip-audit, Dependabot

Jak hlídat zranitelnosti v knihovnách – npm audit, pip-audit, composer audit, Dependabot, lockfily a obrana proti útokům na supply chain.

12. 10. 2026 · 4 min čtení

Typický webový projekt má desítky přímých závislostí a stovky až tisíce nepřímých. Každá z nich je kód, kterému věříte, aniž byste ho četli. Když se v některé objeví zranitelnost, je vaše aplikace zranitelná také. Dobrá zpráva: kontrolu lze z velké části automatizovat.

Dva druhy rizika

  1. Známé zranitelnosti (CVE) v legitimních balíčcích. Řešení: auditní nástroje a aktualizace.
  2. Útoky na dodavatelský řetězec (supply chain) – škodlivý balíček s podobným názvem (typosquatting), převzatý účet autora, škodlivý postinstall skript. Řešení: lockfily, opatrnost při přidávání balíčků, omezení instalačních skriptů.

Audit podle ekosystému

Node.js – npm audit

npm audit                  # přehled zranitelností
npm audit --omit=dev       # jen produkční závislosti
npm audit fix              # opraví, co jde bez změny major verze
npm audit --audit-level=high   # nenulový exit code jen od "high" výš (pro CI)

npm audit fix --force může nainstalovat novou major verzi a rozbít aplikaci. Používejte ho jen vědomě a s testy.

pnpm má pnpm audit, Yarn (Berry) yarn npm audit.

Python – pip-audit

pip install pip-audit
pip-audit                       # aktuální prostředí
pip-audit -r requirements.txt   # podle souboru
pip-audit --fix                 # pokusí se aktualizovat zranitelné balíčky

pip-audit čerpá z databáze PyPI / OSV. Spouštějte ho ve virtuálním prostředí projektu, jinak kontroluje systémové balíčky.

PHP – Composer

composer audit

Dostupné od Composeru 2.4. Kontroluje balíčky z composer.lock.

Další

  • Go: govulncheck ./... – navíc zjistí, zda váš kód zranitelnou funkci skutečně volá.
  • Rust: cargo audit (balíček cargo-audit).
  • Univerzálně: osv-scanner od Googlu umí lockfily mnoha ekosystémů, Trivy skenuje i Docker image.
osv-scanner scan source -r .     # osv-scanner v2; ve v1 stačí "osv-scanner -r ."
trivy image moje-aplikace:latest

Automatické aktualizace: Dependabot a Renovate

Dependabot (GitHub)

V nastavení repozitáře (Settings → Code security) zapněte Dependabot alerts a security updates. Pro pravidelné aktualizace přidejte soubor .github/dependabot.yml:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      minor-and-patch:
        update-types: ["minor", "patch"]
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"

Skupiny (groups) sloučí drobné aktualizace do jednoho PR, takže vás Dependabot nezahltí.

Renovate

Alternativa s podrobnější konfigurací, funguje i na GitLabu a dalších platformách. Umí automaticky mergovat aktualizace, které projdou testy, například jen patch verze dev závislostí.

Obojí má smysl jen tehdy, když máte testy v CI. Bez nich je automatický PR s aktualizací loterie.

Lockfily jsou povinné

Lockfile (package-lock.json, pnpm-lock.yaml, poetry.lock, uv.lock, composer.lock) zajistí, že všude nainstalujete přesně stejné verze.

  • Lockfile commitujte (u aplikací vždy).
  • V CI a na produkci instalujte z lockfilu:
npm ci                     # ne npm install
pip install -r requirements.txt --require-hashes   # s hashi z pip-compile --generate-hashes
composer install --no-dev  # ne composer update

npm ci selže, pokud package.json a lockfile nesedí – to je žádoucí.

Obrana proti škodlivým balíčkům

  • Kontrolujte název. reqeusts místo requests, crossenv místo cross-env – takové balíčky v minulosti opravdu existovaly a kradly data.
  • Před přidáním balíčku se podívejte: počet stažení, datum poslední verze, odkaz na repozitář, počet správců. Malá utilita na pár řádků se často vyplatí napsat sami.
  • Instalační skripty: npm install --ignore-scripts zabrání spuštění postinstall. Lze nastavit globálně v .npmrc (ignore-scripts=true), ale některé balíčky (nativní moduly) pak nebudou fungovat. pnpm od verze 10 ve výchozím stavu instalační skripty závislostí nespouští a povolují se explicitně.
  • Pozor na návrhy AI. Asistent může navrhnout balíček, který neexistuje. Útočníci takové „vymyšlené“ názvy registrují (tzv. slopsquatting). Před instalací si ověřte, že balíček existuje a je to ten správný.

Jak s nálezy pracovat

Ne každá zranitelnost je pro vás kritická:

  1. Je zranitelný balíček v produkci, nebo jen v dev nástrojích (build, testy)?
  2. Používáte zranitelnou funkci? ReDoS v parseru, který zpracovává jen vaše konfigurační soubory, je menší riziko než v parseru uživatelského vstupu.
  3. Existuje opravená verze? Pokud ne a riziko je reálné, hledejte alternativu nebo dočasné zmírnění.

Pro výjimky zaznamenejte důvod, ať se k tomu tým nemusí vracet. pip-audit umí --ignore-vuln <ID>, u npm lze nepřímou závislost přepsat pomocí overrides v package.json:

{
  "overrides": {
    "semver": "^7.5.2"
  }
}

Minimální nastavení pro každý projekt

  • [ ] Lockfile v repozitáři, instalace přes npm ci / composer install.
  • [ ] Audit v CI s prahem high.
  • [ ] Dependabot nebo Renovate zapnutý, včetně GitHub Actions.
  • [ ] Testy, které běží na každý PR s aktualizací.
  • [ ] Pravidelná (třeba měsíční) kontrola výjimek a zastaralých balíčků (npm outdated, pip list --outdated).