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
- CVE-2026-119776 · High
- CVE-2026-100302 · Medium
- CVE-2026-115448 · High
- CVE-2026-100252 · High
- CVE-2026-100235 · Medium
- 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
Upgrade
CVE-2026-115910 lists a fix boundary at 6.2.0. Compare the installed build with that boundary before you change production.
Version check
Affected <= 6.1.1
Advisory
Open the cve_org record and follow its fix.
Official advisories
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.
Oct 26, 2026 · Red Hat Security Data
Detected
social-auth-core: social-auth-core: Account takeover via improper OpenID Connect nonce binding
Oct 28, 2026 · GitHub Advisory Database
Fix available
social-auth-core fixed in 6.2.0
Oct 28, 2026 · GitHub Advisory Database
Fix available
social-auth-core fixed in 6.2.0
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
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