Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as contributor
-
DeliveryInject payload into tagName block delimiter comment
-
ExploitAdministrator runs block-conversion migration
-
ExecutionPayload promoted into live post_content HTML
-
ImpactScript executes in visitor browsers
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an authenticated contributor-level (or higher) WordPress account on a site running DesignSetGo ≤2.11.0, used to store a malicious 'tagName' value inside a Section/Row/Grid block delimiter comment (the value evades kses because it contains no '<'). Crucially, the payload is inert until an administrator performs a specific out-of-band action: deactivating the plugin and running the 'Scan & Convert Blocks' block-conversion migration, which triggers the vulnerable build_group_block() and writes the stored tagName into live post_content. The attacker cannot trigger execution on their own. Limiting factors: contributor authentication is mandatory, the migration is a non-default administrative step entirely outside attacker control, and exploitation only lands if/when that migration is run - all of which sharply narrow real-world exploitability. |
| Impact | This is a genuinely medium/low-priority issue despite being a network-vector stored XSS. The CVSS 3.1 vector (AV:N/AC:H/PR:L/UI:R/S:C/C:L/I:L/A:N, base 4.4) tells a consistent, de-escalating story: exploitation needs an authenticated contributor-level account (PR:L), carries high attack complexity (AC:H), and requires user interaction (UI:R). The description clarifies why complexity and interaction are high - the attacker cannot self-trigger the payload; an administrator must run the plugin's 'Scan & Convert Blocks' migration during deactivation to promote the dormant payload into live HTML. That multi-party, non-attacker-controlled precondition is the dominant risk limiter. The vuln.today decision label is 'this_month' (not act_now/emergency). No EPSS score, no CISA KEV listing, and no confirmed public exploit are present in the input, so there is no public exploit identified at time of analysis and no quantitative exploitation-probability signal to weigh - this gap should be noted rather than assumed benign. The signals do not conflict: a low-to-moderate CVSS, a routine priority label, and the absence of exploitation evidence all point the same way. This is a real but low-urgency finding, not a high-CVSS/low-real-risk mismatch. |
| Exploit ScenarioDerived | A contributor-level user crafts a DesignSetGo Section, Row, or Grid block and sets a malicious 'tagName' (e.g. an element name carrying an onerror handler) that lives in the block delimiter comment, where WordPress kses does not treat it as markup. The payload stays dormant until an administrator deactivates the plugin and runs the 'Scan & Convert Blocks' migration, which invokes build_group_block() and writes the attacker's value directly into live post_content, executing the script in the browser of anyone who then views the page. No public exploit is identified in the input; the only code references are the vendor fix and source. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
Stored cross-site scripting in the DesignSetGo WordPress plugin through version 2.11.0 allows a contributor-level (or higher) account to stash an arbitrary HTML element name in the free-form 'tagName' attribute of a Section, Row or Grid block delimiter comment, which later becomes live markup. The payload is dormant by design: it only executes if an administrator deactivates the plugin and runs the 'Scan & Convert Blocks' migration, which invokes build_group_block() and carries the stored value into rendered post_content HTML. The attacker cannot trigger execution themselves, so exploitation requires an authenticated contributor plus a specific, non-default administrative action; no public exploit has been identified at time of analysis and the vulnerability has not been confirmed actively exploited (not in CISA KEV).
RemediationAI
Vendor fix: the correction is committed upstream in PR #659 (https://github.com/jnealey-godaddy/designsetgo/pull/659) and landed in the plugin repository as changeset 3762066 (https://plugins.trac.wordpress.org/changeset/3762066/designsetgo/trunk/includes/admin/class-block-migrator.php); it introduces designsetgo_sanitize_container_tag() as an allowlist of div, section, article, aside, header, footer and main, applies it to every serializer wrapper and to build_group_attrs()/build_group_block(), and adds the corresponding enum to block.json. No tagged release number containing this fix is stated in the available data, so confirm the installed version includes the helper before considering the site patched. Until then, the highest-value control is to restrict who can post Section/Row/Grid blocks - remove or downgrade contributor accounts on sites running an affected version, or gate authoring behind an editorial review role - at the cost of editorial throughput. Second, postpone the deactivation 'Scan & Convert Blocks' migration on affected installs until the patched build is in place, and if migration must run, first search post_content for block delimiter attributes containing tagName values outside the allowlist; note that this only prevents promotion of the payload, it does not remove the stored attribute. Third, review existing posts authored by contributors for hand-edited block comments, since the fix prevents new injection and neutralizes the value during migration but does not itself rewrite previously stored comments in existing content.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
DesignSetGo's Section, Row and Grid blocks expose an 'HTML Element' setting stored as a free-form tagName string inside the block delimiter comment (the serialized block attributes), and the plugin's serializer classes (class-section-serializer.php, class-row-serializer.php, class-grid-serializer.php) build the opening wrapper tag by concatenating '<' with that stored value. The design flaw is a CWE-79 sanitization gap of the allowlist-vs-denylist kind: the pre-patch Grid serializer only ran a character filter (preg_replace('/[^a-z0-9]/i', '', ...)), and the Row/Section serializers and the admin migrator used the raw attribute entirely, so alphanumeric-only values such as script or iframe survived filtering. Because the value contains no '<', WordPress's kses filtering never treats it as markup, which is why the payload passes content sanitization at save time and only materializes when the plugin itself emits the tag. The decisive path is the admin block migrator (includes/admin/class-block-migrator.php, build_group_block()/build_group_attrs()): during the 'Scan & Convert Blocks' step of deactivation it promotes the stored tagName into a core/group block's saved content, converting the dormant comment attribute into live HTML in post_content. The upstream fix (PR #659, changeset 3762066) replaces the character filter and raw concatenations with a single allowlist helper, designsetgo_sanitize_container_tag(), restricted to div, section, article, aside, header, footer and main, adds matching enum constraints to the grid and row block.json/deprecated-layout-settings schemas, and drops out-of-list tagName values during migration so core/group falls back to its default <div>.
Know when Designsetgo gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:L/UI:R/S:C/C:L/I:L/A:N
Contributor access gives PR:L; the required admin-run migration is outside attacker control, forcing AC:H and UI:R; stored XSS runs in other users' context, so S:C with C:L/I:L and no availability impact.
Primary rating from Vendor (Wordfence).
CVSS VectorVendor: Wordfence
DescriptionCVE.org
The DesignSetGo plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'tagName' parameter in all versions up to, and including, 2.11.0 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. Successful exploitation requires an administrator to run the plugin's block-conversion migration ("Scan & Convert Blocks" during deactivation), which triggers the vulnerable build_group_block() function and promotes the dormant payload from a block delimiter comment into live post_content HTML. Successful exploitation additionally requires an action by an administrator - the attacker cannot trigger the vulnerability on their own.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
EUVD-2026-111740
GHSA-pff7-36wv-mf7h
NVD
CVE.org
EPSS
Exploit-DB