Skip to main content

wger CVE-2026-45161

| EUVDEUVD-2026-94331 MEDIUM
Cross-Site Request Forgery (CSRF) (CWE-352)
2026-10-07 GitHub_M GHSA-xf64-4pmc-h8qf
5.4
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Lure authenticated trainer to malicious page
  2. Delivery
    Browser auto-GETs trainer-login via <img> tag
  3. Exploit
    ?next= redirect chain bypasses SameSite=Lax
  4. Execution
    Server calls django_login() without CSRF check
  5. Impact
    Trainer session rebound to attacker-chosen user

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V3 - Web Frontend Security Anti-CSRF tokens, SameSite cookies
MITRE ATT&CK

1 technique across 1 tactic: 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 an active, authenticated trainer session in wger and that the trainer be socially engineered into loading an attacker-controlled page containing an <img> (or similar subresource) pointing at GET /en/user/<user_pk>/trainer-login. A critical technical precondition is defeating the browser's default SameSite=Lax cookie policy: the advisory shows this is achieved via the view's ?next= handling, where a 302 to /user/login?next=... produces a same-origin redirect hop that reattaches the session cookie. Limiting factors that reduce realistic risk: the victim must hold trainer privileges, user interaction (visiting the page) is mandatory, and the attack depends on the specific redirect-chain bypass rather than a direct cross-origin request - these constraints mean exploitation is targeted, not opportunistic or wormable. Fixed by upgrading to wger 2.6, which adds @require_POST and validates the redirect target.

Impact

This is a genuine but moderate-severity CSRF flaw (CWE-352) whose real-world risk is tempered by several limiting factors. The provided CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N, base 5.4) correctly reflects network reach but requires user interaction (a trainer loading a malicious page) and a privileged victim session, keeping impact at Low/Low. No EPSS score was supplied and the CVE is NOT on CISA KEV, so there is no confirmed active exploitation. The advisory contains a Playwright-verified SameSite-Lax bypass description but does not publish a reusable exploit repository, so this is best characterized as 'no public exploit identified' rather than POC-available - the detailed bypass writeup does, however, lower the barrier for an attacker to reproduce it. One notable caveat: the CVSS AC:L understates the real difficulty, since modern browsers default to SameSite=Lax and the attack depends on a specific ?next= same-origin redirect chain to attach the cookie - verify the AC rating against the documented bypass. Net: a legitimate issue worth patching for any wger instance with trainer accounts, but not a drop-everything priority given no KEV, no published POC, the UI:R requirement, and the niche deployment footprint.

Exploit ScenarioDerived

An attacker hosts a web page containing <img src="https://wger.target/en/user/2/trainer-login">. When an authenticated wger trainer is lured into visiting that page, their browser auto-issues the GET with the session cookie (chained through a ?next= same-origin redirect to defeat SameSite=Lax), and the server silently rebinds the trainer's session to user account 2. No public exploit package exists, though the advisory documents the technique in enough detail to reproduce.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 07, 2026

wger before 2.6 contains a CSRF bypass (CWE-352) that lets an attacker-controlled web page silently rebind an authenticated trainer's session to an arbitrary user account. Because the trainer_login view (wger/core/views/user.py, ~lines 161-210) accepts GET and calls django_login() directly, it falls outside Django's CsrfViewMiddleware enforcement, which only checks unsafe methods; a single <img> tag pointing at /en/user/<user_pk>/trainer-login forces the victim's browser to issue the request with the session cookie attached. Exploitation is authenticated (CVSS PR:L) and requires user interaction (UI:R) - the trainer must hold trainer privileges and be lured onto the malicious page - and, per the assessed vector, it depends on a non-trivial SameSite=Lax bypass via the view's ?next= 302 redirect chain, which raises attack complexity to AC:H and makes this a targeted rather than opportunistic or wormable issue. No CISA KEV listing or independent public exploit code was identified at time of analysis, though the vendor advisory documents a Playwright-verified reproduction in Chromium 147.

RemediationAI

