Remediation · Containers and packages · 1 November 2026

Most of your scan result comes from two choices you can change.

A long container scan is rarely a long list of separate problems. Most of it traces back to the base image you started from and the package versions your build happened to pull. This is how Vulnetix changes both, shows you why, and writes the change, and what it does about the findings neither change reaches.

Picture the scan of an image your team has shipped for a year. It comes back long, and the instinct is to work down it: open each finding, read the advisory, decide what to do.

Look at where the findings live before you start. Most belong to operating system packages the base image brought with it, packages nobody on your team chose. Most of the rest belong to a handful of application dependencies pinned behind versions that already fix them. Work through the list one finding at a time and the next build brings the same findings back.

This article follows that image through two changes, a new base and a new version for each package, and then through what happens to the findings those two changes cannot reach. It ends with what keeps the result from drifting back.

01 · Where the findings come from

Two levers move most of a scan result

Changing the base and the pins changes the result; triaging the findings one by one does not. Vulnetix works each lever from its own end. Container curation starts with the image and reads it layer by layer until it finds what the image was built on. Safe Harbour starts with the packages and reads every version each one has published.

A third input decides the order. An image that runs in production deserves the first hour of your week; an image nobody deploys can wait.

02 · Choosing the base

Every claim links to something you can check

Back to the image. Its base is a public image, and several registries publish an equivalent with the same runtime, libc and distribution release. Container curation lines them up and ranks them by what each one removes.

A ranked list is easy to produce and hard to trust, so each alternative arrives with what stands behind it: the vulnerabilities it still has, the ones it removes, where the image came from and who signed it. When a vendor's own claim leaves out a vulnerability Vulnetix found in the same image, the comparison shows the gap instead of smoothing it over.

03 · Choosing the versions

Pick how far each package moves

With a base picked, the packages your own layers install still need versions, and so do the manifests in the repository. Safe Harbour clears every published version that has no known vulnerability, exploit or malware report. Which cleared version you take depends on how far you are willing to move, so you choose a policy and it applies to every package at once.

Safest

The highest stable release that Safe Harbour clears.

Stable

The stable release closest to the one you run.

Latest

The highest stable release by the ecosystem's own version rules.

Rolling

What shipped most recently, closest to the one you run.

A container migration adds a fifth pick, parity: the version the new release ships that is nearest to the one running now. Every pick comes from versions Safe Harbour clears, worked out with the ecosystem's own version rules; a package with no clean version is shown as such and never pinned to a guess.

Rolling has a window: the newest release day, one release day earlier, or one release earlier by version order, for a team that wants a release to age before it takes it.

Where no registry knows a package, such as a Go module hosted on GitHub or an npm dependency that points at a repository, Safe Harbour reads the project's GitHub releases and checks them the same way. A package with no versions anywhere can be kept as it is or given a version by hand, and when a project has no lockfile you choose the package manager and one is generated with your picks.

04 · The change

The change is written, not described

A recommendation that ends in a task list tends to sit in a backlog. This one ends in files. Once the base and the versions are chosen, Vulnetix writes everything the repository needs to build the new image, and you review it like any other change.

05 · Fixing from the CLI

Autofix from the scanner you already run

Not every fix needs a console. When the problem is the application's dependencies, the scan you already run in CI can make the change. Add --fix to a Vulnetix CLI scan and the vulnerable dependencies it finds are upgraded in place. Your project's own package manager makes the change, and the scan runs again to prove the finding is gone.

The policies from chapter 03 apply here as well, so a developer's laptop and the CI job pick the same versions.

Software composition analysis · Safe Harbour versions · Dependency curator · Quality gate

06 · Fixing the container

For a container, the fix is a new base

Upgrading packages inside an image that starts from a vulnerable base works for one release. The next base update brings the findings back and the work repeats.

The migration plan moves the image to the hardened base you chose in chapter 02 instead, and writes the change for the repository that builds it. From the plan, one button opens the pull request.

Container scanning · Safe patching · Announcing Safe Harbour

07 · Knowing the image

Built where, running where

All of this depends on knowing which Dockerfile built the image you are looking at. In a large estate that is not always obvious: images are retagged and pushed from pipelines nobody has opened in months.

