Software supply chain
Beperk de risico's bij het werken met externe software en libraries, door alle wijzigingen in dependencies te controleren en in te grijpen wanneer nieuwe kwetsbaarheden bekend zijn.
Veiligheid van dependencies
Vermijd installeren van onveilige dependencies. Wanneer kan dit gebeuren?
- Je installeert een nieuwe dependency, die onveilig is.
- Je installeert in een update die onveilig is.
- Je installeert een bepaald versienummer, waarvan de code stiekem achteraf is aangepast.
Een dependency kan op meerdere manieren een onveilig zijn, bijvoorbeeld:
- De dependency voert een aanval uit tijdens de installatie.
- De dependency voert een aanval uit in de continuous integration of continuous delivery pipeline.
- De dependency voert een aanval uit tijdens het uitvoeren van scripts door developers.
- De dependency voert een aanval uit tijdens het uitvoeren van scripts in productie.
Controleer updates
Gebruik exacte versienummers voor dependencies. Dus niet "versie 9 of nieuwer" of "versie 4.9.3 of hoger, zolang het maar begint met '4.9'":
codevoorbeeld{
"devDependencies": {
"eslint": "^9.0.0",
"typescript": "~4.9.3"
}
}
Wel goed:
codevoorbeeld{
"devDependencies": {
"eslint": "9.0.0",
"typescript": "4.9.3"
}
}
Updates installeer je dan zelf, en wijzigingen aan dependencies gaan dan via de gebruikelijke controles.
Controleer wijzigingen
Gebruik package locks en accepteer alleen wijzigingen aan dependencies van vertrouwde bronnen. Je kunt in GitHub CODEOWNERS gebruiken om wijzigingen aan dependencies verplicht te laten reviewen door iemand met de juiste ervaring, door bijvoorbeeld pnpm-lock.yaml een code owner te geven.
Beperk de rechten
Voer geen scripts postinstall scripts uit met npm, pnpm of yarn. Gebruik ignore-scripts=true in .npmrc om standaard lifecycle scripts te negeren. Je kunt ook npm --ignore-scripts, pnpm --ignore-scripts of yarn --ignore-scripts, maar het risico is groot dat dit een keer wordt vergeten.
Stel geen secrets en environment variables beschikbaar, in CI/CD pipelines zoals GitHub Actions, wanneer het nog niet nodig is. Bijvoorbeeld: eerst install zonder access tokens, en pas bij release met access tokens met schrijfrechten naar Git, container registries en package registries.
Bekende kwetsbaarheden vermijden en oplossen
Gebruik pnpm audit in de Continuous Integration pipeline om te voorkomen dat pnpm install wordt uitgevoerd wanneer er critical vulnerabilities zijn.
Controleer periodiek in GitHub Dependabot alerts of er kwetsbaarheden bekend zijn waarvoor je actie moet ondernemen.
Geen runtime dependencies
Bijvoorbeeld:
- Gebruik
pnpm installalleen in de buid pipeline, niet tijdens het uitvoeren van de software. - Installeer dependencies via npm, in plaats van bestanden inladen via een CDN.
- Wanneer een CDN gebruiken nodig is, gebruik dan in elk geval "version pinning" en bij voorkeur ook Subresource Integrity (SRI).