← All field notes

Software Supply Chain Security for Teams That Still Need to Ship

Software supply chain security is mostly disciplined delivery work: know what you ship, protect the path to production, reduce blind trust, and rehearse what happens when a dependency turns bad.

SecuritySoftware

Modern software is assembled from far more than the code a team writes. Package registries, build images, automation actions, hosted runners, signing services, and vendor scripts all participate in a release. Any one of them can become the route by which an attacker reaches customers.

The response is not to stop using dependencies. It is to make the delivery path knowable. Teams need to see what entered a build, who was allowed to change it, and whether the artifact that reached production is the artifact that passed review.

Draw the path from commit to production

List the repositories, package sources, build runners, registries, deployment identities, and manual handoffs involved in a release. Include reusable scripts and third-party automation. The sketch will usually uncover credentials with broad access or steps that exist only in one person’s memory.

Assign an owner to each part of the path. An unowned build image can remain stale even while application dependencies are updated every week.

Know what is inside the artifact

Lock dependency versions where the ecosystem supports it, review unexpected lock-file changes, and generate a software bill of materials from the build that actually ships. Keep provenance information with the artifact so an incident team can answer which release contains a particular component.

Inventory is only useful if it can be searched. Store it somewhere reachable during an incident, not solely inside the compromised pipeline.

Protect the release machinery

Require strong authentication for maintainers, limit who can publish packages or approve deployments, and use short-lived credentials where possible. Separate pull-request execution from trusted release jobs so unreviewed code cannot simply read production secrets.

Pin third-party automation to reviewed versions and revisit that choice. A convenient action that can change underneath every build is a hidden remote dependency.

Prioritize vulnerabilities with context

A scanner can produce hundreds of findings without explaining which component is reachable or present in production. Combine severity with exposure, exploitability, runtime use, and the importance of the affected system. Fix actively exploited and externally reachable paths first while documenting why lower-risk items wait.

Do not let noisy alerts train the team to ignore the channel. Tune policies, remove abandoned packages, and set a clear exception owner and expiration date.

Practice a dependency incident

Pick a component used by several products and pretend it has been compromised. Can the team find every affected release, block a new build, rotate exposed credentials, replace the component, and communicate status? Time the exercise and write down the missing information.

That rehearsal turns supply chain security from a yearly questionnaire into an operating capability. The team may never eliminate third-party risk, but it can make that risk visible and recoverable.