The code nobody wrote
A modern application may have a few thousand lines of its own and hundreds of thousands of lines of dependencies: libraries, frameworks, operating system images. Each one may have known vulnerabilities, and some may have been tampered with deliberately before arriving.
Reviewing your own code is necessary. Ignoring everything else leaves most of the surface wide open.
What each artefact contains
The practice that solves this rests on the build itself, which is already an approval gate (as in let the build fail, not production):
- A component list. Every build generates an inventory of everything the artefact contains (usually called an SBOM): each library, with its version.
- Vulnerability scanning. That inventory is cross-referenced with the known vulnerability databases. Anything critical stops the build; the rest is recorded with a deadline.
- Pinned versions. Dependencies are pinned to specific versions, so that today's build and tomorrow's contain the same thing.
- A signed artefact. What gets published is signed, and the deployment accepts only artefacts signed by the build itself. It fits with deploying by digest: the digest says what it is; the signature says who made it.
What comes after deployment
A dependency with no vulnerabilities today may have them tomorrow, when a new one is discovered. Because every artefact in production has its component list stored, answering 'are we affected by this vulnerability?' is a query of minutes, not a days-long hunt across every repository.
Secrets and configuration too
The code you publish must not carry credentials inside it (we saw this in secrets by name, never by value), and infrastructure configuration is scanned just like application code, with rules as code.
With the software under control, what remains is protecting what matters most in the end: the data.
How we apply it: Cybersecurity.