mediumCVSS 6.8Vulnerability

CVE-2026-85747

### Summary `registry/client.(*manifests).Get(ctx, dgst, …)` fetches a manifest by digest but never hashes the returned body and compares it against the requested digest. A malicious or compromised registry, or any MITM on the registry connection, can serve arbitrary manifest bytes in response to a digest-pinned request and the client returns the substituted content transparently to the caller. Any application relying on digest pinning for supply-chain integrity — image policy controllers, mirrors, pull-through caches — is silently undermined. The bundled pull-through proxy (`registry/proxy/proxymanifeststore.go`) is itself an unguarded consumer and is directly exploitable. ### Details **Root cause:** `registry/client/repository.go:488-505` reads the response body and passes it directly to `distribution.UnmarshalManifest` without ever computing `digest.FromBytes(body)` and comparing against the caller-supplied `dgst`. The `Docker-Content-Digest` response header is parsed (lines 251-292 in `descriptorFromResponse`) only to populate an out-parameter (`ReturnContentDigest`) and is itself server-supplied — it is never recomputed from the body, so a lying server can set it to whatever value the caller requested while delivering different bytes. **Attack path:** An attacker who controls the registry endpoint (malicious registry, compromised upstream, DNS hijack, or TLS MITM) responds to `GET /v2/{name}/manifests/{digest}` with: 1. `Docker-Content-Digest: <requested-digest>` (forged header) 2. A body containing a different, attacker-chosen manifest The client calls `distribution.UnmarshalManifest` on the substituted body, returns the attacker's manifest as if it were the pinned content, and the caller has no way to detect the substitution. **Why it matters:** The entire value of digest pinning is to guarantee content-addressable integrity against exactly this threat model (hostile or MITM server). The `registry/proxy/proxymanifeststore.go:42-87` pull-through cache ca

Properties

severity
medium
summary
Distribution: Client `manifests.Get()` does not verify returned content against requested digest
cvss_score
6.8
retrieved_at
2026-10-15T22:56:51+00:00
ghsa_published
2026-10-15T20:22:02Z
source_url
https://github.com/advisories/GHSA-685w-q87j-wqw3
ghsa_updated
2026-10-15T20:22:03Z
ghsa_id
GHSA-685w-q87j-wqw3
last_source
GitHub Advisory Database
cve_id
CVE-2026-85747
cvss_vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:H/A:N
signal_observed_at
2026-10-15T22:56:51+00:00
is_ghsa_only
false

Related Entities (6)

VULNERABLE_TO (2)

←[Software]go/github.com/docker/distribution
←[Software]go/github.com/distribution/distribution/v3

AFFECTS (2)

→[Software]go/github.com/distribution/distribution/v3
→[Software]go/github.com/docker/distribution

HAS_WEAKNESS (1)

→[Weakness]Improper Validation of Integrity Check Value

REPORTED_BY (1)

→[Source]GitHub Advisory Database

Explore deeper with Ninja Signal's threat intelligence graph

CVE-2026-85747 (CVSS 6.8) — Ninja Signal Threat Intelligence | Ninja Signal