Mar 7, 2026·5 min read·25 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.
A CSV Formula Injection vulnerability (CWE-1236) exists in the Spree headless eCommerce platform within the customer export functionality. An unauthenticated attacker can register a customer profile containing malicious formula sequences in fields like the first name or last name. When an administrator exports the customer data to a CSV file and opens it in a spreadsheet application, the spreadsheet engine can interpret and execute these formulas, potentially leading to remote command execution on the administrator's workstation or out-of-band data exfiltration.
A Stored Cross-Site Scripting (XSS) vulnerability exists in WWBN AVideo versions up to and including 29.0. Unsanitized category descriptions are stored in the database and subsequently rendered as raw HTML in the Gallery view plugin, allowing low-privileged authenticated users to execute arbitrary JavaScript in the browsers of visiting users.
A critical supply chain compromise was identified in the Node.js package @cap-js/openapi at version 1.4.1. An attacker gained unauthorized publishing access to the npm registry and distributed a backdoored release that harvests sensitive developer credentials, environment variables, and SSH keys. The malicious code then exfiltrates the collected data to external actor-controlled servers.
An authenticated wallet credit bypass vulnerability exists in WWBN AVideo version 29.0 and earlier. The AuthorizeNet plugin includes an unfinished mockup endpoint, processPayment.json.php, which lacks actual transaction verification and hardcodes success. This allows any authenticated user to credit their wallet with arbitrary balances without making any payments.
An unauthenticated stored DOM-based Cross-Site Scripting (DOM XSS) vulnerability in the YPTSocket plugin of WWBN AVideo (formerly YouPHPTube) allows remote attackers to execute arbitrary JavaScript within the session context of administrative users. Unsanitized metadata parameters supplied during the WebSocket handshake are persisted in an SQLite database and broadcast to connected users. The frontend application processes these parameters through an unsafe jQuery append sink, leading to silent, high-impact administrative context compromise.
A path parsing and normalization inconsistency vulnerability exists in the Hono web framework prior to version 4.12.21. When hosting sub-applications via the app.mount() routing interface, Hono calculates the routing path prefix length on a percent-decoded representation of the URI but executes the path-slicing offset on the raw, percent-encoded string. This discrepancy results in malformed request paths being dispatched to mounted sub-applications, potentially leading to route bypasses, route confusion, and application-level Denial of Service.