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.
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
- Známé zranitelnosti (CVE) v legitimních balíčcích. Řešení: auditní nástroje a aktualizace.
- Útoky na dodavatelský řetězec (supply chain) – škodlivý balíček s podobným názvem (typosquatting), převzatý účet autora, škodlivý
postinstallskript. Ř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íčekcargo-audit). - Univerzálně:
osv-scannerod 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.
reqeustsmístorequests,crossenvmístocross-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-scriptszabrá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á:
- Je zranitelný balíček v produkci, nebo jen v dev nástrojích (build, testy)?
- 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.
- 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).