AVideo: IDOR in AI Plugin Allows Stealing Other Users' AI-Generated Metadata and Transcriptions
Date: 2026-03
Affected: composer/wwbn/avideo
Attack vector: data-exfiltration
Category: vulnerability-disclosure
Severity: Medium
CVE: CVE-2026-33764
CWE: CWE-639
CVSS: 4.3 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N)

## Summary The AI plugin's `save.json.php` endpoint loads AI response objects using an attacker-controlled `$_REQUEST['id']` parameter without validating that the AI response belongs to the specified video. An authenticated user with AI permissions can reference any AI response ID — including those generated for other users' private videos — and apply the stolen AI-generated content (titles, descriptions, keywords, summaries, or full transcriptions) to their own video, effectively exfiltrating the information. ## Details In `plugin/AI/save.json.php`, the authorization flow checks that the user can edit the *target video* (`Video::canEdit($videos_id)` at line 23), but loads the AI response object from a completely separate, user-controlled parameter: **Line 29 — metatags path (no ownership check):** ```php if(!empty($_REQUEST['ai_metatags_responses_id'])){ $ai = new Ai_metatags_responses($_REQUEST['id']); // Loads ANY response by ID if (empty($ai->getcompletion_tokens())) { forbiddenPage('AI Response not found'); } } ``` **Line 146 — transcription path (no ownership check):** ```php case 'text': if(!empty($_REQUEST['ai_transcribe_responses_id'])){ $ait = new Ai_transcribe_responses($_REQUEST['id']); // Loads ANY response by ID $value = $ait->getVtt(); ``` The `ObjectYPT` base class constructor performs a simple database lookup with no authorization: ```php public function __construct($id = "", $refreshCache = false) { if


Mitigations:

Architectural layers (MAESTRO):