| Metric | Score / Rating |
|---|---|
| Likelihood | 7.1 (HIGH) |
| Impact | 6.3 (HIGH) |
| Overall Risk Rating | CRITICAL |
Two API endpoints on streamrecorder.io fail to enforce access control, allowing any authenticated user to retrieve private recording metadata and direct download/stream URLs, including premium or paid content.
This is an Insecure Direct Object Reference (IDOR) vulnerability (CWE-639). Both endpoints accept user-supplied identifiers (targetid and video_id) and return the corresponding data without verifying that the requesting user has authorization to access it. Possession of a valid session cookie (i.e., being logged in as any user) is sufficient to query data belonging to any other user.
GET https://streamrecorder.io/api/user/recordingsv2?targetid={user_id}&offset=0&limit=20&sortby=id&sortdir=descGET https://streamrecorder.io/recordings/stream/{video_id}
Prerequisites: A valid account on the platform and an HTTP intercepting proxy (e.g., Burp Suite, OWASP ZAP). For the purpose of this proof of concept, 99999 is used as the target user/video ID.
- Log in to the platform with any valid account.
- Enable request interception. Ensure session cookies are not redacted so requests are authenticated.
- Navigate to
https://streamrecorder.io/userrecordingsand click any set of profiles/recordings to trigger the API call. - Intercept the following request:
GET /api/user/recordingsv2?targetid=99999&offset=0&limit=20&sortby=id&sortdir=desc HTTP/1.1
Host: streamrecorder.io
Cookie: [YOUR_VALID_SESSION_COOKIE]- Forward the request to a Repeater tool. Modify the
targetidparameter to the ID of any account. - Send the request.
Result: The API returns the full recording list for the target profile in a JSON response, including metadata and direct source or download URLs for their recordings, regardless of whether those recordings are free or gated behind a paywall.
- Identify the video ID of a target video. This can be found by hovering over a thumbnail in the recordings tab and extracting the numeric ID from the URL (or from the previous recording list, in the JSON response from the
/recordingsAPI):- Example:
/media/99999/thumbv_large.jpg→ video ID:99999
- Example:
- Send the following request via the Repeater, substituting the target video ID (where
99999is the free video, and10000is the premium video):
GET /recordings/stream/10000 HTTP/1.1
Host: streamrecorder.io
Cookie: [YOUR_VALID_SESSION_COOKIE]Result: The response contains a direct, usable download or stream URL for the requested video, completely bypassing any subscription or access requirements.
- Revenue / IP Loss: Premium and paid video content can be directly streamed or downloaded without a valid purchase or subscription.
- Mass Exploitation: The vulnerable endpoints utilize sequential identifiers, making bulk scraping of the platform's paid content trivially feasible.
- Server-Side Authorization Checks: Before returning any data, verify on the server that the authenticated user is either the owner of the requested resource or has been explicitly granted access to it.
- Avoid Direct Object References: Replace sequential internal IDs exposed in API parameters with non-guessable tokens (e.g., UUIDsv4 or signed tokens) that cannot be enumerated.
- Signed, Expiring URLs: Generate stream and download URLs that are cryptographically signed and tied to a specific user session, with a short expiry window.
- Rate Limiting & Anomaly Detection: Implement rate limiting on recording endpoints to detect and block bulk enumeration attempts.
- 2026-06-05: Vulnerability discovered.
- 2026-06-05: Initial disclosure sent to support team.
- 2026-06-08: Response / acknowledgment received.
- 2026-06-11: Contact via Telegram as directed, no response.
- 2026-07-07: Public disclosure.
This report is submitted in good faith under responsible disclosure principles. No compensation was requested. The information provided in this repository is for educational and defensive purposes only. I am not responsible for how this information is used by third parties.