A migration is only as good as what it knows about the image. Vulnetix reads it from the image, from the Dockerfile in CI and from your cloud account, pairs a running image with the file that built it, and says how it made the pairing.

The image

vulnetix image records an image's packages layer by layer, so the plan knows what your own layers add on top of the base.

Container scanning

The Dockerfile

vulnetix containers in CI records each FROM and install line, so an image is listed and planned from the file that builds it before any SBOM exists.

The code scanner

Where it runs

A connected AWS account lists every image EKS, ECS, Lambda and ECR hold or run, and each placement links to the AWS console.

Integrations

Built and run, together

A running image is paired with the Dockerfile that built it from its source label, the commit in its tag, or its repository's name when the FROM line agrees with the base it resolved to. The page says which.

Safe Harbour

08 · Handing it to an agent

An agent makes the change, and you approve it

Some fixes are more than a version bump. A new major version removes an API the code calls, or a hardened base ships no shell and a build step needs rewriting.

Agentic Fix hands that work to an agent: from a Pix button beside the finding, or from the Software Factory across every repository you connect. The agent writes the change and opens the pull request; a person decides what merges. The pull request button in chapter 06 is one of these buttons, and the session it starts is shown here.

Software Factory · Vulnetix AI · Pix Sandbox · Announcing the Software Factory · The Pix plugin

09 · When the fix cannot ship yet

A virtual patch for the fix that cannot ship this week

Sometimes the right change is known and still cannot ship: a release freeze, a vendor appliance, a migration that needs a test cycle first.

Between a public exploit and the deployed fix, the only thing in front of the vulnerability is what you can load at the edge. Vulnetix builds blocking rules from the exploits themselves, in the formats your edge and sensors already take.

Formats: Snort, Suricata, ModSecurity, nginx, AWS WAF, Cloudflare WAF, Layer 7 regex.

Virtual patching · Announcing virtual patching

10 · Where the edge sees nothing

Countermeasures for the attacks the edge cannot see

Many exploits leave nothing on the wire and act only on the device, so a firewall rule has nothing to match. For those, Vulnetix builds detection content from the same exploits, for your SIEM, your EDR and your threat platform.

Formats: Sigma, YARA, STIX 2.1, OpenIOC.

Countermeasures · Guardian SIEM · Campaigns

11 · After the move

Keep the image clean once it has moved

A hardened base and clean pins drift back if nothing guards them. The next install pulls a newer version, a forgotten pipeline keeps building the old image, or a package you cleared is reported as malware a month later. These are the controls that hold the result, each with the page that covers it.

Block what would undo it

The Package Firewall refuses vulnerable, malicious and untested versions at install time across 25+ registries, so a clean pin is not swapped out on the next build.

Package Firewall

Fail the build that regresses

The quality gate fails CI on the severity, malware, exploit and end-of-life policy your organisation sets, with one vulnetix scan command.

Quality gate

Hold the release that drifts

Jails fail a pipeline when findings sit past their remediation window, a runtime goes end of life or a migration misses its date.

Jails

Catch malware in what stays

Malware scanning checks the dependencies installed on disk, including the ones your layers add on top of the new base.

Malware scanning

Publish the evidence

Signed SBOMs and VEX go to your Transparency Exchange catalogue, so anyone you share it with can check the result of the move.

Transparency Exchange

12 · Your image

Your image, not a vendor rebuild

Go back to the image from the start of this article. A hardened registry would rebuild the open source image under it and hand you its artifact. That rebuild is one of the sources Vulnetix compares. The migration starts from the image you already run: it keeps your layers, swaps the base for the best equivalent across every registry we read, pins what you install, and shows the evidence for each step.

When keeping the current base is the better call, the recommendation says keep. When the base is unknown, because the image was squashed or built from a reference we cannot resolve, the page says that too, rather than guessing.

Images arrive three ways: the Vulnetix CLI records an image's packages layer by layer, the Dockerfile scanner records each FROM and install line in a repository, and a connected AWS account lists what EKS, ECS, Lambda and ECR hold or run. Manifests arrive through the GitHub App or an upload. Read more about container scanning and the dependency curator.

Start with the image that runs the most.

Container scanning · Safe patching · Get a Demo