Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIntercept authorization_code via URI-scheme hijack
-
DeliverySend repeated timed /token requests
-
ExploitMeasure response-time timing oracle
-
ExecutionRecover code_verifier character-by-character
-
PersistRedeem code for access token
-
ImpactAccount takeover
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V6 - Authentication Timing attack prevention
|
| Exploitation Conditions | Requires the target to use oauthlib's OAuth2 Authorization Code Grant with PKCE (RFC 7636) validation - the vulnerable code_challenge_method_plain / code_challenge_method_s256 comparison in authorization_code.py - on a vulnerable version (>=3.0.0, <4.0.0). Exploitation is heavily limited: the attacker must first independently obtain a valid authorization_code (e.g. via custom-URI-scheme hijacking, reflected in UI:R), must be able to issue and precisely time a very large volume of /token requests, and must complete character-by-character verifier recovery within the lifetime of a SINGLE-USE authorization code - which, combined with real-world network jitter dwarfing the nanosecond-per-call timing delta, makes practical exploitation marginal. Mitigated entirely by upgrading to oauthlib 4.0.0. |
| Impact | This is a genuine but low-real-world-risk defense-in-depth issue whose signals point consistently downward despite a mid-range CVSS. The vendor CVSS 3.1 vector (6.8, AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N) already encodes the key limiter as AC:H, and the C:H/I:H impact reflects the best-case downstream outcome (full account takeover) only IF the code_verifier is successfully recovered. No EPSS score, no CISA KEV listing, and no weaponized public exploit accompany this CVE - the 'Proof of Concept' in the advisory is a LOCAL Python microbenchmark (37ms delta over 10 MILLION iterations with network jitter deliberately removed), not a working remote exploit that recovers a verifier. The advisory author explicitly downgrades practical exploitability, noting that authorization codes are single-use (they expire long before a network-based char-by-char recovery could complete) and that real-world network noise swamps the nanosecond-per-call timing difference. Net: the C:H/I:H rating describes a theoretical worst case, while AC:H plus the single-use-code constraint make this closer to a code-hygiene fix than an urgent, actively-threatened flaw. Prioritize the routine upgrade to 4.0.0, but this is not a fire-drill. |
| Exploit ScenarioDerived | An attacker who has already intercepted an authorization_code (e.g. via custom-URI-scheme hijacking on a mobile client) but lacks the PKCE code_verifier sends many timed requests to the /token endpoint, measuring server response time to infer, character by character, how much of their guessed verifier matches the stored challenge, ultimately reconstructing it to redeem the code for an access token. No public working exploit exists - the referenced PoC is only a local timing microbenchmark, and single-use code expiry plus network noise make end-to-end recovery largely theoretical. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 29, 2026
PKCE verifier validation in oauthlib 3.0.0 through 3.x compares the client-supplied code_verifier against the stored challenge using Python's short-circuiting == operator, producing a measurable timing oracle (CWE-208) that could in principle allow character-by-character recovery of the verifier. The attack is remote and unauthenticated per the assessed vector (AV:N/PR:N) but requires user interaction and is heavily constrained: the attacker must first independently obtain a valid single-use authorization_code, then issue and precisely time a very large volume of /token requests within that code's short lifetime, with nanosecond-scale per-call deltas in practice dwarfed by normal network jitter. At CVSS 6.8 (AC:H) with no public exploit code and no evidence of active exploitation, this is a genuine defense-in-depth defect rather than a practical account-takeover path, and it is fully resolved by upgrading to oauthlib 4.0.0.
RemediationAI
Upgrade oauthlib to 4.0.0 or later (pip install --upgrade 'oauthlib>=4.0.0'); this is the vendor-released patch and replaces the vulnerable == comparisons in both code_challenge_method_plain and code_challenge_method_s256 with hmac.compare_digest(). The fix is delivered via https://github.com/oauthlib/oauthlib/pull/963 and commit 40b0ab56da3682c2484a4b78bbff309f8025d950, and is described in the advisory at https://github.com/oauthlib/oauthlib/security/advisories/GHSA-xpv3-w29h-x7cv. If a version bump cannot be scheduled immediately, the minimal compensating control is to apply the upstream commit as a vendored patch - a two-line change that is low risk and requires no configuration changes. Additional hardening that shrinks the practical attack window, with trade-offs: enforce strict single-use authorization codes and aggressively short code lifetimes (already required by RFC 6749 but often loosely implemented) to make character-by-character recovery infeasible within the code's validity, at the cost of failing clients that retry token requests after transient errors; rate-limit or throttle the /token endpoint per client and per source IP to frustrate the statistically large sample of requests the timing oracle needs, accepting that legitimate high-volume deployments may need tuning; and eliminate the upstream credential-theft prerequisite by migrating OAuth clients away from custom URI scheme redirects to claimed HTTPS redirect URIs as recommended by RFC 8252, which requires client-side application changes. Note that restricting the server to code_challenge_method=S256 alone is not a complete mitigation, since the S256 comparison was vulnerable in the same way before the patch; and no configuration flag in affected oauthlib versions switches the comparison to constant time.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The affected code lives in oauthlib's OAuth 2.0 Authorization Code Grant implementation (oauthlib/oauth2/rfc6749/grant_types/authorization_code.py), specifically the PKCE (RFC 7636) helper functions code_challenge_method_plain and code_challenge_method_s256. Under PKCE, a client sends a derived code_challenge with the authorization request and must later present the original code_verifier at the token endpoint; the server recomputes the challenge (for S256, base64url(SHA-256(verifier)) with trailing '=' stripped, per the diff, and for plain, the raw verifier) and compares it to the stored value. Both helpers used Python's == operator, which short-circuits: it returns False immediately when lengths differ and otherwise compares bytes left to right until the first mismatch. That behavior belongs to CWE-208 (Observable Timing Discrepancy): comparison cost grows with the length of the matching prefix, so an adversary who can measure response times precisely enough can infer the correct prefix incrementally and reconstruct the verifier. The upstream fix replaces both comparisons with hmac.compare_digest(), a constant-time primitive, and also imports the hmac module in the affected file. The package is distributed as CPE pkg:pip/oauthlib, with vulnerable ranges >= 3.0.0 and < 4.0.0, meaning the exposure applies to any Python service that embeds this library (Flask/Django OAuth providers, resource servers, API gateways) and enables PKCE on its token endpoint.
Know when Python gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N
Network-reachable and unauthenticated (AV:N/PR:N) but AC:H because timing recovery is nanosecond-scale and must beat single-use-code expiry; UI:R for the code interception; C:H/I:H reflect resulting account takeover, A:N.
Primary rating from Vendor (https://github.com/oauthlib/oauthlib).
CVSS VectorVendor: https://github.com/oauthlib/oauthlib
DescriptionCVE.org
Summary
A timing side-channel vulnerability exists in the PKCE (RFC 7636) implementation of the Authorization Code Grant flow. The code_challenge_method_plain function uses Python's standard == operator for string comparison instead of a constant-time comparison function, potentially allowing timing-based attacks.
Affected Component
- File:
oauthlib/oauth2/rfc6749/grant_types/authorization_code.py - Functions:
code_challenge_method_plain,code_challenge_method_s256 - Vulnerability Type: CWE-208 (Observable Timing Discrepancy)
Technical Details
Python's == operator uses short-circuit evaluation when comparing strings:
- Returns
Falseimmediately if lengths differ - Compares characters left-to-right, stopping at first mismatch
This means comparison time varies linearly with the length of the common prefix between the attacker-supplied verifier and the stored challenge, creating a measurable timing oracle.
Proof of Concept
Tested locally against oauthlib source (network jitter eliminated to isolate pure Python execution time):
| Input | Result | Time (10M iterations) |
|---|---|---|
Wrong first char (B + A*49) | Fast reject | 0.34106s |
49 chars correct (A*49 + B) | Deep compare | 0.37847s |
| Difference | 0.03741s |
The ~37ms delta over 10M iterations corresponds to nanosecond-level differences per call, which are statistically exploitable under controlled conditions.
Attack Scenario
- Attacker intercepts
authorization_codevia Custom URI Scheme Hijacking - PKCE blocks token request - attacker lacks
code_verifier - Attacker sends repeated requests to
/tokenendpoint measuring response times - Using timing oracle, attacker recovers
code_verifiercharacter by character - Attacker obtains Access Token → Account Takeover
> Note: Practical exploitability is limited due to the single-use nature of > authorization codes and real-world network noise. However, the vulnerable > pattern should be corrected as a defense-in-depth measure.
Recommended Fix
Replace == with hmac.compare_digest() for constant-time comparison:
cr: Elvin Latifli
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Same weakness CWE-208 – Observable Timing Discrepancy
View allSame technique Information Disclosure
View allVendor StatusVendor
SUSE
Severity: Moderate| Product | Status |
|---|---|
| SUSE Linux Enterprise Module for Public Cloud 15 SP4 | Affected |
| SUSE Linux Enterprise Server 15 SP4 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP4 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4 | Affected |
| SUSE Manager Server 4.3 | Affected |
| SUSE Manager Proxy 4.3 | Affected |
| SUSE Manager Retail Branch Server 4.3 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP7 | Affected |
| SUSE Linux Enterprise Server 15 SP7 | Affected |
| SUSE Linux Enterprise Desktop 15 SP7 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP7 | Affected |
| SUSE Linux Enterprise Desktop 15 SP7 | Affected |
| SUSE Linux Enterprise High Performance Computing 12 | Affected |
| SUSE Linux Enterprise Micro 5.5 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP7 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP7 | Affected |
| SUSE Linux Enterprise Server 15 SP7 | Affected |
| SUSE Linux Enterprise Server 16.0 | Affected |
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP7 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.0 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
| SUSE Linux Micro 6.0 | Affected |
| SUSE Linux Micro 6.1 | Affected |
| SUSE Linux Micro 6.2 | Affected |
| openSUSE Leap 16.0 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5-LTSS | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP6 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 12 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Python 3 15 SP6 | Affected |
| SUSE Linux Enterprise Server 12 SP5 | Affected |
| SUSE Linux Enterprise Server 12 SP5-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP4 | Affected |
| SUSE Linux Enterprise Server 15 SP4-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP5 | Affected |
| SUSE Linux Enterprise Server 15 SP5-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP6 | Affected |
| SUSE Linux Enterprise Server 15 SP6-LTSS | Affected |
| SUSE Linux Enterprise Server LTSS Extended Security 12 SP5 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 SP5 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP4 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP5 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP6 | Affected |
| SUSE CaaS Platform 3.0 | Affected |
| SUSE CaaS Platform 4.0 | Affected |
| SUSE Enterprise Storage 6 | Affected |
| SUSE Enterprise Storage 7 | Affected |
| SUSE Enterprise Storage 7.1 | Affected |
| SUSE Linux Enterprise Desktop 15 SP1 | Affected |
| SUSE Linux Enterprise Desktop 15 SP2 | Affected |
| SUSE Linux Enterprise Desktop 15 SP3 | Affected |
| SUSE Linux Enterprise Desktop 15 SP4 | Affected |
| SUSE Linux Enterprise Desktop 15 SP5 | Affected |
| SUSE Linux Enterprise Desktop 15 SP6 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP1 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP1-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP1-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5-ESPOS | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP1 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP2 | Affected |
| SUSE Linux Enterprise Module for Basesystem 15 SP3 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP1 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP2 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP3 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 15 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 15 SP1 | Affected |
| SUSE Linux Enterprise Module for Public Cloud 15 SP2 | Affected |
| SUSE Linux Enterprise Real Time 15 SP2 | Affected |
| SUSE Linux Enterprise Real Time 15 SP3 | Affected |
| SUSE Linux Enterprise Real Time 15 SP4 | Affected |
| SUSE Linux Enterprise Server 12 | Affected |
| SUSE Linux Enterprise Server 12 SP3 | Affected |
| SUSE Linux Enterprise Server 12 SP4 | Affected |
| SUSE Linux Enterprise Server 15 | Affected |
| SUSE Linux Enterprise Server 15 SP1 | Affected |
| SUSE Linux Enterprise Server 15 SP1-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP1-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP2 | Affected |
| SUSE Linux Enterprise Server 15 SP2-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP2-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP3 | Affected |
| SUSE Linux Enterprise Server 15 SP3-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP3-LTSS | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 SP3 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 12 SP4 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP1 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP2 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP3 | Affected |
| SUSE Manager Proxy 4.0 | Affected |
| SUSE Manager Proxy 4.1 | Affected |
| SUSE Manager Proxy 4.2 | Affected |
| SUSE Manager Proxy 4.3 | Affected |
| SUSE Manager Proxy LTS 4.3 | Affected |
| SUSE Manager Retail Branch Server 4.0 | Affected |
| SUSE Manager Retail Branch Server 4.1 | Affected |
| SUSE Manager Retail Branch Server 4.2 | Affected |
| SUSE Manager Retail Branch Server 4.3 | Affected |
| SUSE Manager Retail Branch Server LTS 4.3 | Affected |
| SUSE Manager Server 3.2 | Affected |
| SUSE Manager Server 4.0 | Affected |
| SUSE Manager Server 4.1 | Affected |
| SUSE Manager Server 4.2 | Affected |
| SUSE Manager Server 4.3 | Affected |
| SUSE Manager Server LTS 4.3 | Affected |
| SUSE OpenStack Cloud 7 | Affected |
| SUSE OpenStack Cloud 8 | Affected |
| SUSE OpenStack Cloud Crowbar 8 | Affected |
| openSUSE Leap 15.3 | Affected |
| openSUSE Leap 15.4 | Affected |
| openSUSE Leap 15.5 | Affected |
| openSUSE Leap 15.6 | Affected |
| SUSE Linux Enterprise Server for NVIDIA 16.1 | Affected |
EUVD-2026-98833
GHSA-xpv3-w29h-x7cv
NVD
CVE.org
EPSS
Exploit-DB