CVE-2024-0853: OCSP verification bypass with TLS session reuse
What the report claims
OCSP verification is bypassed during TLS session reuse, allowing acceptance of revoked certificates.
Compare with curl's recorded outcome
Known vulnerability
A real vulnerability: CVE-2024-0853 OCSP verification bypass with TLS session reuse
Shown for comparison after analysis. The pipeline did not see this label.
ProveIt's finding
The available evidence does not settle the report. A maintainer should investigate.
Why this finding?
- The report describes a plausible security issue: OCSP verification bypass during TLS session reuse after a failed check.
- The provided source code only contains curl_easy_perform and curl_easy_setopt stubs, not the TLS backend implementation where session reuse and OCSP stapling verification occur.
- The deciding code (session cache logic, OCSP verification, interaction between them) is not present in the provided snippets, so all claims are not_verifiable against the given code.
- The report includes a concrete reproduction case (ocsptest.ddns.net) and version (8.5.0), making it specific enough to investigate if the relevant code were available.
What still needs checking
- TLS backend source files (e.g., lib/vtls.c, lib/openssl.c, lib/schannel.c) containing session reuse logic and OCSP stapling verification
- The specific commit 7cf0391bbc3b5b2e4402ce675124cd73dbe0187e from PR #12418 that the report references
How this analysis ran 5 claims · 0 citations verified
Checked against curl master on 2023-12-29 (69b6953681d3). Test evaluation split. Citation verification checks that a referenced line was in the evidence; it does not prove the model interpreted it correctly.
Review a draft reply to the reporter
Edit and verify before sending.
Thank you for the detailed report with reproduction steps. The provided code snippets do not include the TLS session reuse and OCSP verification logic needed to evaluate this claim. Could you point to the specific files/functions where session reuse is implemented (e.g., the session cache, SSL_VERIFYPEER handling, and OCSP stapling check)? This will allow us to verify whether OCSP verification is incorrectly skipped on reused sessions.
Inspect all claims and source code 5 claims · 2 code excerpts
Report claims
OCSP stapling verification is skipped during TLS session reuse
Read the reasoning
The claim that OCSP stapling verification is skipped during TLS session reuse requires examining the TLS session reuse logic and OCSP verification code. The provided source snippets only show curl_easy_perform and curl_easy_setopt stubs in lib/easy.c and lib/setopt.c. The actual TLS backend implementation (e.g., lib/vtls.c, lib/openssl.c) where session reuse and OCSP verification occur is not provided.
TLS session reuse path in libcurl
Read the reasoning
The TLS session reuse path in libcurl is not present in the provided code snippets. The code that handles session caching and reuse would be in the TLS backend files, which are not included.
Reuse an existing TLS session after a failed OCSP check
Read the reasoning
The trigger condition (reusing a TLS session after a failed OCSP check) depends on session reuse logic and OCSP verification flow, neither of which is in the provided source files.
Revoked certificates are accepted without proper revocation checking
Read the reasoning
The impact claim about revoked certificates being accepted requires verifying the certificate verification path (ssl_verify_cert or equivalent) and how it interacts with session reuse. This code is not provided.
Use curl with --cert-status on a site that has a revoked certificate and reuse the session
Read the reasoning
The reproduction steps are described clearly in the report, but the code path that would be exercised (curl_easy_perform called twice with --cert-status leading to session reuse) cannot be traced because the TLS session handling and OCSP verification code is not in the provided snippets.
Read the original report
Source code
| 782 | CURLcode curl_easy_perform(struct Curl_easy *data) |
| 783 | { |
| 784 | return easy_perform(data, FALSE); |
| 785 | } |
| 3164 | CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...) |
| 3165 | { |
| 3166 | va_list arg; |
| 3167 | CURLcode result; |
| 3168 | |
| 3169 | if(!data) |
| 3170 | return CURLE_BAD_FUNCTION_ARGUMENT; |
| 3171 | |
| 3172 | va_start(arg, tag); |
| 3173 | |
| 3174 | result = Curl_vsetopt(data, tag, arg); |
| 3175 | |
| 3176 | va_end(arg); |
| 3177 | return result; |
| 3178 | } |