Atomic Edge analysis of CVE-2026-65510 (metadata-based):
This vulnerability is an unauthenticated stored cross-site scripting (XSS) flaw in the PeproDev Ultimate Invoice plugin for WordPress. The plugin, identified by the slug pepro-ultimate-invoice, is affected in versions up to and including 2.2.6. The CVSS vector (AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N) indicates low complexity, no authentication or user interaction required, and a high severity score of 7.2. The flaw resides in insufficient input sanitization and output escaping, allowing attackers to inject arbitrary scripts into pages that execute when a user accesses them.
Root Cause:
Based on the CWE-79 classification and the provided description, the root cause is the plugin’s failure to sanitize user-supplied input and escape output during page generation. The plugin likely handles data submitted through unauthenticated endpoints such as invoice forms or client-facing submission interfaces. Because the vulnerable and/or patched plugin versions are not available for download from WordPress.org, Atomic Edge analysis must infer the specific code patterns rather than confirm them from source. The plugin likely stores attacker-controlled data, such as client name, company name, or invoice notes, in the database without sufficient sanitization (e.g., sanitize_text_field or wp_kses) and later outputs it in the admin invoice preview or PDF rendering context without using escaping functions (e.g., esc_html or esc_attr). The unauthenticated nature suggests the vulnerable input is handled by an AJAX action or REST endpoint that fails to verify nonce or capability, allowing any visitor to submit malicious data.
Exploitation:
To exploit this vulnerability, an attacker would submit crafted data to any unauthenticated form or AJAX endpoint used by the plugin, likely under /wp-admin/admin-ajax.php with an action that corresponds to the plugin’s public invoice handling. Since the plugin is an invoice system, the attacker might supply parameters such as invoice details, client information, or order notes containing JavaScript. For example, an attacker could POST to /wp-admin/admin-ajax.php with action like peprodev_ultimate_invoice_save_invoice and a parameter carrying a payload such as alert(document.cookie). The payload would be stored in the database and later rendered without sanitization, executing when an administrator opens the invoice page or PDF preview. Because the attack is unauthenticated, no nonce or capability check is required, making the attack vector straightforward.
Remediation:
The fix requires implementing proper input sanitization and output escaping throughout the plugin. On the input side, the plugin should sanitize any user-supplied data using functions like sanitize_text_field, sanitize_textarea_field, or wp_kses with an allowed HTML whitelist, depending on the context. On the output side, the plugin must escape all stored or dynamic data when rendered, using esc_html, esc_attr, or esc_url as appropriate. For any AJAX or REST handler that accepts unauthenticated input, the developer should also add nonce checks and capability verification to restrict access, even though the core issue is the XSS. Since no patched version is available, administrators should monitor for updates or consider disabling or removing the plugin until a fixed version is released.
Impact:
Successful exploitation allows an unauthenticated attacker to inject arbitrary JavaScript into the WordPress admin dashboard. When an administrator views the affected invoice page, the script executes in the context of the admin session, which can lead to theft of session cookies, admin account takeover, and the ability to create rogue admin users, modify site content, or inject backdoors. The scope change in the CVSS vector (S:C) indicates the attack can impact resources beyond the vulnerable component, potentially leading to full site compromise. Given that the plugin functions as an invoice management system, the attacker could also tamper with financial records or exfiltrate sensitive customer and order data stored in the plugin.







