Vulnerabilities

Vulnerability · CVE-2026-115910

Python Social Auth: OpenID Connect nonce is not bound to the browser session, so a stolen authorization code logs the attacker in as the victim

Published Oct 26, 2026 · catalog updated Oct 31, 2026 · Red Hat Red Hat Enterprise Linux

Last checked Nov 5, 2026. A connected source was read within the last 7 days.

Check if you run it

No confirmed exploitation is on record for CVE-2026-115910. EPSS is 0.16%. Act only if a listed version of Red Hat Red Hat Enterprise Linux is installed.

Gaps on this record

  • No vendor fix or required action is stored. Compare the linked advisory before you change production.

Same product and reporting

Severity
Medium6.8
Known exploitation
Not in CISA/VulnCheck KEV
EPSS
0.16%
Remediation
Version ranges on file
Affected products
PyPI social-auth-core · pip social-auth-core · pypi social-auth-core

### Summary The generic OpenID Connect backend ( and every backend built on it) stores the in the shared Association table, not in the user's session. When the ID token comes back, only checks that the nonce exists in that table and is not expired. It does not check that the nonce was issued to the browser that is finishing the login. So the nonce does not do its job. OIDC Core (section 15.5.2) and RFC 9700 (section 4.5) use the nonce to stop authorization code injection: an attacker who gets hold of a victim's unused authorization code should not be able to redeem it in the attacker's own browser. With social-auth-core, the attacker can. They start their own login to get a valid for their session, then hit the callback with the victim's and their own . passes because it belongs to the attacker's session, and the nonce in the victim's ID token passes because it is in the global table. The attacker's browser is now logged in as the victim. PKCE would block this, but sets (the OAuth2 base class defaults to ), so the nonce is the only binding in the default setup. ### Tested versions social-auth-core 6.1.1 (latest), 6.1.0 and 5.2.0, with social-auth-app-django 7.1.0 and Django 6.1.2, Python 3.14. The same code is on master (098ef399c1). ### Details in 6.1.1: - line 252: calls - lines 333 to 346: stores the nonce as an keyed by and . The state goes into but is never read back. - lines 348 to 358: looks the nonce up by and only - lines 393 to 415: accepts any stored, unexpired nonce and removes it - line 110: ### PoC Everything runs locally. is a small OpenID provider on 127.0.0.1 that checks and enforces PKCE when a was sent, like a normal provider. uses two Django test clients as two browsers. Output on 6.1.1: Controls: So the nonce check runs, but it accepts a nonce that belongs to another browser. With PKCE on, the same attack fails. mockidp.py: social_nonce.py: ### Impact An attacker who gets a victim's authorization code before it is used can log in to the relying

Are you affected?

Enter the version you run. The result uses only the ranges stored on this record.

The check returns affected, not affected, or incomplete. It does not guess a version that is missing from the record.

  • PyPI social-auth-core0 → 6.2.0
  • pip social-auth-core<= 6.1.1
  • pypi social-auth-coreversion unspecified

How to fix CVE-2026-115910

What to do

Three questions, each answered from this record only. Confirm the vendor advisory before you patch.

Should you patch?

No confirmed exploitation is on record for CVE-2026-115910. EPSS is 0.16%. Act only if a listed version of Red Hat Red Hat Enterprise Linux is installed.

Which versions are affected?

Compare what you have installed with 0 → 6.2.0, <= 6.1.1. Compare the installed version with the linked vendor advisory before you change production.

What should an analyst verify?

CWE-303; CWE-345: Insufficient Verification of Data Authenticity; CWE-384. EPSS 0.16%. There is no CISA KEV listing. No Exploit-DB or Metasploit reference is linked. Use the source links for the original advisory.

Code

The project this record applies to. Exploit listings stay in References.

Timeline

Detection, updates, and resolution for this record.

  1. Oct 26, 2026 · Red Hat Security Data

    Detected

    social-auth-core: social-auth-core: Account takeover via improper OpenID Connect nonce binding

  2. Oct 28, 2026 · GitHub Advisory Database

    Fix available

    social-auth-core fixed in 6.2.0

  3. Oct 28, 2026 · GitHub Advisory Database

    Fix available

    social-auth-core fixed in 6.2.0

  4. Oct 28, 2026 · GitHub Advisory Database

    Updated

    ### Summary The generic OpenID Connect backend ( and every backend built on it) stores the in the shared Association table, not in the user's session. When the ID token comes back, only checks that the nonce exists in that table and is not expired. It does not check that the nonce was issued to the browser that is finishing the login. So the nonce does not do its job. OIDC Core (section 15.5.2) an

  5. Oct 31, 2026 · NIST NVD

    Updated

    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 st

Sources

  • CVE.orgVulnerability recordCVE-2026-115910

    Official CVE identifier

    cve.org
  • GitHub Advisory DatabasePackage advisoryGHSA-h2r5-x5m7-3935

    Python Social Auth: OpenID Connect nonce is not bound to the browser session, so a stolen authorization code logs the attacker in as the victim

    github.com
  • GitLab Advisory DatabasePackage advisoryCVE-2026-115910

    The generic OpenID Connect backend (OpenIdConnectAuth and every backend built on it) stores the nonce in the shared Association table, not in the user's session. When the ID token comes back, validate_claims only checks that the nonce exists in that table and is not expired. It does not check that the nonce was issued to the browser that is finishing the login. So the nonce does not do its job. …

    advisories.gitlab.com
  • NIST NVDVulnerability recordCVE-2026-115910

    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

    nvd.nist.gov
  • OpenSSF OSV / OSV ScannerPackage advisoryGHSA-h2r5-x5m7-3935

    Python Social Auth: OpenID Connect nonce is not bound to the browser session, so a stolen authorization code logs the attacker in as the victim

    osv.dev
  • Red Hat Security DataVendor advisoryCVE-2026-115910

    social-auth-core: social-auth-core: Account takeover via improper OpenID Connect nonce binding

    access.redhat.com

References

Freshness

Last verified in this catalog Nov 5, 2026. Significant claims (KEV, EPSS, CVSS, affected ranges) come from the source rows above — open the original publisher for the authoritative advisory.

  • NIST NVDOct 31, 2026
  • GitHub Advisory DatabaseOct 30, 2026
  • GitLab Advisory DatabaseOct 29, 2026
  • OpenSSF OSV / OSV ScannerOct 29, 2026
  • CVE.orgOct 27, 2026
  • Red Hat Security DataOct 27, 2026