CWE-639
AllowedAuthorization Bypass Through User-Controlled Key
Abstraction: Base · Status: Incomplete
The system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data.
3273 vulnerabilities reference this CWE, most recent first.
GHSA-FXP3-G6GW-4R4V
Vulnerability from github – Published: 2026-02-09 20:36 – Updated: 2026-02-09 22:39There is a Privilege Escalation vulnerability in Craft CMS’s GraphQL API that allows an authenticated user with write access to one asset volume to escalate their privileges and modify/transfer assets belonging to any other volume, including restricted or private volumes to which they should not have access.
Summary:
Type: Privilege Escalation (CWE-269)
Affected: Craft CMS 5.x (likely affects 4.x and 3.x as well)
Location: src/gql/resolvers/mutations/Asset.php lines 57-107
Root Cause:
The saveAsset GraphQL mutation validates authorization against the schema-resolved volume but fetches the target asset by ID without verifying that the asset belongs to the authorized volume. This allows unauthorized cross-volume asset modification and transfer.
Impact:
- Transfer confidential assets from private volumes to public volumes (data exfiltration)
- Modify asset metadata in restricted volumes
- Bypass multi-tenant isolation in shared hosting environments
{
"affected": [
{
"package": {
"ecosystem": "Packagist",
"name": "craftcms/cms"
},
"ranges": [
{
"events": [
{
"introduced": "5.0.0-RC1"
},
{
"fixed": "5.9.0-beta.1"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Packagist",
"name": "craftcms/cms"
},
"ranges": [
{
"events": [
{
"introduced": "4.0.0-RC1"
},
{
"fixed": "4.17.0-beta.1"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-25497"
],
"database_specific": {
"cwe_ids": [
"CWE-269",
"CWE-639"
],
"github_reviewed": true,
"github_reviewed_at": "2026-02-09T20:36:24Z",
"nvd_published_at": "2026-02-09T20:15:58Z",
"severity": "HIGH"
},
"details": "There is a Privilege Escalation vulnerability in Craft CMS\u2019s GraphQL API that allows an authenticated user with write access to one asset volume to escalate their privileges and modify/transfer assets belonging to any other volume, including restricted or private volumes to which they should not have access.\n\n## Summary:\n\nType: Privilege Escalation (CWE-269)\nAffected: Craft CMS 5.x (likely affects 4.x and 3.x as well)\nLocation: `src/gql/resolvers/mutations/Asset.php lines 57-107`\n\n## Root Cause:\n\nThe saveAsset GraphQL mutation validates authorization against the schema-resolved volume but fetches the target asset by ID without verifying that the asset belongs to the authorized volume. This allows unauthorized cross-volume asset modification and transfer.\n\n## Impact:\n\n- Transfer confidential assets from private volumes to public volumes (data exfiltration)\n- Modify asset metadata in restricted volumes\n- Bypass multi-tenant isolation in shared hosting environments",
"id": "GHSA-fxp3-g6gw-4r4v",
"modified": "2026-02-09T22:39:11Z",
"published": "2026-02-09T20:36:24Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/craftcms/cms/security/advisories/GHSA-fxp3-g6gw-4r4v"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-25497"
},
{
"type": "WEB",
"url": "https://github.com/craftcms/cms/commit/ac7edf868c1a81fd9c4dc49d3b3edf1cce113409"
},
{
"type": "PACKAGE",
"url": "https://github.com/craftcms/cms"
},
{
"type": "WEB",
"url": "https://github.com/craftcms/cms/releases/tag/4.17.0-beta.1"
},
{
"type": "WEB",
"url": "https://github.com/craftcms/cms/releases/tag/5.8.22"
},
{
"type": "WEB",
"url": "https://github.com/craftcms/cms/releases/tag/5.9.0-beta.1"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
"type": "CVSS_V4"
}
],
"summary": "Craft CMS: GraphQL Asset Mutation Privilege Escalation"
}
GHSA-G22G-H6V3-25JW
Vulnerability from github – Published: 2026-03-31 12:31 – Updated: 2026-03-31 12:31The User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor plugin for WordPress is vulnerable to Insecure Direct Object Reference in versions up to, and including, 3.15.5 via the wppb_save_avatar_value() function due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with subscriber-level access and above, to reassign ownership of arbitrary posts and attachments by changing 'post_author'.
{
"affected": [],
"aliases": [
"CVE-2026-3139"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-03-31T12:16:31Z",
"severity": "MODERATE"
},
"details": "The User Profile Builder \u2013 Beautiful User Registration Forms, User Profiles \u0026 User Role Editor plugin for WordPress is vulnerable to Insecure Direct Object Reference in versions up to, and including, 3.15.5 via the wppb_save_avatar_value() function due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with subscriber-level access and above, to reassign ownership of arbitrary posts and attachments by changing \u0027post_author\u0027.",
"id": "GHSA-g22g-h6v3-25jw",
"modified": "2026-03-31T12:31:36Z",
"published": "2026-03-31T12:31:36Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-3139"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/changeset/3481772/profile-builder"
},
{
"type": "WEB",
"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/760f7736-db49-4210-a2f3-3abb506106d7?source=cve"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N",
"type": "CVSS_V3"
}
]
}
GHSA-G268-72P7-9J6J
Vulnerability from github – Published: 2026-01-08 21:27 – Updated: 2026-01-11 14:57Summary
An Authenticated Insecure Direct Object Reference (IDOR) vulnerability was identified that allows an authenticated user to retrieve other users’ address information by modifying an existing order. By editing an order they legitimately own and manipulating address identifiers in the request, the backend server accepts and processes references to addresses belonging to other users, subsequently associating those addresses with the attacker’s order and returning them in the response.
Details
Affected Component(s)
- Authenticated user order management
- Address association logic
- Order update endpoint(s)
Affected Endpoint(s):
- /api/v2/storefront/checkout
The application fails to enforce proper object-level authorization when updating an existing order. While the user is authenticated and authorized to modify their own order, the backend does not verify that the supplied address identifiers belong to the same authenticated user.
PoC
Preconditions - Valid authenticated user account
Step 1: Log-in using a valid user, in this case customer2@example.com Step 2: Visualize current user’s addresses
Request
GET /account/addresses
The following screenshot shows customer2@example.com address.
Step 3: Initialize the Shopping Cart
Request
POST /api/v2/storefront/cart HTTP/1.1
From the response, extract the token marked in bold.
Step 4: Legitimate Order Edit Request
Using the obtained order token A1cram_6cFWpoj4V1yPkuQ1767113871701 perform an edit order request in order to add a custom billing address
Request
PATCH /api/v2/storefront/checkout
{
"include": "billing_address",
"order": {
"email": "idor_test@example.com",
"bill_address_attributes": {
"firstname":"CTF","lastname":"Tester","address1":"123 Main St",
"city":"Andorra la Vella","zipcode":"AD100","country_iso":"AD"
},
"ship_address_attributes": {
"firstname":"CTF","lastname":"Tester","address1":"123 Main St",
"city":"Andorra la Vella","zipcode":"AD100","country_iso":"AD"
}
}
}
Step 5: Modify the order request to include the other user's address and trigger the IDOR.
In this request, the attacker modifies the request by substituting the address identifier with one belonging to another user, thereby rendering the original address identifier accessible to the attacker.
Request
PATCH /api/v2/storefront/checkout
{"include":"billing_address","order":**{"bill_address_attributes":{"id":1}}**}
As can be seen other user's address is displayed.
Impact
As a result, an attacker can:
- Replace the address identifier with one belonging to another user
- Cause the backend to associate and return another user’s address within the attacker’s order
{
"affected": [
{
"package": {
"ecosystem": "RubyGems",
"name": "spree_api"
},
"ranges": [
{
"events": [
{
"introduced": "3.7.0"
},
{
"fixed": "4.10.2"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "RubyGems",
"name": "spree_api"
},
"ranges": [
{
"events": [
{
"introduced": "5.0.0"
},
{
"fixed": "5.0.7"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "RubyGems",
"name": "spree_api"
},
"ranges": [
{
"events": [
{
"introduced": "5.1.0"
},
{
"fixed": "5.1.9"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "RubyGems",
"name": "spree_api"
},
"ranges": [
{
"events": [
{
"introduced": "5.2.0"
},
{
"fixed": "5.2.5"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-22588"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": true,
"github_reviewed_at": "2026-01-08T21:27:03Z",
"nvd_published_at": "2026-01-08T21:15:44Z",
"severity": "MODERATE"
},
"details": "### Summary\nAn Authenticated Insecure Direct Object Reference (IDOR) vulnerability was identified that allows an authenticated user to retrieve other users\u2019 address information by modifying an existing order.\nBy editing an order they legitimately own and manipulating address identifiers in the request, the backend server accepts and processes references to addresses belonging to other users, subsequently associating those addresses with the attacker\u2019s order and returning them in the response.\n\n### Details\nAffected Component(s)\n- Authenticated user order management\n- Address association logic\n- Order update endpoint(s)\nAffected Endpoint(s):\n- `/api/v2/storefront/checkout`\n\nThe application fails to enforce proper object-level authorization when updating an existing order. While the user is authenticated and authorized to modify their own order, the backend does not verify that the supplied address identifiers belong to the same authenticated user.\n\n### PoC\nPreconditions\n- Valid authenticated user account\n\nStep 1: Log-in using a valid user, in this case customer2@example.com\nStep 2: Visualize current user\u2019s addresses \n\n**Request**\nGET `/account/addresses`\n\nThe following screenshot shows customer2@example.com address. \n\n\u003cimg width=\"336\" height=\"375\" alt=\"User Address\" src=\"https://github.com/user-attachments/assets/ceb1f214-7ac0-40b0-af22-6fe9d21254bb\" /\u003e\n\nStep 3: Initialize the Shopping Cart\n\n**Request**\nPOST `/api/v2/storefront/cart HTTP/1.1`\n\nFrom the response, extract the token marked in bold.\n\nStep 4: Legitimate Order Edit Request\n\nUsing the obtained order token **A1cram_6cFWpoj4V1yPkuQ1767113871701** perform an edit order request in order to add a custom billing address\n\n**Request**\nPATCH `/api/v2/storefront/checkout`\n\n```json\n{\n \"include\": \"billing_address\",\n \"order\": {\n \"email\": \"idor_test@example.com\",\n \"bill_address_attributes\": {\n \"firstname\":\"CTF\",\"lastname\":\"Tester\",\"address1\":\"123 Main St\",\n \"city\":\"Andorra la Vella\",\"zipcode\":\"AD100\",\"country_iso\":\"AD\"\n },\n \"ship_address_attributes\": {\n \"firstname\":\"CTF\",\"lastname\":\"Tester\",\"address1\":\"123 Main St\",\n \"city\":\"Andorra la Vella\",\"zipcode\":\"AD100\",\"country_iso\":\"AD\"\n }\n }\n }\n```\n\nStep 5: Modify the order request to include the other user\u0027s address and trigger the IDOR.\n\nIn this request, the attacker modifies the request by substituting the address identifier with one belonging to another user, thereby rendering the original address identifier accessible to the attacker.\n\n**Request**\nPATCH `/api/v2/storefront/checkout`\n\n```json\n{\"include\":\"billing_address\",\"order\":**{\"bill_address_attributes\":{\"id\":1}}**}\n```\n\nAs can be seen other user\u0027s address is displayed.\n\n### Impact\nAs a result, an attacker can:\n\n- Replace the address identifier with one belonging to another user\n- Cause the backend to associate and return another user\u2019s address within the attacker\u2019s order",
"id": "GHSA-g268-72p7-9j6j",
"modified": "2026-01-11T14:57:07Z",
"published": "2026-01-08T21:27:03Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/spree/spree/security/advisories/GHSA-g268-72p7-9j6j"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-22588"
},
{
"type": "WEB",
"url": "https://github.com/spree/spree/commit/02acabdce2c5f14fd687335b068d901a957a7e72"
},
{
"type": "WEB",
"url": "https://github.com/spree/spree/commit/17e78a91b736b49dbea8d1bb1223c284383ee5f3"
},
{
"type": "WEB",
"url": "https://github.com/spree/spree/commit/b409c0fd327e7ce37f63238894670d07079eefe8"
},
{
"type": "WEB",
"url": "https://github.com/spree/spree/commit/d3f961c442e0015661535cbd6eb22475f76d2dc7"
},
{
"type": "WEB",
"url": "https://github.com/rubysec/ruby-advisory-db/blob/master/gems/spree_api/CVE-2026-22588.yml"
},
{
"type": "PACKAGE",
"url": "https://github.com/spree/spree"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "Spree API has Authenticated Insecure Direct Object Reference (IDOR) via Order Modification"
}
GHSA-G288-P356-RJ5F
Vulnerability from github – Published: 2025-04-15 09:30 – Updated: 2025-04-15 09:30Insecure Direct Object Reference vulnerability in Deporsite from T-INNOVA allows an attacker to retrieve sensitive information from others users via "idUsuario" parameter in "/helper/Familia/establecerUsuarioSeleccion" endpoint.
{
"affected": [],
"aliases": [
"CVE-2025-3575"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2025-04-15T09:15:13Z",
"severity": "HIGH"
},
"details": "Insecure Direct Object Reference vulnerability in Deporsite from T-INNOVA allows an attacker to retrieve sensitive information from others users via \"idUsuario\" parameter in \"/helper/Familia/establecerUsuarioSeleccion\" endpoint.",
"id": "GHSA-g288-p356-rj5f",
"modified": "2025-04-15T09:30:34Z",
"published": "2025-04-15T09:30:34Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-3575"
},
{
"type": "WEB",
"url": "https://www.incibe.es/en/incibe-cert/notices/aviso/insecure-direct-object-reference-deporsite-t-innova"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"type": "CVSS_V4"
}
]
}
GHSA-G34J-Q536-5J2M
Vulnerability from github – Published: 2026-01-29 15:30 – Updated: 2026-01-29 15:30EasyPMS 1.0.0 contains an authentication bypass vulnerability that allows unprivileged users to manipulate SQL queries in JSON requests to access admin user information. Attackers can exploit weak input validation by injecting single quotes in ID parameters and modify admin user passwords without proper token authentication.
{
"affected": [],
"aliases": [
"CVE-2020-37008"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-01-29T15:16:07Z",
"severity": "HIGH"
},
"details": "EasyPMS 1.0.0 contains an authentication bypass vulnerability that allows unprivileged users to manipulate SQL queries in JSON requests to access admin user information. Attackers can exploit weak input validation by injecting single quotes in ID parameters and modify admin user passwords without proper token authentication.",
"id": "GHSA-g34j-q536-5j2m",
"modified": "2026-01-29T15:30:28Z",
"published": "2026-01-29T15:30:28Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2020-37008"
},
{
"type": "WEB",
"url": "https://www.elektraweb.com/en"
},
{
"type": "WEB",
"url": "https://www.exploit-db.com/exploits/48858"
},
{
"type": "WEB",
"url": "https://www.vulncheck.com/advisories/easypms-authentication-bypass"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
"type": "CVSS_V3"
},
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"type": "CVSS_V4"
}
]
}
GHSA-G352-7RFF-PGCM
Vulnerability from github – Published: 2023-11-28 06:30 – Updated: 2026-04-08 18:32The WP Shortcodes Plugin — Shortcodes Ultimate plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 5.13.3 via the su_meta shortcode due to missing validation on the user controlled keys 'key' and 'post_id'. This makes it possible for authenticated attackers, with contributor-level access and above, to retrieve arbitrary post meta values which may contain sensitive information when combined with another plugin.
{
"affected": [],
"aliases": [
"CVE-2023-6226"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2023-11-28T05:15:08Z",
"severity": "MODERATE"
},
"details": "The WP Shortcodes Plugin \u2014 Shortcodes Ultimate plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 5.13.3 via the su_meta shortcode due to missing validation on the user controlled keys \u0027key\u0027 and \u0027post_id\u0027. This makes it possible for authenticated attackers, with contributor-level access and above, to retrieve arbitrary post meta values which may contain sensitive information when combined with another plugin.",
"id": "GHSA-g352-7rff-pgcm",
"modified": "2026-04-08T18:32:27Z",
"published": "2023-11-28T06:30:23Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2023-6226"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/shortcodes-ultimate/trunk/includes/shortcodes/meta.php"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/changeset?sfp_email=\u0026sfph_mail=\u0026reponame=\u0026old=3000576%40shortcodes-ultimate\u0026new=3000576%40shortcodes-ultimate\u0026sfp_email=\u0026sfph_mail="
},
{
"type": "WEB",
"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/4d936a48-b300-4a41-8d28-ba34cb3c5cb7?source=cve"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N",
"type": "CVSS_V3"
}
]
}
GHSA-G39V-QRJ6-JXRH
Vulnerability from github – Published: 2026-03-26 18:08 – Updated: 2026-03-27 21:38Summary
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):
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):
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:
public function __construct($id = "", $refreshCache = false) {
if (!empty($id)) {
$this->load($id, $refreshCache); // SELECT * WHERE id = ? — no permission check
}
}
The loaded data is then applied to the attacker's video — titles via $video->setTitle() (line 49-51), descriptions via $video->setDescription() (lines 91-92, 100-101), and transcriptions via file_put_contents() (line 156).
In contrast, plugin/AI/delete.json.php correctly validates ownership by traversing to the parent Ai_responses record:
// delete.json.php lines 42-44 — CORRECT ownership check
$ai = new Ai_responses($aitr->getAi_responses_id());
if ($ai->getVideos_id() == $videos_id) {
$obj->ai_transcribe_responses_id = $aitr->delete();
This proves the developers intended ownership validation but omitted it in the save endpoint.
PoC
Prerequisites: Two user accounts (attacker and victim), both with canUseAI permission. The victim has generated AI metadata or transcription for a private video.
Step 1: Attacker enumerates AI response IDs to steal metadata
AI response IDs are sequential integers. The attacker supplies their own videos_id (which they can edit) but references a victim's AI response id:
# Attacker owns video ID 5, victim's AI metatags response is ID 42
curl -b "attacker_cookies" \
"https://target.example/plugin/AI/save.json.php" \
-d "videos_id=5&ai_metatags_responses_id=1&id=42&label=videoTitles&index=0"
Expected result: The victim's AI-generated title (from their private video) is applied to the attacker's video (ID 5). The attacker reads back their video to see the stolen title.
Step 2: Attacker steals full transcription (higher impact)
# Victim's AI transcription response is ID 17
curl -b "attacker_cookies" \
"https://target.example/plugin/AI/save.json.php" \
-d "videos_id=5&ai_transcribe_responses_id=1&id=17&label=text"
Expected result: The victim's VTT transcription file is written to the attacker's video directory. The attacker can now access the full spoken content of the victim's private video by requesting the VTT subtitle file for their own video.
Step 3: Enumerate all responses
# Iterate through sequential IDs to harvest all AI responses
for id in $(seq 1 100); do
curl -s -b "attacker_cookies" \
"https://target.example/plugin/AI/save.json.php" \
-d "videos_id=5&ai_metatags_responses_id=1&id=${id}&label=videoTitles&index=0"
done
Impact
- Confidentiality breach of private video content: An attacker can steal full transcriptions (VTT subtitles) generated by AI for other users' private videos, revealing the complete spoken content without ever accessing the video file itself.
- Metadata exfiltration: AI-generated titles, descriptions, keywords, summaries, and content ratings from other users' private videos can be read by applying them to the attacker's own video.
- Trivial enumeration: AI response IDs are sequential integers, allowing an attacker to systematically harvest all AI-generated content across the platform.
- Low barrier: Any user with
canUseAIpermission who owns at least one video can exploit this. No admin access required.
Recommended Fix
Add ownership validation in save.json.php matching what delete.json.php already does. Load the parent Ai_responses record and verify getVideos_id() matches the provided $videos_id:
// For metatags (after line 29):
if(!empty($_REQUEST['ai_metatags_responses_id'])){
$ai = new Ai_metatags_responses($_REQUEST['id']);
if (empty($ai->getcompletion_tokens())) {
forbiddenPage('AI Response not found');
}
// ADD: Ownership validation
$aiParent = new Ai_responses($ai->getAi_responses_id());
if ($aiParent->getVideos_id() != $videos_id) {
forbiddenPage('AI Response does not belong to this video');
}
}
// For transcriptions (at line 146, inside case 'text'):
$ait = new Ai_transcribe_responses($_REQUEST['id']);
// ADD: Ownership validation
$aitParent = new Ai_responses($ait->getAi_responses_id());
if ($aitParent->getVideos_id() != $videos_id) {
forbiddenPage('AI Response does not belong to this video');
}
$value = $ait->getVtt();
{
"affected": [
{
"package": {
"ecosystem": "Packagist",
"name": "wwbn/avideo"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "26.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-33764"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": true,
"github_reviewed_at": "2026-03-26T18:08:12Z",
"nvd_published_at": "2026-03-27T15:16:58Z",
"severity": "MODERATE"
},
"details": "## Summary\n\nThe AI plugin\u0027s `save.json.php` endpoint loads AI response objects using an attacker-controlled `$_REQUEST[\u0027id\u0027]` parameter without validating that the AI response belongs to the specified video. An authenticated user with AI permissions can reference any AI response ID \u2014 including those generated for other users\u0027 private videos \u2014 and apply the stolen AI-generated content (titles, descriptions, keywords, summaries, or full transcriptions) to their own video, effectively exfiltrating the information.\n\n## Details\n\nIn `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:\n\n**Line 29 \u2014 metatags path (no ownership check):**\n```php\nif(!empty($_REQUEST[\u0027ai_metatags_responses_id\u0027])){\n $ai = new Ai_metatags_responses($_REQUEST[\u0027id\u0027]); // Loads ANY response by ID\n \n if (empty($ai-\u003egetcompletion_tokens())) {\n forbiddenPage(\u0027AI Response not found\u0027);\n }\n}\n```\n\n**Line 146 \u2014 transcription path (no ownership check):**\n```php\ncase \u0027text\u0027:\n if(!empty($_REQUEST[\u0027ai_transcribe_responses_id\u0027])){\n $ait = new Ai_transcribe_responses($_REQUEST[\u0027id\u0027]); // Loads ANY response by ID\n $value = $ait-\u003egetVtt();\n```\n\nThe `ObjectYPT` base class constructor performs a simple database lookup with no authorization:\n```php\npublic function __construct($id = \"\", $refreshCache = false) {\n if (!empty($id)) {\n $this-\u003eload($id, $refreshCache); // SELECT * WHERE id = ? \u2014 no permission check\n }\n}\n```\n\nThe loaded data is then applied to the attacker\u0027s video \u2014 titles via `$video-\u003esetTitle()` (line 49-51), descriptions via `$video-\u003esetDescription()` (lines 91-92, 100-101), and transcriptions via `file_put_contents()` (line 156).\n\nIn contrast, `plugin/AI/delete.json.php` correctly validates ownership by traversing to the parent `Ai_responses` record:\n\n```php\n// delete.json.php lines 42-44 \u2014 CORRECT ownership check\n$ai = new Ai_responses($aitr-\u003egetAi_responses_id());\nif ($ai-\u003egetVideos_id() == $videos_id) {\n $obj-\u003eai_transcribe_responses_id = $aitr-\u003edelete();\n```\n\nThis proves the developers intended ownership validation but omitted it in the save endpoint.\n\n## PoC\n\n**Prerequisites:** Two user accounts (attacker and victim), both with `canUseAI` permission. The victim has generated AI metadata or transcription for a private video.\n\n**Step 1: Attacker enumerates AI response IDs to steal metadata**\n\nAI response IDs are sequential integers. The attacker supplies their own `videos_id` (which they can edit) but references a victim\u0027s AI response `id`:\n\n```bash\n# Attacker owns video ID 5, victim\u0027s AI metatags response is ID 42\ncurl -b \"attacker_cookies\" \\\n \"https://target.example/plugin/AI/save.json.php\" \\\n -d \"videos_id=5\u0026ai_metatags_responses_id=1\u0026id=42\u0026label=videoTitles\u0026index=0\"\n```\n\n**Expected result:** The victim\u0027s AI-generated title (from their private video) is applied to the attacker\u0027s video (ID 5). The attacker reads back their video to see the stolen title.\n\n**Step 2: Attacker steals full transcription (higher impact)**\n\n```bash\n# Victim\u0027s AI transcription response is ID 17\ncurl -b \"attacker_cookies\" \\\n \"https://target.example/plugin/AI/save.json.php\" \\\n -d \"videos_id=5\u0026ai_transcribe_responses_id=1\u0026id=17\u0026label=text\"\n```\n\n**Expected result:** The victim\u0027s VTT transcription file is written to the attacker\u0027s video directory. The attacker can now access the full spoken content of the victim\u0027s private video by requesting the VTT subtitle file for their own video.\n\n**Step 3: Enumerate all responses**\n\n```bash\n# Iterate through sequential IDs to harvest all AI responses\nfor id in $(seq 1 100); do\n curl -s -b \"attacker_cookies\" \\\n \"https://target.example/plugin/AI/save.json.php\" \\\n -d \"videos_id=5\u0026ai_metatags_responses_id=1\u0026id=${id}\u0026label=videoTitles\u0026index=0\"\ndone\n```\n\n## Impact\n\n- **Confidentiality breach of private video content:** An attacker can steal full transcriptions (VTT subtitles) generated by AI for other users\u0027 private videos, revealing the complete spoken content without ever accessing the video file itself.\n- **Metadata exfiltration:** AI-generated titles, descriptions, keywords, summaries, and content ratings from other users\u0027 private videos can be read by applying them to the attacker\u0027s own video.\n- **Trivial enumeration:** AI response IDs are sequential integers, allowing an attacker to systematically harvest all AI-generated content across the platform.\n- **Low barrier:** Any user with `canUseAI` permission who owns at least one video can exploit this. No admin access required.\n\n## Recommended Fix\n\nAdd ownership validation in `save.json.php` matching what `delete.json.php` already does. Load the parent `Ai_responses` record and verify `getVideos_id()` matches the provided `$videos_id`:\n\n```php\n// For metatags (after line 29):\nif(!empty($_REQUEST[\u0027ai_metatags_responses_id\u0027])){\n $ai = new Ai_metatags_responses($_REQUEST[\u0027id\u0027]);\n \n if (empty($ai-\u003egetcompletion_tokens())) {\n forbiddenPage(\u0027AI Response not found\u0027);\n }\n \n // ADD: Ownership validation\n $aiParent = new Ai_responses($ai-\u003egetAi_responses_id());\n if ($aiParent-\u003egetVideos_id() != $videos_id) {\n forbiddenPage(\u0027AI Response does not belong to this video\u0027);\n }\n}\n\n// For transcriptions (at line 146, inside case \u0027text\u0027):\n$ait = new Ai_transcribe_responses($_REQUEST[\u0027id\u0027]);\n\n// ADD: Ownership validation\n$aitParent = new Ai_responses($ait-\u003egetAi_responses_id());\nif ($aitParent-\u003egetVideos_id() != $videos_id) {\n forbiddenPage(\u0027AI Response does not belong to this video\u0027);\n}\n\n$value = $ait-\u003egetVtt();\n```",
"id": "GHSA-g39v-qrj6-jxrh",
"modified": "2026-03-27T21:38:32Z",
"published": "2026-03-26T18:08:12Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/WWBN/AVideo/security/advisories/GHSA-g39v-qrj6-jxrh"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-33764"
},
{
"type": "WEB",
"url": "https://github.com/WWBN/AVideo/commit/aa2c46a806960a0006105df47765913394eec142"
},
{
"type": "PACKAGE",
"url": "https://github.com/WWBN/AVideo"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "AVideo: IDOR in AI Plugin Allows Stealing Other Users\u0027 AI-Generated Metadata and Transcriptions"
}
GHSA-G3JM-H647-X2WG
Vulnerability from github – Published: 2026-06-05 00:31 – Updated: 2026-06-06 06:30Insufficient policy enforcement in Paint in Google Chrome prior to 149.0.7827.53 allowed a remote attacker to bypass same origin policy via a crafted HTML page. (Chromium security severity: Medium)
{
"affected": [],
"aliases": [
"CVE-2026-11142"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-06-04T23:17:20Z",
"severity": "MODERATE"
},
"details": "Insufficient policy enforcement in Paint in Google Chrome prior to 149.0.7827.53 allowed a remote attacker to bypass same origin policy via a crafted HTML page. (Chromium security severity: Medium)",
"id": "GHSA-g3jm-h647-x2wg",
"modified": "2026-06-06T06:30:28Z",
"published": "2026-06-05T00:31:49Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-11142"
},
{
"type": "WEB",
"url": "https://chromereleases.googleblog.com/2026/06/stable-channel-update-for-desktop.html"
},
{
"type": "WEB",
"url": "https://issues.chromium.org/issues/501668745"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N",
"type": "CVSS_V3"
}
]
}
GHSA-G3Q3-27W2-FGMP
Vulnerability from github – Published: 2024-09-24 03:30 – Updated: 2024-09-24 03:30The Donation Forms by Charitable – Donations Plugin & Fundraising Platform for WordPress plugin for WordPress is vulnerable to privilege escalation in all versions up to, and including, 1.8.1.14. This is due to the plugin not properly verifying a user's identity when the ID parameter is supplied through the update_core_user() function. This makes it possible for unauthenticated attackers to update the email address and password of arbitrary user accounts, including administrators, which can then be used to log in to those user accounts.
{
"affected": [],
"aliases": [
"CVE-2024-8791"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2024-09-24T03:15:03Z",
"severity": "CRITICAL"
},
"details": "The Donation Forms by Charitable \u2013 Donations Plugin \u0026 Fundraising Platform for WordPress plugin for WordPress is vulnerable to privilege escalation in all versions up to, and including, 1.8.1.14. This is due to the plugin not properly verifying a user\u0027s identity when the ID parameter is supplied through the update_core_user() function. This makes it possible for unauthenticated attackers to update the email address and password of arbitrary user accounts, including administrators, which can then be used to log in to those user accounts.",
"id": "GHSA-g3q3-27w2-fgmp",
"modified": "2024-09-24T03:30:44Z",
"published": "2024-09-24T03:30:44Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-8791"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/charitable/tags/1.8.1.14/includes/users/class-charitable-user.php#L872"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/changeset/3154009/charitable/trunk/includes/users/class-charitable-user.php"
},
{
"type": "WEB",
"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/0ee60943-b583-4a99-8e62-846b380c98aa?source=cve"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"type": "CVSS_V3"
}
]
}
GHSA-G3Q3-2MXH-PWCG
Vulnerability from github – Published: 2025-09-23 12:31 – Updated: 2026-06-05 12:31Authorization Bypass Through User-Controlled Key vulnerability in Anadolu Hayat Emeklilik Inc. AHE Mobile allows Privilege Abuse.This issue affects AHE Mobile: from 1.9.7 before 1.9.9.
{
"affected": [],
"aliases": [
"CVE-2025-9342"
],
"database_specific": {
"cwe_ids": [
"CWE-639"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2025-09-23T10:15:35Z",
"severity": "MODERATE"
},
"details": "Authorization Bypass Through User-Controlled Key vulnerability in Anadolu Hayat Emeklilik Inc. AHE Mobile allows Privilege Abuse.This issue affects AHE Mobile: from 1.9.7 before 1.9.9.",
"id": "GHSA-g3q3-2mxh-pwcg",
"modified": "2026-06-05T12:31:42Z",
"published": "2025-09-23T12:31:11Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-9342"
},
{
"type": "WEB",
"url": "https://siberguvenlik.gov.tr/guvenlik-bildirimleri/detay/tr-25-0287"
},
{
"type": "WEB",
"url": "https://www.usom.gov.tr/bildirim/tr-25-0287"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
"type": "CVSS_V3"
}
]
}
Mitigation
For each and every data access, ensure that the user has sufficient privilege to access the record that is being requested.
Mitigation
Make sure that the key that is used in the lookup of a specific user's record is not controllable externally by the user or that any tampering can be detected.
Mitigation
Use encryption in order to make it more difficult to guess other legitimate values of the key or associate a digital signature with the key so that the server can verify that there has been no tampering.
No CAPEC attack patterns related to this CWE.