Skip to content

CVE-2026-80231: Verified Reproduction

CVE-2026-80231: curl: native CA store flag not part of connection reuse matching, wrong trust store may authenticate reused TLS connections

CVE-2026-80231 is verified against curl/libcurl · github. Affected versions: curl 7.71.0 through 8.21.0 inclusive. This low reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00346.

REPRO-2026-00346 curl/libcurl · github Sep 11, 2026 CVE entry .txt
Severity
LOW
Confidence
HIGH
Reproduced in
40m 28s
Tool calls
329
Spend
$17.29
01 · Overview

What Is CVE-2026-80231?

CVE-2026-80231 is a low-severity vulnerability affecting curl/libcurl curl 7.71.0 through 8.21.0 inclusive.. Pruva has independently reproduced it and publishes a verified, runnable proof-of-concept (reproduction REPRO-2026-00346).

02 · Severity & CVSS

CVE-2026-80231 Severity

CVE-2026-80231 is rated low severity.

LOW threat level
Weakness CWE-488: Exposure of Data Element to Wrong Session.

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

03 · Affected Versions

Affected curl/libcurl Versions

curl/libcurl · github versions curl 7.71.0 through 8.21.0 inclusive. are affected.

How to Reproduce CVE-2026-80231

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

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

HTTPS origin certificate accepted only through native system trust, followed by a request whose explicit custom CA policy should reject it

Attack chain
  1. curl_multi API sequential same-origin transfers
  2. connection cache match
  3. reused TLS connection despite different effective native_ca_store policy
How the agent worked 565 events · 329 tool calls · 40 min
40 minDuration
329Tool calls
44Reasoning steps
565Events
8Dead-ends
Agent activity over 40 min
Policy
1
Support
15
Repro
317
Judge
57
Variant
170
Verify
1
0:0040:15

Root Cause and Exploit Chain for CVE-2026-80231

Versions: package/component: curl/libcurl virtual TLS configuration and connection cache.

CVE-2026-80231 is a libcurl TLS connection-reuse matching flaw. Before the fix, the effective native_ca_store setting was stored outside ssl_primary_config, so match_ssl_primary_config() did not include it when deciding whether a pooled connection was compatible with a later transfer. A same-origin request configured with explicit custom CA material could therefore reuse an HTTPS connection established using native system trust, even though opening a fresh connection under that later policy correctly rejected the server certificate.

  • Affected package/component: curl/libcurl virtual TLS configuration and connection cache.
  • Affected versions: curl 7.71.0 through 8.21.0, introduced by commit 148534db57dda611cf8516e92e4d6e35fc1e5074 and fixed by commit 7be1e70cb6bcd83e130ecfe8cb91b6a7dcdeff42 in curl 8.22.0.
  • Risk and consequence: A caller's later trust-store restriction is not enforced when an origin connection created under native CA trust is reused. A certificate that the later transfer's configured CA policy does not authorize is accepted through stale pooled TLS state. This is an authentication/authorization-policy bypass (CWE-488) rated Low upstream because it requires connection reuse and platform/backend native-store support.

Impact Parity

  • Disclosed/claimed maximum impact: Authorization/authentication-policy bypass through reuse of a TLS connection created under a different native CA-store setting.
  • Reproduced impact from this run: The vulnerable parent sent an HTTPS request successfully over a native-trusted pooled connection after the second easy handle explicitly selected an empty CA file. The same explicit policy on a fresh cache failed certificate verification (CURLE_PEER_FAILED_VERIFICATION, code 60). The fixed commit did not reuse that connection and failed the second request closed.
  • Parity: full.
  • Not demonstrated: No code execution, memory corruption, or privilege escalation was claimed or attempted.

Root Cause

Curl_ssl_easy_config_complete() determines whether native CA trust is active from CURLOPT_SSL_OPTIONS, native-CA build defaults, and whether the application explicitly supplied CA material. In the vulnerable parent, that result was written to ssl_config_data.native_ca_store. Connection pooling, however, calls Curl_ssl_conn_config_match(), which compares only fields in ssl_primary_config through match_ssl_primary_config(). Thus, two easy handles could have equal compared values such as ssl_options and final CAfile, while differing in the effective native CA decision. The pooled connection carried the first handle's already completed trust decision into the second transfer.

The reproducer creates exactly this state without mocking libcurl: both handles resolve to the same empty CA-file path and use ssl_options=0; the first gets the path as a build default, which leaves implicit native CA active, while the second explicitly sets the same path, marking CA material custom and disabling implicit native CA. The vulnerable matcher treats these configurations as equal. Fix commit 7be1e70cb6bc moves native_ca_store into ssl_primary_config, clones it into connections, compares it in match_ssl_primary_config(), and updates the OpenSSL, GnuTLS, rustls, and wolfSSL backends to consult connection-primary state.

Reproduction Steps

  1. Run bundle/repro/reproduction_steps.sh from any directory (the script derives or honors PRUVA_ROOT).
  2. The script uses the prepared project cache when available, resolves the fixed commit and its exact parent, verifies the patch hunk is absent/present as expected, and builds both commits with shared libcurl, GnuTLS, and CURL_CA_NATIVE=ON.
  3. It creates a localhost HTTPS certificate trusted only through GnuTLS system/native trust, starts a keep-alive HTTPS origin, compiles the real libcurl multi-API harness, and executes two vulnerable plus two fixed attempts.
  4. Expected result: the script exits 0 and prints CONFIRMED. Vulnerable logs contain ORACLE=VULNERABLE_WRONG_TRUST_REUSE; fixed logs contain ORACLE=FIXED_POLICY_ISOLATION.

