Skip to content

CVE-2026-82209: Verified Reproduction

CVE-2026-82209: curl: domain-scoped cookie for a public suffix e.g. Domain=co.uk leaks to sibling subdomains despite libpsl

CVE-2026-82209 is verified against the affected target. This low reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00348.

REPRO-2026-00348 Sep 11, 2026 CVE entry .txt
Severity
LOW
Confidence
HIGH
Reproduced in
24m 28s
Tool calls
210
Spend
$5.55
01 · Overview

What Is CVE-2026-82209?

CVE-2026-82209 is a low-severity vulnerability. Pruva has independently reproduced it and publishes a verified, runnable proof-of-concept (reproduction REPRO-2026-00348).

02 · Severity & CVSS

CVE-2026-82209 Severity

CVE-2026-82209 is rated low severity.

LOW threat level
Weakness CWE-201: Information Exposure Through Sent Data.

Low — limited impact or hard to exploit. Address in the normal cycle.

How to Reproduce CVE-2026-82209

$ pruva-verify REPRO-2026-00348
or curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00348/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-82209

Information disclosure — 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

An HTTP Set-Cookie header with Domain=github.io followed by a request to attacker.github.io

Attack chain
  1. HTTP response
  2. libcurl cookie engine with libpsl
  3. sibling-domain HTTP request
How the agent worked 362 events · 210 tool calls · 24 min
24 minDuration
210Tool calls
36Reasoning steps
362Events
20Dead-ends
Agent activity over 24 min
Policy
1
Support
17
Repro
149
Judge
26
Variant
164
Verify
1
0:0024:12

Root Cause and Exploit Chain for CVE-2026-82209

Versions: curl 7.46.0 through and including 8.21.0. Versions before 7.46.0 and versions 8.22.0 or later are not affected according to the curl advisory.

CVE-2026-82209 is a cookie-scope information disclosure in curl/libcurl builds that use libpsl. When an HTTP origin whose hostname is itself a Public Suffix List (PSL) entry returns a Set-Cookie header with an explicit Domain equal to that hostname, vulnerable curl accepts the cookie as domain-scoped. It subsequently sends the cookie to sibling hosts under the public suffix. This run confirmed the behavior through real HTTP endpoints and the curl command-line product at the exact parent of the fix, then showed that the fixed commit retains the cookie only for the exact origin.

  • Package/component affected: curl/libcurl HTTP cookie engine when built with libpsl.
  • Affected versions: curl 7.46.0 through and including 8.21.0. Versions before 7.46.0 and versions 8.22.0 or later are not affected according to the curl advisory.
  • Risk level and consequences: Low severity, CWE-201. A cookie issued by a public-suffix apex can be disclosed in an outbound request to an arbitrary sibling beneath that suffix. The apex must issue the cookie; an attacker cannot plant it directly. The same curl client must later contact an attacker-controlled sibling, a plausible condition for shared-hosting or dynamic-DNS suffixes on the PSL.

Impact Parity

  • Disclosed/claimed maximum impact: Information leak.
  • Reproduced impact from this run: The sibling endpoint attacker.github.io received Cookie: sid=DOMAIN_SECRET after github.io issued Set-Cookie: sid=DOMAIN_SECRET; Domain=github.io; Path=/ to vulnerable curl.
  • Parity: full.
  • Not demonstrated: No greater impact, such as authentication bypass or code execution, was claimed or tested. The proof uses a marker cookie rather than a real credential.

Root Cause

Curl_cookie_add() parses a response cookie and gives a cookie with an explicit Domain attribute the tailmatch property. In the vulnerable parent (f8992b6a177a2ccfb5dc04137088534bad68681c), is_public_suffix() treats the exact-origin case as acceptable according to psl_is_cookie_domain_acceptable(), but it cannot change the const struct Cookie *co. The cookie therefore remains tail-matching even when co->domain and the request domain are the same PSL entry. Curl's normal domain matching then sends it to siblings.

The fix, commit 95c1e8915dce64606bd753fd47fc0bd236e31cd6, makes the cookie mutable in is_public_suffix() and clears co->tailmatch when all of these hold:

  1. libpsl accepts the cookie-domain relationship;
  2. the parsed cookie would otherwise tail-match;
  3. the cookie domain exactly equals the response origin; and
  4. psl_is_public_suffix() confirms that domain is a public suffix.

The fixed cookie is thus host-only rather than discarded: it is sent back to github.io but not to attacker.github.io. The patch also moves PSL handling earlier in Curl_cookie_add() and adds upstream regression test 2318.

Reproduction Steps

  1. Run bundle/repro/reproduction_steps.sh from any directory (optionally set PRUVA_ROOT to the bundle path).
  2. The script reads the prepared cache context, checks out the exact fixed commit and its parent in separate worktrees, verifies that the patch hunk is absent/present as expected, and builds both curl products with libpsl enabled.
  3. For each of two vulnerable and two fixed attempts, it starts an isolated localhost HTTP endpoint and runs the real curl CLI with --resolve mappings for the canonical PSL entry github.io and sibling attacker.github.io. The endpoint issues the domain cookie at /set and records the subsequent /sibling and /origin-check requests.
  4. Success requires both vulnerable attempts to disclose DOMAIN_SECRET to the sibling, both fixed attempts to withhold it from the sibling, and all four attempts to retain it for the exact origin. The script validates and hashes every immutable proof artifact before exiting 0.

