Repository navigation
Add get_runtime_versions: declared runtime versions of running images - #2265
Conversation
PR Summary by QodoAdd declared runtime inventory for running images
AI Description
Diagram
High-Level Assessment
Files changed (16)
|
Code Review by Qodo
1.
|
Runtime CVEs like PHP2Shell hit images vulnerability scanners can't read: the official php images compile PHP from source, so there is no package to match, and every image built FROM them inherits the gap. Those images declare the version in their config (PHP_VERSION and friends). The new read-only MCP tool reads each running image's config for the digest the kubelet reports and the node's platform, returns the curated version keys it declares grouped by workload, and classifies them against per-branch fixed releases. Output marks declared-not-proven, unknown statuses, spec- or tag-resolved images and assumed platforms. Lookups use only Pods the caller may list and those Pods' own pull secrets (Radar's credentials only when local with auth off), cache credentialed results per exact Secret, and run behind a guard that checks every request's resolved address, allows internal addresses only for the registry endpoint a Pod named, and bounds concurrency, retries, sizes and time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Through an HTTP proxy, HTTPS lookups now tunnel with a CONNECT to the address the guard checked, so the proxy can't resolve the name somewhere else; anything that can't be pinned is refused in-cluster. fixed_in needs runtime, since fixes belong to one runtime. A one-part fix covers its own major only, and the earliest fix on a branch wins. Images are grouped by their fully qualified reference, and a group counts as running a digest when any of its Pods' kubelet reported it. Many pull secrets no longer crowd out the anonymous attempt, and ephemeral debug containers are included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A proxy that accepts but never answers a CONNECT now times out instead of holding the connection, and a successful tunnel is used at once without reading the response body, whatever framing headers the proxy sent. Ephemeral debug containers count only while running: they can't restart, so an exited one no longer keeps its image in the inventory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
main now carries the longer search description from #2264; with the new tool the catalog is 62,802 bytes.
a3ee126 to
76997f1
Compare
Expands the v1.18 CVE highlight to include #2265's MCP inventory of runtime versions declared by running images and supported fixed-release comparisons. The copy distinguishes declarations and unknowns from verified remediation. Raises the CVE card's importance from 5 to 8. The four v1.18 cards now total 23, below the automatic-open threshold of 25 for upgrades from v1.17. Follow-up to merged #2271. Validation: `make tsc`, all 54 What's New tests, and `bash scripts/check-whats-new.sh v1.18.0` passed. Visual-test skipped: copy and importance only in the existing dialog.
Adds
get_runtime_versions, an MCP inventory of runtime versions declared by images used by visible Pods. This complements Trivy findings for images built from upstream runtime images, where the runtime may not appear in a package database. Declarations describe image metadata; they do not verify binaries or prove remediation.The tool reads manifests and config blobs for the kubelet-reported digest and node platform, without downloading layers. Curated runtime ENV keys and OCI version/base-image labels are grouped by workload.
runtimeandfixed_inrank declarations below the first fixed release on their branch. Only supported upstream version formats are classified; distro revisions and unsupported formats returnunparsed. Tag/spec fallbacks and assumed platforms receive no fix verdict; partial version declarations remain unparsed. Missing declarations remain visible asno_declarationand count as unknown. Invalid runtime filters, image-label fix comparisons and unsupported fixed-release inputs return actionable errors before registry reads. Requests outside the configured namespace pin report that scope explicitly; unfinished credential attempts report not_checked.Callers must be able to list Pods in each namespace. Registry credentials come from the admitted Podsâ own
spec.imagePullSecrets; Radarâs ambient credentials are used only locally with auth off. Shared mode remains enabled. Node registry credentials are not used, so images pulled only through node identity can remain unreadable; an access failure does not claim that the Podâs own credentials were rejected. Credentialed lookups require HTTPS for registry requests, redirects and token exchanges. The transport checks destinations and pins connections to allowed addresses, with isolated connection pools per lookup. Only the named registry may use private addresses; link-local destinations are refused.Lookups have a 40-second call budget, 15 seconds per attempt, four concurrent slots, a 200-attempt cap, bounded response bodies and registry backoff. Cached results are separated by credential identity; transient failures expire after 30 seconds. Manifest GETs can consume registry pull quota shared with workloads, including Docker Hub account or egress-IP quotas. The tool is included in the MCP setup catalog and Diagnose allowlist. No new UI is added.
Validation:
-race, including HTTP credential fallback, unsupported version comparisons, missing declarations, assumed platforms, input validation, accurate auth errors and transient retry expiry.make buildScope: this is an inventory of declarations and remaining unknowns. It does not inspect image filesystems or establish that a vulnerability was remediated. Operator registry policy, resumable pagination and per-caller fairness remain follow-ups.