Resolve a scanner finding for a CVE Chainguard has fixed
What to check when the Chainguard Console or a security advisory says a CVE is fixed, but your vulnerability scanner …
For the complete documentation index, see llms.txt.
Use chainctl images advisories list to compare the advisories for the APK packages in an image with the CVEs reported by your scanner.
Note: This command looks up advisories by APK package. Chainguard records a vulnerability in a Go module, Java archive, or other language component against the APK package that ships it, so the results cover those components too. They don’t cover dependencies that your own build adds to the image. For details, see When the finding is a Go module or Java dependency.
FIPS variants use the same package-level advisory process as other Chainguard images. chainctl images advisories list does not determine coverage from the image name or the -fips suffix. It reads the APK package names and versions in the image SBOM, then looks up advisories for those APK packages. This means:
For a FIPS finding, use the exact image digest and platform, then compare the scanner’s package name and version with the APK package data in the image SBOM. Search the Security Advisories page for the exact package and CVE. If the APK package is present but no matching advisory exists, treat the result as an advisory-coverage question and include the image digest, package name and version, CVE, scanner and database versions, and scan output when contacting Support.
You need:
chainctl installed and authenticated.linux/amd64.Run the command against the same image reference and platform that your scanner analyzed:
chainctl images advisories list \
cgr.dev/chainguard/<image>@sha256:<digest> \
--platform=linux/amd64 \
-o wideThe output includes the APK package, package version, advisory ID, CVE aliases, status, and advisory type. Compare the package name and version—not only the CVE alias—with the scanner’s finding. The TYPE column shows apk on every row, including advisories for a Go module or other component inside the package.
If the image has no SBOM attestation, or the requested platform does not have one, the command cannot use that image to perform the lookup. If no matching advisory is shown, do not treat that alone as proof that the scanner finding is a false positive; first verify the image digest, platform, package ecosystem, package version, and scanner database.
--status
Use --status to narrow the output to the advisory states you need to review. You can provide multiple values as a comma-separated list, or by repeating the flag:
# Findings that still need attention or confirmation
chainctl images advisories list "$IMAGE" \
--status=detected,true-positive,pending-upstream
# Findings with a recorded fix or backported patch
chainctl images advisories list "$IMAGE" \
--status=fixed,patched
# The same filter using repeated flags
chainctl images advisories list "$IMAGE" \
--status=detected \
--status=pending-upstreamTo inspect one CVE from the table output, filter the displayed aliases after retrieving the results:
chainctl images advisories list "$IMAGE" -o wide | grep 'CVE-2026-42151'The command filters advisories by their current status. It does not accept a CVE as the primary lookup key, and it does not replace the scanner’s analysis of components that no Chainguard package ships.
The command reports the status derived from the advisory’s most recent event:
| Status | Meaning | How to use it when triaging |
|---|---|---|
detected | The advisory has a recorded detection event. | Treat it as a finding that still needs validation or remediation. |
true-positive | The advisory has been confirmed as applicable. | Prioritize it as an applicable vulnerability. |
fixed:<version> | A fix is recorded in the specified package version. | Compare the fixed version with the package version in your image and rebuild or upgrade if needed. Filtering with --status=fixed matches version-qualified values. |
false-positive | The advisory has been marked as not applicable. | Use the advisory record as context, but keep the scanner finding separate until you understand why the scanner reported it. |
analysis-not-planned | No applicability analysis is planned for the advisory. | Do not interpret this as “not vulnerable.” Use independent evidence for your risk decision. |
fix-not-planned | No fix is planned for the advisory. | Review the advisory context and choose a mitigation, exception, or replacement according to your policy. |
pending-upstream | Chainguard is waiting for an upstream fix. | This explains why a fixed package may not yet be available; it is not confirmation that the finding is absent. |
patched:<version> | The vulnerability is patched in the specified package version, typically by backporting the fix. | Compare the patched version with the package version in your image. Filtering with --status=patched matches version-qualified values. |
unknown | The advisory has no recognized status event. | Investigate the advisory and scanner evidence rather than assuming either presence or absence. |
A missing result can have several explanations:
A missing result is therefore a prompt to reconcile the two data sources, not a standalone false-positive determination.
Scanners report Go modules, Java archives, and other language components separately from APK packages. How you validate one of these findings depends on where the component came from: a Chainguard package that ships it, or your own build. If your build didn’t add the file where the scanner found the component, a Chainguard package ships it.
To confirm, look up the APK package that owns the file:
In the scanner output, find the file path for the component, such as /usr/bin/crane for a Go binary or /usr/share/java/maven/boot/plexus-classworlds-2.11.0.jar for a Java archive.
Run the following command against the image and platform that your scanner analyzed, replacing <file-path> with that path. The command exports the image, reads its APK database, and prints the name and version of the package that owns the file:
crane export --platform linux/amd64 \
cgr.dev/<organization>/<image>@sha256:<digest> - \
| tar -xO usr/lib/apk/db/installed \
| awk -v path="<file-path>" '
BEGIN { sub(/^\//, "", path) }
/^P:/ { package = substr($0, 3) }
/^V:/ { version = substr($0, 3) }
/^F:/ { directory = substr($0, 3) }
/^R:/ && directory "/" substr($0, 3) == path { print package, version }
'For /usr/bin/crane in the crane image, the command prints crane 0.22.1-r0. If it prints nothing, no APK package owns the file. The crane command uses the same registry credentials as docker. If it can’t authenticate, run chainctl auth configure-docker first.
If an APK package owns the file, follow Components that a Chainguard package ships. Otherwise, follow Dependencies that your build adds.
Chainguard records a vulnerability in a bundled component against the APK package that ships it. For example, Chainguard records CVE-2026-39836, a vulnerability in the Go standard library that is compiled into /usr/bin/crane, as an advisory for the crane package. Validate the finding the same way as an APK finding:
List the advisories for the image that your scanner analyzed, and filter for the CVE:
chainctl images advisories list "$IMAGE" -o wide | grep 'CVE-2026-39836'In the row for the package that owns the file, read the status. A fixed version is a version of that package, such as 0.21.5-r1, not a version of the component. Scanners report the component’s own version, such as go1.25.9 for the Go standard library, so don’t compare the fixed version with that value.
Compare the owning package’s installed version with the fixed version, as described in Compare the installed package with Chainguard’s fixed version. If the installed version is the fixed version or later, Chainguard has fixed the CVE in that package. If your scanner still reports it, work through the rest of Resolve a scanner finding for a CVE Chainguard has fixed.
If no advisory for the owning package lists the CVE, Chainguard hasn’t recorded the CVE for that package, and the finding stands. To ask about it, contact support.
Chainguard’s advisories don’t cover software that you add to an image, such as a Go binary that you compile in a later build stage or a JAR that your application copies in. The absence of a Chainguard advisory for one of these dependencies doesn’t make the finding a false positive. Use the scanner’s language-package evidence and the dependency’s upstream vulnerability data instead.
For a Go-module finding:
go.mod or go.sum.For a Java finding:
If an advisory reports a CVE as fixed or not affected but your scanner still reports it, see Resolve a scanner finding for a CVE Chainguard has fixed.
If a result is still unclear, you can contact support. When contacting support, include:
chainctl images advisories list output, preferably in -o wide or JSON form.Last updated: 2026-10-01 15:08