🛡️ CVE-2026-43977 — wger

🟠 CVSS 8.0 — High ✅ No Known Exploit CWE-639 NVD
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

wger Vulnerable to IDOR: Authenticated Users Can Read Any User's Private Workout Session Data via Template Routine API

Summary

Any 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.

Description

wger 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 RoutineViewSet (wger/manager/api/views.py). The view defines two custom actions /logs/ and /stats/ that are intended to return data for the requesting user's own training history within a routine. However, the underlying permission check (RoutinePermission.has_object_permission) grants read access to any authenticated user when the routine has is_template=True, regardless of ownership. When the /logs/ or /stats/ actions are invoked against a routine the attacker does not own, they return the owner's private workout history, not the attacker's.

Root Cause

File: wger/manager/api/permissions.py, lines 30–41

```python

def has_object_permission(self, request, view, obj):

if obj.user == request.user:

return True

if obj.is_template: # ← any template is readable

return request.method in permissions.SAFE_METHODS # by any authenticated user

return False

```

File: wger/manager/api/views.py, lines 173–199

```python

@action(detail=True, url_path='logs')

def logs(self, request, pk):

out = LogDisplaySerializer(

self.get_object().logs_display(), # ← returns OWNER's logs, not request.user's

many=True,

).data

return Response(out)

@action(detail=True, url_path='stats')

def stats(self, request, pk):

out = LogStatsDataSerializer(

self.get_object().calculate_log_statistics() # ← owner's statistics

).data

return Response(out)

```

self.get_object() retrieves the routine belonging to the owner (e.g., user A). Since is_template=True passes the permission check for any authenticated user, the attacker's request reaches logs_display() and calculate_log_statistics(), which return the owner's workout history, not the attacker's.

The intended behavior is that templates are public workout *plans* (exercise structure, sets, reps), but the /logs/ and /stats/ actions expose the *owner's personal training history* logged against that plan.

Impact

An authenticated attacker can:

1. Enumerate all public template routines across all users:

GET /api/v2/routine/?is_template=true&is_public=true

2. Read private workout session notes (freeform text entered by the victim after each workout session)

3. Read full workout history including exercise names, weights, repetitions, and dates

4. Read training statistics including volume, intensity, and set counts per muscle group and mesocycle

This data is health-related and personal. Under GDPR and similar regulations, unauthorized access to personal health data constitutes a data breach.

Proof of Concept

Scenario

There are two users in the system:

  • alice : a regular wger user who has been using the platform for months. She created a routine called "My 5/3/1 Program" and marked it as a public template so others can copy her exercise structure. She logs all her workouts with personal notes after each session.
  • bob : a second registered user who has never interacted with alice's account.

The attack:

Bob calls the routine listing endpoint to find all public templates. He gets back alice's routine ID. He then calls /api/v2/routine/{id}/logs/ an endpoint that should only show his own logs but instead receives alice's full workout history, including all her session notes ("Felt strong today, PR on squat"), weights, and performance data.

Bob does not need to know alice's username. He only needs her routine ID, which is a sequential integer discoverable by iterating ?is_template=true.

Step-by-step

1. Bob registers a free account on the wger instance and obtains a JWT access token via

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity none, availability none.

Weakness class

CVE-2026-43977 is classified as CWE-639: Authorization Bypass Through User-Controlled Key. An object is selected by an identifier from the request without checking the caller owns it.

Affected software

CVE-2026-43977 is recorded against 2 packages.

  • unknown
  • wger

Timeline and source

Published on 16 July 2026 and last revised on 17 July 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com
github.com

Details

Severity HIGH
CVSS Score 8.0
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
CWE CWE-639
Public Exploit ✅ No
Source NVD
Published 2026-07-16
Updated 2026-08-12
Modified 2026-07-17
Fix URL N/A

Affected Packages

Software From version Fixed in
unknown
wger

Similar Threats

Site Security Check

Is wger part of your stack?

CVE-2026-43977 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.