Evidence

  • Runtime manifest: bundle/repro/runtime_manifest.json
  • Vulnerable endpoint transcripts:
    • bundle/repro/vulnerable-server-1.log
    • bundle/repro/vulnerable-server-2.log
  • Fixed negative controls:
    • bundle/repro/fixed-server-1.log
    • bundle/repro/fixed-server-2.log
  • Full curl request/response traces: bundle/repro/vulnerable-attempt-{1,2}.log and bundle/repro/fixed-attempt-{1,2}.log
  • Source, feature, and loader identity: bundle/repro/target-identity.log
  • Build/session diagnostics: bundle/logs/reproduction_steps.log, bundle/logs/cmake-{vulnerable,fixed}.log, and bundle/logs/build-{vulnerable,fixed}.log

Key vulnerable endpoint evidence:

{"cookie": "sid=DOMAIN_SECRET", "event": "request", "host": "attacker.github.io:<port>", "path": "/sibling"}

Key fixed negative-control evidence:

{"cookie": null, "event": "request", "host": "attacker.github.io:<port>", "path": "/sibling"}
{"cookie": "sid=DOMAIN_SECRET", "event": "request", "host": "github.io:<port>", "path": "/origin-check"}

target-identity.log proves that both binaries expose the PSL feature, link to libpsl.so.5, and load their intended worktree-specific libcurl.so.4. The tested vulnerable identity is repository https://github.com/curl/curl at commit f8992b6a177a2ccfb5dc04137088534bad68681c; its canonical source identity digest is recorded in the runtime manifest as e677ed09f427dd41bac4cb6f8de6e53aa64d3e05fafd927d2d839caf380ed643. No sanitizer was used.

Recommendations / Next Steps

  • Upgrade to curl 8.22.0 or newer.
  • If upgrading is not possible, backport commit 95c1e8915dce64606bd753fd47fc0bd236e31cd6.
  • Retain libpsl support; disabling PSL enforcement is not an appropriate fix.
  • Add regression coverage for exact PSL-domain cookies, ordinary registrable domains, sibling requests, trailing-dot host/domain forms, redirects, cookie persistence/reload, and curl's API as well as CLI paths.
  • Applications that cannot update immediately should avoid accepting or persisting sensitive cookies from hosts that are themselves public suffixes.

Additional Notes

  • Idempotency: Confirmed. The complete reproduction script passed twice consecutively. Each script run itself executes two isolated vulnerable attempts and two isolated fixed attempts.
  • Environment: Linux x86-64; curl source builds used libpsl 0.21.2. HTTP DNS names were mapped with curl's --resolve, so no public DNS or /etc/hosts modification was required.
  • Limitations: The test uses github.io, the canonical PSL domain from upstream test 2318, and a marker cookie over localhost HTTP. The exploitability precondition that the PSL apex supplies the cookie remains essential.

CVE-2026-82209 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:001:57
0:00
session startedgpt-5.6-sol · CVE-2026-82209 · REPRO-20
0:05
0:06
web search
0:07
0:13
0:15
web search
0:16
web search
0:22
0:40
0:44
1:21
1:21
extract_facts
no facts extracted
1:23
1:23
supportclaim_contract
1:30
1:30
1:35
1:36
1:36
1:36
1:36
1:36
1:36
1:36
1:50
1:50
# Root Cause Analysis: CVE-2026-82209

## Summary

CVE-2026-82209 affects curl/libcurl cookie processing with libpsl enabled. A response from a host that is itself a Public Suffix List entry can set `Domain=<public-suffix>`; vulnerable curl versions retain that cookie with domain scope rather than coercing it to host-only scope. A later HTTP request to a sibling name under the suffix can therefore receive the cookie. Runtime evidence and exact vulnerable/fixed source identities will be added after executing the reproduction script.

## Impact

- **Affected component:** curl/libcurl HTTP cookie engine built with libpsl.
- **Affected versions:** 7.46.0 through 8.21.0 according to the submitted ticket; introduced by `e77b5b7453c1e8ccd7ec08` and fixed for 8.22.0.
- **Risk and consequence:** Low-severity cross-domain cookie disclosure. The public-suffix apex must issue the cookie, and the client must later contact a sibling under that suffix. If those preconditions hold, session or other cookie data can be disclosed to the sibling endpoint.

## Impact Parity

- **Disclosed/claimed maximum impact:** Information leak.
- **Reproduced impact from this run:** Pending current-run validation.
… [truncated]
1:57
08 · How to Fix

How to Fix CVE-2026-82209

Coming soon

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

10 · FAQ

FAQ: CVE-2026-82209

Is CVE-2026-82209 exploitable?

Yes. Pruva independently reproduced CVE-2026-82209 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-00348).

How severe is CVE-2026-82209?

CVE-2026-82209 is rated low severity.

What type of vulnerability is CVE-2026-82209?

CVE-2026-82209 is classified as CWE-201: Information Exposure Through Sent Data..

How can I reproduce CVE-2026-82209?

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-82209 reproduction verified?

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

References for CVE-2026-82209

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