{"id":"CVE-2026-109209","kind":"vulnerability","aliases":["CVE-2026-109209"],"related":[],"title":"WordPress video gallery plugin: subscribers can inject stored scripts","description":"The All-in-One Video Gallery – Video Player & Galleries for YouTube, Vimeo & Self-Hosted Videos plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'custom_fields[embedcode]' parameter in all versions up to, and including, 4.9.7 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with subscriber-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. The sanitization bypass is possible because the save_meta_data() handler returns early when $_POST['post_type'] is absent — a condition always true during XML-RPC requests — and the plugin unconditionally grants Subscribers the publish_aiovg_videos capability, making this exploitable by any authenticated user via a single wp.newPost XML-RPC call.","summary":"The All-in-One Video Gallery WordPress plugin, up to and including 4.9.7, fails to sanitize the embed code field, so a logged-in subscriber can store a script that runs in the browser of anyone who opens the affected page. The bypass works through XML-RPC, which skips the check the plugin relies on.","severity":"medium","cvss":6.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["package","self-hosted","wordpress","wordpress-plugin"],"not_affected_if":["plugin-updated","xmlrpc-disabled"],"how_to_check":"- Look for the plugin's version in the WordPress admin Plugins screen or in `wp-content/plugins/all-in-one-video-gallery/all-in-one-video-gallery.php`\n- Check whether XML-RPC is reachable with `curl -I https://example.com/xmlrpc.php`","fix":"- Update the All-in-One Video Gallery plugin to a version later than `4.9.7`\n- Until updated, restrict or disable XML-RPC if the site does not need it\n- Review subscriber accounts and stored embed codes for unexpected script tags","status":"open","published_at":"2026-10-28T03:17:09+00:00","first_seen_at":"2026-10-28T03:31:01+00:00","triaged_at":"2026-10-28T03:32:40+00:00","updated_at":"2026-10-28T03:32:40+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-28T03:32:40Z","model":"claude-haiku-5-5","output":{"fix":"- Update the All-in-One Video Gallery plugin to a version later than `4.9.7`\n- Until updated, restrict or disable XML-RPC if the site does not need it\n- Review subscriber accounts and stored embed codes for unexpected script tags","reach":"internet","title":"WordPress video gallery plugin: subscribers can inject stored scripts","impact":"medium","summary":"The All-in-One Video Gallery WordPress plugin, up to and including 4.9.7, fails to sanitize the embed code field, so a logged-in subscriber can store a script that runs in the browser of anyone who opens the affected page. The bypass works through XML-RPC, which skips the check the plugin relies on.","category":"package","nicknames":[],"who_cares":["wordpress","wordpress-plugin","self-hosted"],"confidence":0.8,"needs_auth":"yes","worst_case":"Scripts run in visitors' browsers, potentially hijacking admin sessions","analyst_note":"","how_to_check":"- Look for the plugin's version in the WordPress admin Plugins screen or in `wp-content/plugins/all-in-one-video-gallery/all-in-one-video-gallery.php`\n- Check whether XML-RPC is reachable with `curl -I https://example.com/xmlrpc.php`","needs_analyst":false,"not_affected_if":["plugin-updated","xmlrpc-disabled"],"who_is_affected":"Sites running the All-in-One Video Gallery plugin at version 4.9.7 or earlier, where any user can register or hold a subscriber account. The exposure is strongest when XML-RPC is enabled, since that is the path that bypasses the check. Sites without this plugin, or with it updated past 4.9.7, can skip it.","user_interaction":"yes","needs_special_setup":"no","severity_if_unknown":"medium"},"cost_usd":0.000674,"input_tokens":3532,"output_tokens":641,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-109209':12A,15A '-2026':11A,14A '4.9.7':37B,122C 'absent':180C 'access':142C,158C 'affect':65B 'aiovg':198C 'all-in-on':25B,82C 'alway':183C 'anyon':61B 'arbitrari':147C 'attack':137C 'authent':136C,206C 'browser':59B 'bypass':68B,164C 'call':215C 'capabl':200C 'check':77B 'code':43B 'condit':182C 'cross':106C 'cross-sit':105C 'custom':111C 'cve':10A,13A 'data':171C 'due':123C 'earli':174C 'emb':42B 'embedcod':113C 'escap':130C 'execut':154C 'exploit':203C 'fail':38B 'field':44B,112C 'galleri':3A,30B,87C,90C 'grant':194C 'handler':172C 'host':19B,96C 'includ':36B,121C 'inject':7A,146C,160C 'input':126C 'insuffici':125C 'level':141C 'log':48B 'logged-in':47B 'make':132C,201C 'meta':170C 'one':28B,85C 'open':63B 'output':129C 'packag':16B 'page':66B,151C,161C 'paramet':114C 'player':89C 'plugin':4A,23B,32B,79B,98C,192C 'possibl':134C,166C 'post':176C,177C 'publish':197C 'reli':80B 'request':189C 'return':173C 'rpc':73B,188C,214C 'run':56B 'sanit':40B,127C,163C 'save':169C 'script':9A,54B,108C,149C 'self':18B,95C 'self-host':17B,94C 'singl':210C 'site':107C 'skip':75B 'store':8A,52B,104C 'subscrib':5A,50B,140C,195C 'subscriber-level':139C 'true':184C 'type':178C 'uncondit':193C 'user':157C,207C 'version':117C 'via':109C,208C 'video':2A,29B,86C,88C,97C,199C 'vimeo':93C 'vulner':102C 'web':148C 'whenev':155C 'wordpress':1A,20B,22B,31B,100C 'wordpress-plugin':21B 'work':69B 'wp.newpost':211C 'xml':72B,187C,213C 'xml-rpc':71B,186C,212C 'youtub':92C","nicknames":[],"mitigations":[],"who_affected":"Sites running the All-in-One Video Gallery plugin at version 4.9.7 or earlier, where any user can register or hold a subscriber account. The exposure is strongest when XML-RPC is enabled, since that is the path that bypasses the check. Sites without this plugin, or with it updated past 4.9.7, can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T03:17:09+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N","cvss_by":"security@wordfence.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-109209","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-109209","severity":null,"published_at":"2026-10-28T03:17:09+00:00","modified_at":"2026-10-28T03:17:09+00:00","first_seen_at":"2026-10-28T03:31:01+00:00","fetched_at":"2026-10-28T03:31:01+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}