Upgrade to the vendor-released patch in wger 2.6 (https://github.com/wger-project/wger/releases/tag/2.6), which adds @require_POST to the trainer_login view and validates the redirect target with url_has_allowed_host_and_scheme, moving ?next= handling into the POST body. Be aware that 2.6 is a breaking release: it introduces offline-mode backend changes, social login and 2FA support (all users must re-login), and JWT refresh-token rotation with blacklist-after-rotation - plan a maintenance window and review prod.env settings, particularly REFRESH_TOKEN_LIFETIME, before upgrading. If an immediate upgrade is not possible, the most effective compensating control is to make the endpoint unreachable for GET: front the application with a reverse proxy or WAF rule that rejects GET to /user/*/trainer-login (the trade-off is that any legitimate trainer-switching UI depends on this route, so verify whether that feature is in use before blocking it). A second option is setting SESSION_COOKIE_SAMESITE='Strict' in Django settings, which blocks the cookie from riding along the same-origin redirect hop the advisory relies on; the side effect is that users arriving from an external link may appear logged out until they navigate again, and cross-site SSO/OAuth callback flows can break. A third, narrower mitigation is to disable the trainer-login route in URLconf entirely if the trainer feature is unused on the instance. Note that the assessed attack also requires the victim to hold trainer privileges, so restricting trainer role assignment to trusted accounts reduces the pool of viable targets but does not fix the flaw. Full details and the suggested diff are in the advisory at https://github.com/wger-project/wger/security/advisories/GHSA-xf64-4pmc-h8qf.

Affected VersionsENISA

wger < 2.6

Affected Packages

pypi wger fix: 2.6

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 root cause is improper handling of the login state transition in a Django application. Django's CsrfViewMiddleware, by design, only validates CSRF tokens on unsafe HTTP methods (POST, PUT, PATCH, DELETE), so a state-changing view that is reachable via GET is effectively exempt from CSRF enforcement. wger's trainer_login view is exactly that: it performs a privileged action - calling django.contrib.auth.login() with the ModelBackend to swap the active session's user identity - off a plain GET to GET /en/user/<user_pk>/trainer-login, with no @require_POST decorator or request.method guard. The CWE-352 classification captures the state-changing-via-GET pattern precisely. The advisory also highlights a modern browser nuance the attack leans on: SameSite=Lax blocks the initial cross-origin subresource hop (the <img> request), but the view's handling of the ?next= parameter produces a 302 to /user/login?next=..., and the browser follows that same-origin hop with the session cookie attached, ultimately reaching the target action. That redirect-chain dependency - rather than a straightforward cross-site POST - is what makes the exploit technically demanding and is reflected in the independent assessment's AC:H. The affected CPE is cpe:2.3:a:wger-project:wger:*:*:*:*:*:*:*:* (all versions prior to 2.6), and the ecosystem entry records the pip package wger as vulnerable through <= 2.1 with no fixed version tracked in that dataset even though upstream shipped the fix in release 2.6.

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

Vendor (GitHub_M) PRIMARY 5.4 MEDIUM
AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
vuln.today AI 4.4 MEDIUM

AC:H because the attack must evade default SameSite=Lax via a specific redirect chain; PR:L and UI:R since a logged-in trainer must load the page; S:C as the auth context is rebound to another account with Low C/I impact.

3.1 AV:N/AC:H/PR:L/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:H/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
Required
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Oct 07, 2026 - 15:02 EUVD

DescriptionCVE.org

wger is a free, open-source workout and fitness manager. Prior to version 2.6, the trainer_login view in wger accepts GET requests and executes django_login() without any CSRF protection, because Django's CsrfViewMiddleware only enforces tokens on unsafe methods (POST/PUT/PATCH/DELETE). An attacker can embed a single <img> tag on a malicious page; when an authenticated trainer loads that page, their browser auto-issues the GET with the session cookie, forcibly rebinding the trainer's session to an arbitrary user account. Version 2.6 fixes the issue.

Threat Intelligence Overview

EPSS Score
0.1%
Top 100% exploitable
Prevalence
Low
niche self-hosted open-source fitness manager, limited enterprise footprint
Threat Intel
1
1 source
Data Quality
4 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

27
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +27
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.

More in Wger

View all
CVE-2022-2650 CRITICAL POC
9.8 Nov 24

Improper Restriction of Excessive Authentication Attempts in GitHub repository wger-project/wger prior to 2.2. Rated cri

CVE-2023-38758 MEDIUM POC
5.4 Aug 08

Cross Site Scripting vulnerability in wger Project wger Workout Manager v.2.2.0a3 allows a remote attacker to gain privi

CVE-2023-38759 HIGH
8.8 Aug 08

Cross Site Request Forgery (CSRF) vulnerability in wger Project wger Workout Manager 2.2.0a3 allows a remote attacker to

CVE-2026-27839 MEDIUM POC
4.3 Feb 26

Wger versions up to 2.4 allow authenticated users to access other users' private nutrition plans through insecure direct

CVE-2026-27835 MEDIUM POC
4.3 Feb 26

Wger versions up to 2.4 expose all users' repetition configuration data to any authenticated attacker due to missing aut

CVE-2026-86255 HIGH
7.1 Sep 06

Uncontrolled resource consumption in wger before 2.5 allows any authenticated user to exhaust server worker threads and

CVE-2026-27838 LOW POC
3.1 Feb 26

wger is a free, open-source workout and fitness manager. Five routine detail action endpoints check a cache before calli

CVE-2026-46434 HIGH
7.1 Oct 07

Account-deactivation privilege escalation in wger before 2.6 lets an authenticated user who holds only the gym_trainer r

CVE-2026-46438 MEDIUM
6.5 Oct 07

Cross-user integrity corruption in wger versions prior to 2.6 allows authenticated attackers to inject arbitrary workout

CVE-2026-86254 MEDIUM
6.1 Sep 06

Incomplete authorization fix in wger through master exposes three user-management views in wger/core/views/user.py to th

CVE-2026-82544 MEDIUM
5.3 Aug 30

Cross-site request forgery in wger's gym password-reset endpoint allows a remote attacker to force an arbitrary member's

CVE-2026-86256 MEDIUM
5.1 Sep 06

Open redirect in wger's trainer_login view allows an attacker to redirect an authenticated trainer's browser to an arbit

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy