Product

Product Features SDLC How to Compare Docs Screenshots

Start here

Getting started Download Questions

More

Security Roadmap About

SDLC and the challenge

How software reaches you, and where it can be poisoned

Written for somebody who does not write software. No jargon that is not explained the first time it appears, and nothing here needs you to know what a compiler is.

The short version. Modern software is assembled rather than written. A team writes perhaps five percent of what ships and downloads the rest from the internet, automatically, every time it builds. Each of those steps is a place where something unwanted can get in, and most organizations check almost none of them.

The journey, one step at a time

This plays on its own. Press a step to stop it and read.

Laptop code is written 1 Repository shared history 2 Registries npm, PyPI, Docker 3 Build server Jenkins, Actions 4 Registry the artifact 5 Customers the running service 6

On the laptop

Somebody writes code on their own machine. This is the cheapest place to catch a mistake: nothing has been shared yet, and fixing it costs a keystroke. It is also the only place a scanner cannot see unless somebody installs one.

What most pipelines actually look like

Not because anybody decided to build it this way. It is what you get when a pipeline grows one useful shortcut at a time over five years.

Developerwrites codeRepositorygit pushBuild serverJenkins, ActionsArtifactimage, packageYour customersrunning it in productionnpm and PyPIpublic packagesDocker Hubbase imagesNothing here is checked, so all of this reaches productionA password committed in 2019still in the history, still validA typosquatted packageinstalls and runs on installA four year old base imagewith known holes in itA pipeline anyone can editand it holds the signing keyThe first anybody hears about it is a bill, a breach notice, or somebody else finding your key.
nothing checks this the normal path

The four things that go wrong

A password in the code

Somebody pastes a database password into a file to get something working, and forgets. Deleting it later does not help: the history keeps every version. On a real estate this is the most common serious finding, and the credential is usually still valid.

A package that is not what it says

Somebody registers a package one letter away from a popular one and waits for a typo. Others take over an abandoned package and publish a new version. Because packages can run code the moment they are installed, this works before anybody has run the application.

A base image nobody has rebuilt

Every container starts from a base image, which is a frozen copy of an operating system. Pin one in 2021 and you are still shipping 2021's known holes today, no matter how good the code on top of it is.

The build server itself

The pipeline holds the keys to everything it deploys to. Its configuration usually lives in the repository, where anyone who can change code can change the pipeline. Compromise it once and you can sign anything.

Why this is called supply chain risk. It is the same idea as a food supply chain. You did not grow the ingredients; you trusted whoever did, and whoever they bought from. When something goes wrong three suppliers away it still ends up on your plate, and the question is whether anybody was checking at the point it came in.

What a pipeline should look like

The same journey, with something checking at each handover. None of these checks is expensive; the hard part is that they have to be in the path rather than in a report nobody opens.

Developerwrites codeRepositorygit pushBuild serverJenkins, ActionsArtifactsignedYour customersrunning a known buildIn the editorbefore it is committedOn the mergesecrets, code, licensesIn the builddependencies, image, IaCBefore releasesigned, SBOM attachednpm and PyPIpinned, checkedDocker Hubpinned by digestGit Code Review, over everything already committedEvery commit, every branchincluding what was deletedVerified credentialsthe provider says it still worksReachable dependenciesand the ones nothing callsWho can reach each repoand what it holdsA gate stops what is arriving. This finds what already arrived, which on any estate older than a year is most of it.
checked at the handover the normal path

The tools, and what each one is for

CheckWhat it looks forWhere it belongs
Secret scanning Passwords, API keys and certificates that ended up in the code. Before the merge, and continuously over the whole history.
SAST
static analysis
Patterns in your own code that let somebody in: injection, unsafe handling of input, weak cryptography. Before the merge, on the changed files.
SCA
dependency scanning
Known holes in the packages you downloaded, and packages that are themselves hostile. In the build, every build.
Container scanning Known holes in the base image and everything the build installs into it. In the build, before the image is pushed.
IaC scanning
infrastructure as code
Servers, buckets and clusters described in files, configured in a way that leaves them open. Before the merge, with the code.
Pipeline review The build configuration itself: who can change it, what it trusts, what it can reach. Before the merge, and continuously.
DAST
dynamic testing
Problems that only appear when the thing is actually running. Against a test deployment, after the build.
Signing and SBOM Proof of what is in the artifact and that nobody changed it after it was built. At release, attached to the artifact.

Where Git Code Review fits

It is the continuous pass across everything already committed, rather than a gate on what is arriving. Both are needed and they answer different questions.

A gate answers "should this change go in?"

It looks at what somebody is adding right now, and it can say no. That is the cheapest place to stop a problem, and it is the only place that stops one before it exists. Every organization should have one, and it does nothing at all about the five years of code that went in before you installed it.

This answers "what is already in there?"

Every commit on every branch of every repository, across every host you use, including the credentials somebody deleted in 2019 and the repository nobody has opened since the person who wrote it left. On any estate older than a year that is where most of the risk is sitting, and no gate will ever find it.

It also does the ranking, which is the part that decides whether anybody reads the output: verifying whether a key still works, working out which vulnerable packages the code can actually reach, and saying what each repository holds and who can push to it.

How it works What it checks