wger
FLOSS workout, fitness and weight manager/tracker written with Django
Activity
- Latest release
- 3y ago
- Total releases
- 14
- Cadence
- ~7 months
- Last 12 months
- 0
Details
- License
- unknown
- First release
- Feb 23, 2013
| Version | Released | |
|---|---|---|
2.1
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
2.1
minor
Dependencies (24)
+ 16 more |
|
2.0
major
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
2.0
major
Dependencies (24)
+ 16 more |
|
1.9
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.9
minor
Dependencies (26)
+ 18 more |
|
1.8
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.8
minor
Dependencies (23)
+ 15 more |
|
1.7
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.7
minor
Dependencies (22)
+ 14 more |
|
1.6.1
patch
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.6.1
patch
Dependencies (19)
+ 11 more |
|
1.6
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.6
minor
Dependencies (19)
+ 11 more |
|
1.5
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.5
minor
Dependencies (18)
+ 10 more |
|
1.4
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.4
minor
|
|
1.3
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.3
minor
|
|
1.2
minor
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.2
minor
|
|
1.2rc1
pre
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.2rc1
pre
|
|
1.1.1
patch
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.1.1
patch
|
|
1.1
initial
15 CVEs
CVE-2026-43978
PYSEC-2026-3420
GHSA-9qpr-vc49-hqg2
Jul 13, 2026
wger: Privilege escalation via trainer-login session chaining allows gym trainer to impersonate gym manager
8.1
/ 10
High
Network
Low
Low
None
Unchanged
High
High
None
SummaryA gym trainer can escalate their session to any higher-privileged account (gym manager, general manager) by chaining two calls to the trainer-login endpoint. Once a trainer performs a legitimate switch into a low-privileged user, the session flag DetailsIn
After hop 1 (trainer → regular user), PoCRequirements: A running wger instance with at least one gym trainer account and one gym manager account in the same gym.
Output on wger 2.5.0a2: ImpactAny authenticated gym trainer can take over a gym manager or general gym manager account within the same gym. This grants full gym administration capabilities including viewing all member data, modifying contracts, managing gym configuration, and accessing other trainers' and managers' personal information. How to fixThe root cause is a logical error in wger/core/views/user.py at line 169. The AND operator means that if session['trainer.identity'] is set, the entire permission check is skipped — allowing any user who has previously been switched into to perform further trainer-login hops without holding the gym.gym_trainer permission themselves. Additionally, the target-user protection block at line 173 only executes when request.user is a trainer, so it never fires during a chained hop. Vulnerable code (user.py:169–178):
Suggested fix:
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-43977
PYSEC-2026-3421
GHSA-cj9g-27ph-4cgv
Jul 13, 2026
wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
SummaryAny authenticated user can read another user's private workout session notes, exercise history, and training statistics by calling the /logs/ and /stats/ actions on a routine they do not own. The RoutinePermission class grants read access to any authenticated user when a routine has is_template=True, regardless of ownership. The /logs/ and /stats/ API actions use the same permission check but return the routine owner's personal training data instead of the requesting user's data, creating an insecure direct object reference (IDOR). An attacker with a free account can enumerate all public template routine IDs via GET /api/v2/routine/?is_template=true, then call GET /api/v2/routine/{id}/logs/ and GET /api/v2/routine/{id}/stats/ to access the owner's private health data including workout notes, weights, repetitions, and performance statistics. Descriptionwger exposes a REST API endpoint that allows any authenticated user to retrieve the private workout session notes, exercise logs, and training statistics belonging to another user, as long as that user has at least one routine marked as a public template. The vulnerability exists in Root CauseFile:
File:
The intended behavior is that templates are public workout plans (exercise structure, sets, reps), but the ImpactAn authenticated attacker can:
This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach. Proof of ConceptScenarioThere are two users in the system:
The attack: Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating Step-by-step
No special permissions are needed. A fresh account (1-minute-old) can exploit this. Python PoC
Expected output
Recommended FixThe
Additionally,
Affected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40353
PYSEC-2026-3419
GHSA-6f54-qjvm-wwq3
Jul 13, 2026
wger has Stored XSS via Unescaped License Attribution Fields
Low
Network
Low
Low
Stored XSS via Unescaped License Attribution FieldsSummaryThe SeverityHigh (CVSS 3.1: ~7.6)
CWECWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Affected ComponentsVulnerable PropertyFile:
Unsafe Template RenderingFile:
Writable Entry PointFile:
URL: Form fields (from Models Affected6 models inherit from
Only the Ingredient and nutrition Image models' attribution links are currently rendered with Root Cause
Reproduction Steps (Verified)Prerequisites
Steps
Verified PoC OutputThe rendered HTML in the ingredient detail page (line 171 of
The Alternative API Path (ExerciseImage)For users who are "trustworthy" (account >3 weeks old + verified email):
Note: ExerciseImage's Impact
Suggested FixReplace the
Alternatively, remove the ReferencesAffected versions
1.1
1.1.1
1.2
1.2rc1
1.3
1.4
1.5
1.6
1.6.1
1.7
1.8
1.9
+ 2 more Show less
2.0
2.1
References Updated Jul 13, 2026 · Source: OSV.dev
CVE-2026-40474
PYSEC-2026-3424
GHSA-xppv-4jrx-qf8m
Jul 13, 2026
wger has Broken Access Control in Global Gym Configuration Update Endpoint
7.6
/ 10
High
Network
Low
Low
None
Unchanged
Low
High
Low
Summarywger exposes a global configuration edit endpoint at The edited object is a singleton ( This is a vertical privilege escalation from a regular user to privileged global configuration control. The application explicitly declares permission_required = 'config.change_gymconfig', demonstrating that the action is intended to be restricted; however, this requirement is never enforced at runtime. Affected endpointThe config URLs map as follows. File:
This resolves to:
Root causeThe view declares a permission but does not enforce itFile:
The permission string exists, but The project’s permission mixin exists but is not usedFile:
The mixin that is used performs only ownership checks, and
|
1.1
initial
|