CVE-2026-46715

MEDIUMPre-NVD 0.0
0.0
EchelonGraph verdictMonitorLow exploitation likelihood right now — keep watching.
  • No confirmed exploitation signals yet
CISA-KEV: Not listedEPSS: 0%CVSS: Exploit: NoneExposed: 0

No vendor fix yet — apply a workaround or compensating control (WAF / firewall / segmentation) and watch for a patch.

Flask-Security-Too OAuth reauthentication freshness bypass via cross- user OAuth identity acceptance

Summary

Flask-Security-Too 5.8.0's OAuth reauthentication flow can mark a session as fresh after verifying an OAuth account that belongs to a different user.

If an attacker can operate an already-authenticated but stale victim session, they can complete OAuth verification using their own OAuth identity. The victim session is then treated as recently reauthenticated, allowing freshness-protected account actions to proceed. This was reproduced against the built-in /change-username route.

### Details

The issue is in the OAuth verification callback.

_oauth_response_common() resolves the OAuth provider identity to a Flask-Security user:

  • flask_security/oauth_glue.py:101-108

oauth_verify_response() then accepts any resolved user and updates the current session freshness timestamp:

  • flask_security/oauth_glue.py:182-214
  • flask_security/oauth_glue.py:201-204

The missing check is that the OAuth-resolved user must match the current authenticated session user. In the failing case:

So the attacker is not logging in as the victim, but they are satisfying the victim session's reauthentication requirement with a different account.

### PoC

Tested version:

  • Flask-Security-Too 5.8.0
  • tag 5.8.0
  • commit 08288dff6907e413d848a16aaf43fc2c2b2a3b72

Used a minimal Flask app with:

```python SECURITY_OAUTH_ENABLE = True SECURITY_OAUTH_BUILTIN_PROVIDERS = ["github"] SECURITY_FRESHNESS = timedelta(seconds=1) SECURITY_FRESHNESS_GRACE_PERIOD = timedelta(seconds=0) SECURITY_USERNAME_ENABLE = True SECURITY_CHANGE_USERNAME = True

The OAuth provider was replaced with a localhost mock provider returning [email protected]. This avoids hitting a live third-party provider while still exercising Flask-Security-Too's real OAuth verification handler.

Reproduction steps:

  • Log in as [email protected].
  • Wait until the session is no longer fresh.
  • Confirm POST /change-username is blocked with 401 and
reauth_required=true.
  • Start OAuth verification with POST /login/oauth-verify-start/
github.
  • Complete the callback with an OAuth identity for
[email protected]. been updated.
  • Retry POST /change-username.
  • The victim user's username is changed successfully.

Observed result:

{ "pre_bypass_status": 401, "pre_bypass_reauth_required": true, "attacker_identity": "[email protected]", "oauth_verify_response_status": 302, "post_bypass_change_username_status": 200, "final_email": "[email protected]", "final_username": "victimowned1777878574", "direct_impact_verified": true }

Note: CSRF was disabled in the local harness only to keep the test focused on the reauthentication check. This is not a CSRF bypass report.

This bypasses Flask-Security-Too's freshness/reauthentication boundary.

Applications using OAuth verification together with freshness- protected account operations may allow a stale victim session to be refreshed using a different user's OAuth account. In my test, this allowed the victim account's username to be changed through Flask- Security-Too's built-in /change-username route.

A likely fix is to reject OAuth verification unless the resolved OAuth user matches current_user before updating session["fs_paa"].

CVSS v3
EG Score
0.0(none)
EPSS
10.9%
KEV
Not listed

Published

May 22, 2026

Last Modified

May 22, 2026

Vendor Advisories for CVE-2026-46715(1)

These vendors published their own advisory mentioning this CVE — often with vendor-specific remediation steps + affected product lists not in NVD.

Affected Packages

(1 across 1 ecosystem)
PyPI(1)
PackageVulnerable rangeFixed inDependents
flask-security-too5.8.05.8.1

Data Freshness Timeline

(refreshed 0× in last 7d / 4× in last 30d)

Each row is a source pipeline that fetched or updated this CVE on that date, with what changed. For example, "NVD update" means NVD published or revised its analysis for this CVE; "MITRE cvelistV5" means we ingested or refreshed it from the CNA feed. Most recent first.

  1. 2026-06-14 23:18 UTCEPSS rescore
  2. 2026-06-13 23:00 UTCEPSS rescore
  3. 2026-06-13 07:59 UTCEG score recompute
  4. 2026-06-12 23:12 UTCEPSS rescore
  5. 2026-05-24 06:09 UTCEG score recompute

Frequently asked(4)

What is CVE-2026-46715?
CVE-2026-46715 is a medium vulnerability published on May 22, 2026. Flask-Security-Too OAuth reauthentication freshness bypass via cross- user OAuth identity acceptance Summary Flask-Security-Too 5.8.0's OAuth reauthentication flow can mark a session as fresh after verifying an OAuth account that belongs to a different user. If an attacker can operate an…
When was CVE-2026-46715 disclosed?
CVE-2026-46715 was first published in the National Vulnerability Database on May 22, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
Is CVE-2026-46715 actively exploited?
CVE-2026-46715 is not currently on CISA's Known Exploited Vulnerabilities catalog. FIRST EPSS estimates a 10.9% percentile likelihood of exploitation in the next 30 days — higher percentiles indicate greater predicted risk.
How do I remediate CVE-2026-46715?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2026-46715, EchelonGraph cross-links them in the Vendor Advisories panel below — those typically contain the canonical remediation steps, fixed version numbers, and any vendor-specific mitigations.

Dependency Blast Radius

See which npm, PyPI, Go, and Maven packages are affected by CVE-2026-46715

Explore →

Is Your Infrastructure Affected by CVE-2026-46715?

EchelonGraph automatically scans your cloud infrastructure and maps CVE exposure using blast radius analysis.