Evidence

  • Runtime contract: bundle/repro/runtime_manifest.json binds target commit 7ea37abc6ac0120ba5f6d94be8d196f7cf1506bb, tested build identities, and SHA-256 digests for all proof artifacts.
  • Vulnerable observations: bundle/repro/vulnerable-attempt-1.log and vulnerable-attempt-2.log show:
    • native-default-prime code=0 ... new_connects=1 http=200
    • Reusing existing https: connection with host localhost
    • custom-same-path-shared-cache code=0 ... new_connects=0 http=200
    • Fresh control: code=60 ... new_connects=1 http=0
    • ORACLE=VULNERABLE_WRONG_TRUST_REUSE
  • Fixed negative controls: bundle/repro/fixed-attempt-1.log and fixed-attempt-2.log show the shared-cache custom policy creates a new connection and fails with code 60, followed by ORACLE=FIXED_POLICY_ISOLATION.
  • Target/linker identity: bundle/repro/build-identity-vulnerable.txt and build-identity-fixed.txt record commits, curl/GnuTLS versions, ldd resolution to each intended built libcurl.so.4, and binary SHA-256 values.
  • Origin evidence: bundle/repro/server.log records readiness and the six successful HTTP requests expected across two vulnerable reuse attempts plus two fixed priming requests.
  • Diagnostics: bundle/logs/reproduction_steps.log, build-vulnerable*.log, and build-fixed*.log.
  • Environment: Linux x86_64, GnuTLS 3.8.12, libcurl 8.22.0-DEV source at the exact vulnerable parent/fixed commits. Although the upstream advisory states deployed exposure exists on Windows/macOS, CURL_CA_NATIVE=ON with GnuTLS exposes the same real libcurl native-store decision and connection matcher on this Linux worker, allowing direct runtime validation of the root cause and fixed divergence.

Recommendations / Next Steps

  • Upgrade to curl 8.22.0 or later, or apply commit 7be1e70cb6bc.
  • As an interim mitigation, use CURLOPT_FORBID_REUSE for transfers using native CA trust, as recommended by the upstream advisory.
  • Keep every certificate-verification option that affects connection compatibility in the primary connection configuration and include it in clone, session/cache, and reuse comparisons.
  • Add upstream regression coverage equivalent to this proof for each native-CA-capable TLS backend, plus Windows and macOS product builds.

Additional Notes

  • The final reproduction script passed twice consecutively. Each invocation itself ran two vulnerable and two fixed attempts, yielding four fresh observations per role across final verification.
  • The script restores the host trust store during cleanup and generates its server certificate and server helper at runtime.
  • The only non-generated bundle dependency is bundle/repro/native_ca_reuse_harness.c; all other runtime helpers, keys, certificates, builds, and logs are created by the script.
  • The proof uses a real libcurl library API boundary and a real TLS/HTTP exchange, not a parser reimplementation, mock result, sanitizer, or source-only assertion.

CVE-2026-80231 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:002:23
0:01
session startedgpt-5.6-sol · CVE-2026-80231 · REPRO-20
0:07
0:09
web search
0:12
0:21
web search
0:22
0:23
0:25
1:36
1:36
1:36
extract_facts
no facts extracted
1:37
1:37
supportclaim_contract
1:46
1:46
1:56
1:56
1:56
1:56
1:56
1:56
2:12
2:13
# Root Cause Analysis: CVE-2026-80231

## Summary

CVE-2026-80231 is a libcurl TLS connection-reuse matching flaw. Before the fix, `CURLSSLOPT_NATIVE_CA` was stored outside `ssl_primary_config`, so `match_ssl_primary_config()` did not treat the native-CA-store choice as part of a pooled connection's identity. Sequential easy handles sharing a connection cache could therefore reuse an already authenticated HTTPS connection despite requesting a different native CA-store policy.

## Impact

- **Affected package/component:** curl/libcurl virtual TLS configuration and connection cache.
- **Affected versions:** Introduced by commit `148534db57dd` (curl 7.71.0) and fixed by commit `7be1e70cb6bc` for curl 8.22.0.
- **Risk and consequence:** On platforms/backends where native CA-store selection changes certificate validation, a connection authenticated under one trust-store policy may be reused by a handle requesting another policy. This can bypass the caller's intended peer-authentication policy. The ticket rates severity as low because exploitation depends on platform TLS behavior, shared connection reuse, and sequential requests to the same origin.

## Impact Parity

- **Disclosed/claime… [truncated]
2:23
2:23
2:23
2:23
08 · How to Fix

How to Fix CVE-2026-80231

Coming soon

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

10 · FAQ

FAQ: CVE-2026-80231

Is CVE-2026-80231 exploitable?

Yes. Pruva independently reproduced CVE-2026-80231 in curl/libcurl 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-00346).

How severe is CVE-2026-80231?

CVE-2026-80231 is rated low severity.

What type of vulnerability is CVE-2026-80231?

CVE-2026-80231 is classified as CWE-488: Exposure of Data Element to Wrong Session..

Which versions of curl/libcurl are affected by CVE-2026-80231?

curl/libcurl curl 7.71.0 through 8.21.0 inclusive. is affected by CVE-2026-80231.

How can I reproduce CVE-2026-80231?

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

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

References for CVE-2026-80231

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