Mar 7, 2026·5 min read·30 visits
Unauthenticated attackers can dump private playlists (Favorites, Watch Later) of any AVideo user by querying specific JSON endpoints with a target User ID. Fixed in version 25.0.
A critical Insecure Direct Object Reference (IDOR) vulnerability exists in the AVideo platform (formerly YouPHPTube) prior to version 25.0. The flaw allows unauthenticated remote attackers to retrieve private playlist information—including 'Watch Later' lists, 'Favorites', and custom private collections—for any user on the system. The vulnerability resides in the `/objects/playlistsFromUser.json.php` and `/objects/playlistsFromUserVideos.json.php` endpoints, which fail to validate the requester's identity or authorization level before querying the database with a flag that exposes non-public data.
AVideo (formerly YouPHPTube) is an open-source video sharing platform widely used for hosting streaming content. A significant access control vulnerability has been identified in the platform's API endpoints responsible for retrieving user playlists. Specifically, the endpoints /objects/playlistsFromUser.json.php and /objects/playlistsFromUserVideos.json.php are exposed to unauthenticated requests and lack necessary authorization checks.
The core issue is a failure to restrict access to sensitive user data based on the session's privileges. When these scripts are accessed, they unconditionally query the backend for all playlists associated with a provided users_id, including those explicitly marked as private. This behavior constitutes an Insecure Direct Object Reference (IDOR), as the system relies on user-supplied input (the User ID) to retrieve objects without verifying that the requester is authorized to view those specific objects.
This vulnerability allows any external actor to map out the private content preferences and curation activities of the platform's user base. While it does not allow for the modification of data (integrity) or denial of service (availability), the breach of confidentiality regarding user activity is absolute for the affected endpoints.
The vulnerability stems from a logical error in how the PlayList::getAllFromUser method is invoked within the public-facing API scripts. In AVideo's architecture, this method accepts a user ID and a boolean flag, commonly referred to as $publicOnly. When this flag is set to true, the method filters the database query to return only public playlists. When set to false, it returns all playlists, including private system lists like 'Watch Later' and 'Favorites'.
In the vulnerable versions (pre-25.0), the code in objects/playlistsFromUser.json.php hardcoded this parameter to false without any preceding authentication logic:
// Vulnerable implementation
$row = PlayList::getAllFromUser($_GET['users_id'], false);The developers implicitly trusted that the endpoint would handle public/private distinction or intended for this endpoint to be internal-only, yet it was exposed publicly. There was no check to see if User::isLogged() was true, nor was there a comparison between the currently logged-in user's ID and the requested users_id. This effectively effectively bypassed the application's intended privacy model, treating every request as if it came from the playlist owner or an administrator.
The remediation for this issue involved introducing an explicit authorization gate before querying the database. The patch logic ensures that the $publicOnly flag defaults to true (safe) and is only toggled to false (unsafe/full access) if strict conditions are met.
Vulnerable Code (Before Patch):
The original code directly consumed the GET parameter and queried the database with the unsafe flag.
// objects/playlistsFromUser.json.php (Pre-v25.0)
if (empty($_GET['users_id'])) {
die("You need a user");
}
// CRITICAL FLAW: The second argument 'false' forces the backend
// to return ALL playlists, including private ones. No auth check exists.
$row = PlayList::getAllFromUser($_GET['users_id'], false);
echo json_encode($row);Patched Code (Version 25.0):
The fix, introduced in commit 12adc66913724736937a61130ae2779c299445ca, implements a standard Access Control List (ACL) check.
// objects/playlistsFromUser.json.php (Patched)
$users_id = intval($_GET['users_id']);
// 1. Default to SAFE mode (Public playlists only)
$publicOnly = true;
// 2. Check Authentication and Authorization
// If the user is logged in AND (is the owner of the ID OR is an Admin)
if (User::isLogged() && (User::isAdmin() || User::getId() == $users_id)) {
// 3. Allow access to private playlists
$publicOnly = false;
}
// 4. Execute query with the determined flag
$row = PlayList::getAllFromUser($users_id, $publicOnly);
echo json_encode($row);This change ensures that an unauthenticated attacker, or an authenticated user requesting another user's data, will only receive public playlists, preserving the confidentiality of private collections.
Exploiting this vulnerability requires no special tools, authentication, or race conditions. It is a standard GET request manipulatable via a web browser or command-line HTTP client. The attacker only needs to know or guess a valid users_id. Since user IDs are often sequential integers, an attacker can easily iterate through the entire user base.
Proof of Concept:
The following curl command retrieves the private playlists for User ID 1 (typically the administrator):
curl -s "https://target-avideo-site.com/objects/playlistsFromUser.json.php?users_id=1" | jqExpected Response (Vulnerable):
The server returns a JSON array containing private system playlists. Note the status fields indicating 'private', 'watch_later', or 'favorite'.
[
{
"id": 45,
"name": "Watch Later",
"status": "watch_later",
"users_id": 1,
"videos": [...]
},
{
"id": 46,
"name": "My Secret Project",
"status": "private",
"users_id": 1,
"videos": [...]
}
]In a secured environment, or against the patched version, the response would either be empty or contain only playlists where status is 'public'.
The primary impact of GHSA-6w2r-cfpc-23r5 is Confidentiality Loss. While the vulnerability does not allow for Remote Code Execution (RCE) or data modification, the privacy implications are significant for a social platform.
Specific Consequences:
Severity Scoring:
6.9 (Medium)CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:PCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:P| Product | Affected Versions | Fixed Version |
|---|---|---|
AVideo WWBN | < 25.0 | 25.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-639 (Authorization Bypass Through User-Controlled Key) |
| CVSS v4.0 | 6.9 (Medium) |
| Attack Vector | Network (Unauthenticated) |
| Impact | Information Disclosure (Confidentiality) |
| Affected Component | objects/playlistsFromUser.json.php |
| Fix Version | 25.0 |
The application allows an attacker to access a resource (playlists) by directly referencing its identifier (user_id) without verifying access rights.
An unauthenticated remote denial of service vulnerability exists in the Unleash feature management platform. By submitting a crafted JSON payload containing deeply nested structures to an OpenAPI-validated endpoint, an attacker can trigger uncontrolled recursion within the error formatting module. This leads to a call-stack exhaustion (RangeError: Maximum call stack size exceeded) inside the Node.js runtime, causing the service to crash immediately without recovery.
CVE-2026-63004 is a server-side request forgery (SSRF) vulnerability in the Unleash feature management platform. Authenticated administrators with CREATE_ADDON or UPDATE_ADDON privileges can exploit this vulnerability to initiate requests to loopback addresses, private networks, and cloud metadata endpoints, potentially leading to information disclosure and credential extraction.
Prior to version 8.0.3, Unleash's Markdown event formatter directly mutated the global template-escaping function of the shared mustache Node.js module, resulting in a process-wide security degradation where HTML/Markdown escaping was permanently disabled for the application lifetime.
A critical SQL injection vulnerability exists in the GeoTools open-source Java library. This vulnerability is situated within the post-processing phase of OGC Filter conversion inside the PostGIS DataStore module. Specifically, the `jsonArrayContains` function does not validate or sanitize its arguments before constructing PostgreSQL SQL/JSON path evaluation queries. An unauthenticated remote attacker can exploit this weakness by submitting crafted filters via standard OGC services like WFS or WMS to execute arbitrary SQL commands on the underlying database system.
CVE-2026-61824 is a high-severity Cross-Site Scripting (XSS) vulnerability in kepano/defuddle before version 0.19.1. Custom site extractors for platforms such as X/Twitter, Substack, and YouTube constructed HTML representations via template string interpolation without output escaping. This allowed malicious pages to bypass standard parser sanitization routines and execute arbitrary JavaScript.
A high-severity vulnerability exists in KeystoneJS, a popular Node.js CMS and GraphQL framework, where the query resolution engine fails to validate signed negative integers within the pagination subsystem. Unauthenticated remote attackers can leverage this flaw to bypass the 'graphql.maxTake' safety boundary. By sending large negative values in the 'take' query parameter, the underlying Prisma ORM interprets the value as an instruction to fetch rows from the end of the collection, allowing malicious actors to bypass pagination limits, trigger database resource exhaustion, and execute application-level Denial of Service (DoS) attacks.