GHSA-F324-CF3C-HQGV
Vulnerability from github – Published: 2026-04-08 12:31 – Updated: 2026-04-08 12:31The Robo Gallery plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'Loading Label' setting in all versions up to, and including, 5.1.3. The plugin uses a custom |***...***| marker pattern in its fixJsFunction() method to embed raw JavaScript function references within JSON-encoded configuration objects. When a gallery's options are rendered on the frontend, json_encode() wraps all string values in double quotes. The fixJsFunction() method then strips the "|*** and ***|" sequences, effectively converting a JSON string value into raw JavaScript code. The Loading Label field (stored as rbs_gallery_LoadingWord post_meta) is an rbstext type field that is sanitized with sanitize_text_field() on save. While this strips HTML tags, it does not strip the |***...***| markers since they contain no HTML. When a user inputs |***alert(document.domain)***|, the value passes through sanitization intact, is stored in post_meta, and is later retrieved and output within an inline <script> tag via renderMainBlock() with the quote markers stripped — resulting in arbitrary JavaScript execution. The gallery post type uses capability_type => 'post', allowing Author-level users to create galleries. This makes it possible for authenticated attackers, with Author-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses a page containing the gallery shortcode.
{
"affected": [],
"aliases": [
"CVE-2026-4300"
],
"database_specific": {
"cwe_ids": [
"CWE-79"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-04-08T10:16:01Z",
"severity": "MODERATE"
},
"details": "The Robo Gallery plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the \u0027Loading Label\u0027 setting in all versions up to, and including, 5.1.3. The plugin uses a custom `|***...***|` marker pattern in its `fixJsFunction()` method to embed raw JavaScript function references within JSON-encoded configuration objects. When a gallery\u0027s options are rendered on the frontend, `json_encode()` wraps all string values in double quotes. The `fixJsFunction()` method then strips the `\"|***` and `***|\"` sequences, effectively converting a JSON string value into raw JavaScript code. The Loading Label field (stored as `rbs_gallery_LoadingWord` post_meta) is an `rbstext` type field that is sanitized with `sanitize_text_field()` on save. While this strips HTML tags, it does not strip the `|***...***|` markers since they contain no HTML. When a user inputs `|***alert(document.domain)***|`, the value passes through sanitization intact, is stored in post_meta, and is later retrieved and output within an inline `\u003cscript\u003e` tag via `renderMainBlock()` with the quote markers stripped \u2014 resulting in arbitrary JavaScript execution. The gallery post type uses `capability_type =\u003e \u0027post\u0027`, allowing Author-level users to create galleries. This makes it possible for authenticated attackers, with Author-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses a page containing the gallery shortcode.",
"id": "GHSA-f324-cf3c-hqgv",
"modified": "2026-04-08T12:31:29Z",
"published": "2026-04-08T12:31:29Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-4300"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/tags/5.1.3/includes/frontend/modules/base-grid/grid/grid.v1.php#L89"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/tags/5.1.3/includes/frontend/modules/base-grid/layout.v1.php#L101"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/tags/5.1.3/includes/frontend/modules/base-grid/layout.v1.php#L52"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/tags/5.1.3/includes/frontend/modules/class/jsoptions.php#L87"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/tags/5.1.3/includes/frontend/modules/class/jsoptions.php#L97"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/tags/5.1.3/includes/options/rbs_gallery_options_loading.php#L95"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/trunk/includes/frontend/modules/base-grid/grid/grid.v1.php#L89"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/trunk/includes/frontend/modules/base-grid/layout.v1.php#L101"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/trunk/includes/frontend/modules/base-grid/layout.v1.php#L52"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/trunk/includes/frontend/modules/class/jsoptions.php#L87"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/trunk/includes/frontend/modules/class/jsoptions.php#L97"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/robo-gallery/trunk/includes/options/rbs_gallery_options_loading.php#L95"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/changeset?sfp_email=\u0026sfph_mail=\u0026reponame=\u0026old=3488182%40robo-gallery\u0026new=3488182%40robo-gallery\u0026sfp_email=\u0026sfph_mail="
},
{
"type": "WEB",
"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/d8693b7d-693f-450a-89ef-e936a8813ca9?source=cve"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N",
"type": "CVSS_V3"
}
]
}
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.