Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSteal victim DRF/JWT token out-of-band
-
DeliveryVictim logs out and changes password
-
ExploitReplay unrevoked token against /api/v2/*
-
ExecutionRefresh JWT to mint new access tokens
-
ImpactRetain access to victim account data
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Authentication mechanism validation
MITRE ATT&CK
2 techniques across 2 tactics: Defense Evasion, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires the attacker to already possess a valid stolen bearer credential - either a DRF authtoken sent as 'Authorization: Token ...' or a SimpleJWT refresh token obtained from POST /api/v2/token; the vulnerability itself provides no means to acquire that token. The defining condition is that lifecycle events fail to revoke credentials: /user/logout only clears the Django session cookie and password change only updates the hash, leaving rows in authtoken_token valid and JWT refresh tokens usable (no server-side revocation list or token versioning). LIMITING FACTORS: no token theft, no exploit; DRF tokens persist until manually rotated/deleted and JWT refresh tokens until natural expiry, so impact window depends on configured REFRESH_TOKEN_LIFETIME; only affects wger versions prior to 2.6. |
| Impact | This is a moderate, defense-in-depth authentication weakness (CWE-287) rather than a high-urgency flaw. The provided CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N, base 4.8 Medium) correctly reflects that the vulnerability is network-reachable but gated behind high attack complexity, because exploitation is impossible without first obtaining the victim's bearer credential through some out-of-band means. The PR:N label is technically accurate (the attacker does not authenticate with their own account) but is misleading in isolation - the real precondition is possession of a stolen DRF authtoken or JWT refresh token, so this is effectively a post-compromise persistence/privilege-retention issue, not a primary access vector. No EPSS score, no SSVC decision data, and no CISA KEV listing are present in the input, so automatable/exploitation-maturity signals cannot be compared; absence of EPSS/KEV is not evidence of safety but does suggest this is not a mass-exploited target. A detailed, runnable proof-of-concept is published in the GHSA advisory, so publicly available exploit code exists - but POC availability must not be conflated with active exploitation, which is not indicated by any source here. Net: real but low-to-medium priority for internet-facing self-hosted instances, driven mainly by the fact that logout and password change - the exact actions a user takes after suspecting compromise - fail to revoke access. |
| Exploit ScenarioDerived | An attacker who has already captured a user's API token (e.g., via leaked browser/local storage, an XSS, or intercepted traffic) continues calling /api/v2/* endpoints even after the victim notices the compromise and logs out and changes their password. Because neither action revokes the DRF authtoken or JWT refresh token, the stolen credential keeps working - and the JWT refresh token can mint fresh access tokens until it naturally expires. A copy-paste Python PoC demonstrating token replay after password change is published in the vendor's GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 07, 2026
wger before 2.6 fails to revoke bearer-style API credentials on logout or password change, allowing an attacker who already holds a stolen DRF authtoken or JWT refresh token to continue accessing protected /api/v2/* endpoints. The assessed CVSS is 4.8 with vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N, reflecting a moderate defense-in-depth authentication weakness rather than a high-urgency flaw. Publicly available exploit code exists in the form of proof-of-concept replay steps, but exploitation requires prior token theft and the vulnerability provides no means to obtain the token; active exploitation is not confirmed.
RemediationAI
Upgrade to wger 2.6 or later, which contains the vendor-released patch and implements JWT refresh-token rotation with blacklist-after-rotation. If immediate upgrade is not possible, manually rotate or delete all DRF authtokens via /user/api-key and invalidate or blacklist existing JWT refresh tokens; reduce REFRESH_TOKEN_LIFETIME to a short interval such as 3000 seconds to shrink the window, accepting more frequent re-authentication as a trade-off. Because logout and password change alone do not revoke credentials in vulnerable versions, users should assume stolen tokens remain valid and administrators should consider rotating signing keys if server-side revocation is unavailable, at the cost of invalidating all sessions. Advisory: https://github.com/wger-project/wger/security/advisories/GHSA-v3x9-6gg8-c2c9; patched release: https://github.com/wger-project/wger/releases/tag/2.6.
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 issue is CWE-287 improper authentication in wger's Django REST Framework and SimpleJWT token lifecycle. When a user logs out, /user/logout calls django_logout() and only clears the Django session cookie; password changes update the password hash but leave existing rows in authtoken_token valid and leave JWT refresh tokens usable because there is no server-side revocation list or token versioning. DRF tokens sent as 'Authorization: Token ...' persist until manually rotated or deleted, while JWT refresh tokens can keep minting new access tokens until natural expiry. The affected CPE is cpe:2.3:a:wger-project:wger:*:*:*:*:*:*:*:*; vulnerable files include wger/core/views/user.py, settings_global.py, main.py, and utils/api_token.py. wger 2.6 adds refresh-token rotation on every use and blacklist-after-rotation, making refresh tokens single-use and recommending a short REFRESH_TOKEN_LIFETIME such as 3000 seconds.
Know when Wger 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:N/S:U/C:L/I:L/A:N
AC:H because a token must first be stolen out-of-band and used within its validity window; PR:N since the attacker replays the victim's credential rather than their own; C:L/I:L and A:N as access is account-scoped with no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
wger is a free, open-source workout and fitness manager. Versions prior to 2.6 have a vulnerability in the authentication/session lifecycle of wger where bearer-style API credentials remain valid after a user logs out and after a user changes their password. An attacker who steals a victim’s DRF authtoken (Authorization: Token ...) or JWT refresh token can continue to access protected /api/v2/* endpoints until the token is manually rotated/deleted (DRF token) or naturally expires (JWT refresh). Version 2.6 contains a patch.
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
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
Improper Restriction of Excessive Authentication Attempts in GitHub repository wger-project/wger prior to 2.2. Rated cri
Cross Site Scripting vulnerability in wger Project wger Workout Manager v.2.2.0a3 allows a remote attacker to gain privi
Cross Site Request Forgery (CSRF) vulnerability in wger Project wger Workout Manager 2.2.0a3 allows a remote attacker to
Wger versions up to 2.4 allow authenticated users to access other users' private nutrition plans through insecure direct
Wger versions up to 2.4 expose all users' repetition configuration data to any authenticated attacker due to missing aut
Uncontrolled resource consumption in wger before 2.5 allows any authenticated user to exhaust server worker threads and
wger is a free, open-source workout and fitness manager. Five routine detail action endpoints check a cache before calli
Account-deactivation privilege escalation in wger before 2.6 lets an authenticated user who holds only the gym_trainer r
Cross-user integrity corruption in wger versions prior to 2.6 allows authenticated attackers to inject arbitrary workout
Incomplete authorization fix in wger through master exposes three user-management views in wger/core/views/user.py to th
wger before 2.6 contains a CSRF bypass (CWE-352) that lets an attacker-controlled web page silently rebind an authentica
Cross-site request forgery in wger's gym password-reset endpoint allows a remote attacker to force an arbitrary member's
EUVD-2026-94334
GHSA-v3x9-6gg8-c2c9
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB