Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain victim's unused authorization code
-
DeliveryStart attacker's own OIDC login for valid state
-
ExploitSubmit victim code with attacker state
-
ExecutionNonce passes via global association table
-
ImpactAttacker browser authenticated as victim
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V15 - Secure Coding and Architecture Data authenticity verification
|
| Exploitation Conditions | Exploitation requires three concrete preconditions drawn from the advisory: (1) the target must use OpenIdConnectAuth or a backend built on it with the default DEFAULT_USE_PKCE=False configuration (SOCIAL_AUTH_*_USE_PKCE not enabled) - the PoC controls show that enabling PKCE makes the attack fail with an authorization-code rejection; (2) a victim login must be in progress so that a valid, unredeemed OpenID Connect authorization code exists; and (3) the attacker must actually obtain that victim's unused authorization code. Limiting factors that reduce realistic risk: the attack fails entirely if PKCE is enabled, it depends on timing (the victim's code must still be unredeemed), it requires the victim to perform a login (UI:R), and it is fully remediated by upgrading to 6.2.0, which binds the nonce to the initiating browser session and OAuth state. |
| Impact | This is a genuine authentication/account-takeover flaw (CWE-345 insufficient verification plus CWE-384 session fixation per the GHSA advisory) rated CVSS 6.8 (medium). The supplied vector CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N is internally consistent with the mechanism: network-reachable (AV:N), no attacker privileges (PR:N), but high complexity (AC:H) because the attacker must first obtain a victim's unused/unredeemed OIDC authorization code, and user interaction (UI:R) because the attack depends on a victim login being in flight. The signals are coherent rather than conflicting: a working proof-of-concept is published in the GHSA advisory (two scripts, mockidp.py and social_nonce.py, with demonstrated '[inject] attacker session completes with victim code' output on 6.1.1), so publicly available exploit code exists, but there is no CISA KEV listing and no EPSS score was provided, so there is no evidence of active or widespread exploitation. The vuln.today decision label is 'this_month' (not act_now/emergency), aligning with a medium-priority, patch-this-cycle posture. The practical risk is bounded by two real limiters confirmed in the evidence: exploitation requires the default PKCE-disabled configuration, and it requires harvesting a victim's unused authorization code - the PoC controls show that enabling PKCE causes the attack to fail outright. This is a real priority for anyone running the generic OpenID Connect backend in its default (PKCE-off) mode, but not a drop-everything emergency on the available signals. |
| Exploit ScenarioDerived | A victim begins an OpenID Connect login and the attacker obtains the resulting unused authorization code (e.g. via a leaked redirect or referrer). The attacker starts their own login to obtain a valid OAuth state for their browser, then submits the victim's code with the attacker's state; because the nonce lives in a global association table rather than being bound to the initiating session, nonce validation passes and the attacker's browser ends up authenticated as the victim. A complete working proof-of-concept demonstrating this is published in the GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 26, 2026
Authorization-code injection in the generic OpenID Connect backend of social-auth-core lets an attacker who holds a victim's unused OIDC authorization code redeem it inside their own browser and be authenticated as the victim. The nonce is stored in a shared OpenIdConnectAssociation table and is only checked for existence and expiry, not for binding to the browser session and OAuth state that started the login, so the callback succeeds even though the state belongs to the attacker; the flaw is exploitable only with the default DEFAULT_USE_PKCE = False. Affected are social-auth-core releases before 6.2.0 (reproduced on 6.1.1, 6.1.0 and 5.2.0, code identical on master) including every backend derived from OpenIdConnectAuth; CVSS 6.8 reflects that the attacker must first obtain a live victim code and lure the victim through a login (AC:H, UI:R). A public PoC reference is published with the GHSA advisory, no CISA KEV entry or confirmed active exploitation exists, and the vendor fixed the issue in 6.2.0.
RemediationAI
Vendor-released patch: social-auth-core 6.2.0. Upgrade the package (pip install 'social-auth-core>=6.2.0') along with any dependent package such as social-auth-app-django that pins an older social-core; the fix, merged in PR https://github.com/python-social-auth/social-core/pull/2141 (commit c2f2ae4663bef19ee8b07f2cf5a2344f9155d826), stores the nonce inside the browser's pending transaction context, compares it with constant_time_compare against the expected value for the validated state, and additionally requires the association's assoc_type to equal the state, raising a nonce_mismatch AuthSessionError otherwise. The changelog notes that in-progress OIDC logins must restart after upgrading because pre-upgrade transaction records carry no session-bound nonce, so deploy during a quiet window or expect a one-time re-login for users mid-flow. Where upgrading is not immediately possible, enable PKCE on the backend (SOCIAL_AUTH_OIDC_USE_PKCE = True, or the per-backend SOCIAL_AUTH_<BACKEND>_USE_PKCE setting) so that a stolen code submitted without the matching code_verifier is rejected by the provider; the advisory's control run shows the injection attempt failing with an authorization-code rejection under PKCE. That workaround depends on the identity provider advertising and enforcing S256 code_challenge_methods_supported, changes the authorization request sent to the IdP, and should be verified against the provider before rollout since it does not repair the underlying nonce logic.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in pypi, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
OpenID Connect's nonce is the relying party's defence against authorization code injection: per OIDC Core section 15.5.2 and RFC 9700 section 4.5, the nonce echoed in the ID token must be tied to the browser session that initiated the request. In social_core/backends/open_id_connect.py (6.1.1), auth_params calls get_and_store_nonce(), which persists the nonce as an OpenIdConnectAssociation keyed by server_url and handle=nonce, writing the OAuth state into assoc_type but never reading it back; get_nonce() then looks the nonce up by server_url and handle only, and validate_claims() accepts any stored, unexpired nonce and deletes it. Because the association store is global rather than per-session, a token minted for one browser validates in another. The root cause maps to CWE-345 (insufficient verification of authenticity) and, per the GHSA advisory, CWE-384 (session fixation): the attacker starts a login to obtain a state valid for their own session, then submits the victim's code with that state, so the state check passes on the attacker's session while the nonce check passes against the victim's globally stored nonce. PKCE would close the gap, but OpenIdConnectAuth overrides the OAuth2 base class default and sets DEFAULT_USE_PKCE = False, leaving the nonce as the sole binding in a default deployment. The trigger path in the reported reproduction requires a locally running OpenID provider that enforces redirect_uri and, when a code_challenge is present, PKCE; no evidence describes other deployment-specific variants.
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
AC:H because the attacker must capture a victim's unused authorization code under the default PKCE-disabled config; UI:R for the required victim login; account takeover yields C:H/I:H, no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Python Social Auth is a social authentication and registration mechanism. Prior to 6.2.0, OpenIdConnectAuth in social_core/backends/open_id_connect.py uses get_and_store_nonce to place the OpenID Connect nonce in a shared OpenIdConnectAssociation table, and get_nonce and validate_claims verify only that the nonce exists and has not expired rather than binding it to the browser session and OAuth state that initiated the login. An attacker who obtains a victim's unused authorization code can start a separate login to obtain valid state for the attacker's browser, submit the victim's code with that state, and pass nonce validation because the victim nonce is globally available. With DEFAULT_USE_PKCE disabled in the default OpenIdConnectAuth configuration, the attacker can be logged in as the victim. This issue is fixed in version 6.2.0.
Blast Radius
ecosystem impact- 124 pypi packages depend on social-auth-core (46 direct, 83 indirect)
Ecosystem-wide dependent count for version 6.2.0.
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
EUVD-2026-109993
GHSA-h2r5-x5m7-3935
NVD
CVE.org
EPSS
Exploit-DB