Application vs base image
Why most container vulnerabilities are in the base image, how StackRadar separates them from the findings in your own dependencies, how the base image is detected, and what removes them.
Scan a container image and most of what comes back is not about your code. It is libssl and glibc from the distribution the image is built on, the copy of npm that ships inside the Node image, the JDK's own jars. Those findings are real — and none of them is fixed by bumping a dependency. Mixed into one list sorted by severity, they bury the handful of findings you can actually act on today.
StackRadar splits every findings table into Application and Base image, opens on Application, and tells you what would remove the rest.
The two buckets
| Bucket | What is in it | How it gets fixed |
|---|---|---|
| Application | Dependencies your build added — npm, PyPI, Go modules, Maven, gems, crates — and the application itself | Bump the dependency, rebuild |
| Base image | Operating-system packages (apk, deb, rpm) and the tooling that ships with the language: node's bundled npm, yarn and corepack; pip, setuptools and wheel; the JDK's jars; Ruby's default gems; executables the base image ships | Rebuild on a newer base image |
Every findings table has the same three-way control, with the count in each segment, so the bucket you are not looking at is never invisible:
Application (12) · Base image (231) · All (243)The choice is part of the page's URL (?tier=application, base or all), so a link you paste shows its recipient the view you were looking at.
Exploited findings are always shown
A view is a default, never a verdict. A finding that is in the CISA KEV catalogue, or has an EPSS score of 0.1 or more, is listed under every view, whichever bucket it is in, with a label saying why: "Base image · exploited". An actively exploited flaw in glibc is not something to discover by clicking a tab.
Folded, not hidden
- The Radar Score counts every finding, in both buckets. The split changes what is listed first, never what is counted.
- Nothing is suppressed automatically. Suppression in StackRadar is a manual decision with an owner, a reason and an expiry, and this feature never makes one for you.
- The severity cards on the dashboard count everything; they link to the full list, not the Application view, so the number you click is the number you land on.
How the base image is detected
StackRadar starts from what kind of package a finding is in, which it can tell from any SBOM ever uploaded. From scanner 0.4.0 the agent also reports the image's ordered layers (see what data leaves the cluster), and StackRadar works out where the base image ends. When it can, the layer decides: a package belongs to the base image if the layer it first appears in does. That is what makes an apt-get install in your own Dockerfile count as yours — it is an operating-system package, and it is yours to fix.
The boundary is found by the first of these that answers:
- The image says so. OCI annotations
org.opencontainers.image.base.nameand.base.digest. Docker Official Images carry them; add them to your own builds and detection is exact. - A known public image is its prefix. The first layers of your image are exactly the layers of a public image StackRadar has seen.
- A shared prefix inside your organization. Two of your images that start with the same layers share an internal base image.
- Buildpacks metadata, for images that have no Dockerfile history.
- Build history. A base image ends with its own
CMDorENTRYPOINT, and its layers are older than yours. Where that instruction and the largest jump in layer build time agree, that is the boundary — named only when a registry confirms the guess layer for layer.
When none of them answers, StackRadar says nothing about where the base ends and falls back to the kind of package. It never guesses a base image name.
docker build do not inherit their base image's annotations. Adding --annotation "org.opencontainers.image.base.name=node:20-bookworm-slim" to your build is the single most reliable way to get an exact boundary.What removes the base image findings
For an image you build, StackRadar checks the base nightly: what its tag points to today, and the newest tag of the same variant (it will never suggest moving from -slim to -alpine, or from one major version to the next when a newer release of yours exists). It scans those candidates itself and compares them with the findings in your image's base layers:
Rebuilding on node:20.18.1-bookworm-slim removes 212 of 231 base image findings.Often the answer is the same tag: it has been rebuilt upstream since you built on it, and a rebuild with no Dockerfile change picks the fixes up. It is advice — nothing in StackRadar can rebuild your image, and it says what a rebuild clears, not whether it is safe to deploy.
Images you do not build
The split matters most for images you build. For a third-party image — Prometheus, Grafana, an ingress controller delivered by a public Helm chart — you cannot change the application or the base, so there is one action per image: upgrade the chart, override the image tag, or wait for upstream. StackRadar works out which images are yours (private registry, not delivered by a public chart, not a vendor namespace), asks you once to confirm the ones it could not tell, and groups every recommendation into In your control, Upgrade upstream and Waiting on upstream. You can change the answer any time under Organization settings → Image ownership.
When it is wrong
- An image is filed under the wrong owner. Organization settings → Image ownership: tick or untick the repository. Your answer always beats what was detected.
- A package is in the wrong view. Organization settings → Findings views → Rules: "package URL starts with
pkg:npm/%40mycorp/→ Application", or a path in the image, or an exact package name. Rules apply after StackRadar's own, the most specific one wins, and every change is recorded. They move packages between views; they never hide a finding. The same tab sets which view your organization opens on by default. - The boundary is missing or unnamed. Add the two OCI base annotations to your build, or upgrade the scanner to 0.4.0 so it reports layers at all.
- You do not want the scanner to send image metadata. Set
scanner.imageMetadata=false. The split then works from the kind of package alone; findings and scores are unaffected.
In the CLI
stackradar scan applies the same rules locally, with no account. The per-image table lists application packages and gives the base image one line; every total, -o json and --fail-on still see every finding.
stackradar scan --image nginx:1.27-alpine --min-severity high
Nothing in the application packages.
+ 41 in the base image (5 critical, 36 high) — fixed by rebuilding on a newer base; --all to listFrequently asked questions
Why does a container scanner report hundreds of vulnerabilities I cannot fix?
Because most of the packages in a container image are not yours. An image built on a Debian or Alpine base carries the distribution’s libssl, glibc and a hundred other packages, plus the tooling that ships with the language runtime, and a scanner that lists findings by severity lists those first. None of them is fixed by changing your application’s dependencies — they are fixed by rebuilding on a newer base image. StackRadar separates the two: the findings in the packages your build added are shown first, and the base image’s are counted and one click away.
Does StackRadar hide base image vulnerabilities?
No. It folds them, which is different: every findings table carries the count for each bucket — Application, Base image, All — so the folded bucket is never invisible, the Radar Score still counts every finding, and nothing is suppressed automatically. Suppressing a finding in StackRadar is always a manual decision with an owner, a reason and an expiry.
What if a base image vulnerability is being actively exploited?
Then it is shown wherever you are looking. A finding in the CISA Known Exploited Vulnerabilities catalogue, or with an EPSS score of 0.1 or more, is listed under every view regardless of which packages it is in, with a small label saying why it is there. It is the same rule StackRadar applies to findings that have no severity score.
How does StackRadar know which packages came from the base image?
Two ways. First by kind: operating-system packages (apk, deb, rpm) and the language runtime’s own tooling — node’s bundled npm, pip, setuptools and wheel, the JDK’s jars, Ruby’s default gems — are the base image’s. Second, and better when it is available, by layer: from scanner 0.4.0 the agent reports the image’s ordered layers, StackRadar works out where the base image ends, and a package belongs to the base if the layer it first appears in does. That is what lets an apt-get install in your own Dockerfile count as yours even though it is an operating-system package.
How do I fix vulnerabilities in a base image?
Rebuild on a newer one. Often that means no Dockerfile change at all: a tag like node:20-bookworm-slim is rebuilt upstream for months, and an image built on last spring’s copy clears findings simply by being rebuilt today. Otherwise it means moving the FROM line to a newer tag of the same variant. For images you build, StackRadar measures both and tells you which removes more — "rebuilding on node:20.18.1-bookworm-slim removes 212 of 231 base image findings". For third-party images the base is upstream’s to change, and the action is the chart or image upgrade.
Next steps
- The Radar ScoreHow the Radar Score uses the EPSS score, the CISA KEV catalogue and CVSS to rank what to fix first — the published formula, worked examples, and the thresholds that matter.
- Architecture & data flowHow the StackRadar scanner works: what runs in your cluster, exactly what data leaves it, how SBOMs are matched to vulnerabilities, and where data is stored.