| Plugin Name | Better Find and Replace |
|---|---|
| Type of Vulnerability | Cross-Site Scripting (XSS) |
| CVE Number | CVE-2026-3369 |
| Urgency | Low |
| CVE Publish Date | 2026-04-16 |
| Source URL | CVE-2026-3369 |
Authenticated (Author) Stored XSS in Better Find and Replace Plugin — What WordPress Site Owners Must Do Now
Author: Hong Kong Security Expert | Date: 2026-04-16
Executive summary
On 16 April 2026 a stored Cross‑Site Scripting (XSS) vulnerability affecting the WordPress plugin “Better Find and Replace — AI‑Powered Suggestions” (also known as Real Time Auto Find and Replace) was disclosed (CVE‑2026‑3369). The issue affects versions up to and including 1.7.9 and is fixed in version 1.8.0.
- Vulnerability type: Stored XSS (persistent)
- Affected versions: <= 1.7.9
- Patched in: 1.8.0
- CVE: CVE‑2026‑3369
- Required privilege to initiate: Author
- Exploitation requires user interaction with privileged accounts (trusted user must view the malicious content)
- Reported CVSS: 5.9 (medium/low impact rating in the context of WordPress)
This post describes the vulnerability, why it matters, immediate actions you should take, short‑term mitigations you can apply now, and recommended long‑term changes for plugin authors, site owners and hosting teams. The guidance is pragmatic and tuned for operational teams in Hong Kong and similar environments — clear, actionable steps to reduce risk quickly.
Why stored XSS in a plugin matters (even when the required privilege is “Author”)
Cross‑Site Scripting is one of the most common web vulnerabilities. Stored (persistent) XSS occurs when user‑supplied data is stored by the application and later rendered in a page without proper sanitization/escaping. Because the payload is stored, it can affect any user who views the affected page or UI.
This case may seem lower risk because an Author must supply the payload and a privileged user must view it. However, stored XSS in admin areas is meaningful for several reasons:
- Admin contexts typically have elevated privileges and expose sensitive operations (editing content, changing settings, media management).
- Scripts executing in an authenticated admin context can perform actions on behalf of that admin (change settings, call admin AJAX endpoints, create content or users), enabling privilege escalation or site takeover.
- Attackers can remain dormant: payloads uploaded by Authors can wait until a high‑value target interacts with the content, complicating detection.
Recommended immediate response: patch promptly, harden short term, and monitor closely.
Understanding this vulnerability: what’s happening technically
High level:
- The plugin stored an uploaded image’s title (attachment post_title) without stripping or escaping dangerous characters.
- When that title was later rendered inside the plugin’s admin UI it was printed in a context that allowed HTML/JavaScript execution.
- An authenticated Author can set the attachment title; if a privileged user later views the page that outputs the title unescaped, the script runs in the privileged user’s browser session.
Why this pattern is risky:
- Input is stored (attachment metadata) without proper sanitization.
- Output is not escaped for the HTML context where it is printed.
- The plugin UI is presented inside wp-admin, a high‑privilege context.
The combination of stored input plus unsafe output is the classic recipe for stored XSS. Do not ignore stored XSS simply because the initial actor has ‘only’ Author privileges.
Realistic attack scenarios
- An Author uploads an image with a crafted title. An Administrator views the plugin’s “replace” UI or media list and triggers the stored script. The script executes with admin privileges and can perform actions available in that context.
- An attacker who can create or compromise Author accounts (open registrations, credential reuse, supply‑chain tactics) can plant payloads and wait for a high‑value user to trigger them.
- When combined with weak passwords, no MFA and unmonitored sessions, stored XSS can be leveraged to install backdoors, exfiltrate data, or persist access.
Immediate actions for site owners and administrators
If you run WordPress and use the Better Find and Replace plugin:
- Update the plugin immediately to version 1.8.0 or later. Updating is the most effective mitigation. Prioritise sites with multiple Authors, Editors or Administrators.
- If you cannot immediately update, apply temporary mitigations:
- Restrict or remove media upload capability for untrusted roles (Authors). Limit the ‘upload_files’ capability to roles you trust.
- Manually audit recent uploads: look for attachments with unusual titles containing angle brackets, script fragments, HTML entities or non‑printable characters.
- Temporarily restrict access to the plugin’s UI (for example via server IP restrictions or web server rules) until you can patch.
- Advise Authors not to upload third‑party files and to avoid clicking unfamiliar links.
- Check active sessions and revoke suspicious ones: Force logout of all users and require password resets for elevated accounts if you suspect a compromise.
- Perform a quick scan: Check for new users, new plugins or modified files, suspicious scheduled tasks, and unknown admin posts.
- Increase monitoring: Enable detailed access logs and admin action logs for at least 30 days. Watch for unexpected outgoing connections and spikes in admin actions.
Short code mitigation you can deploy now (safe sanitization on media add)
If you cannot update the plugin immediately (production change windows, testing constraints), you can add a short must‑use snippet that sanitizes attachment titles at upload time and on updates. This reduces the immediate attack surface by ensuring titles and captions contain only plain text.
Example snippet — sanitize attachment titles on add and update:
post_title));
$sanitized_excerpt = sanitize_text_field(wp_strip_all_tags($post->post_excerpt));
$updated = false;
$args = array('ID' => $attachment_id);
if ($post->post_title !== $sanitized_title) {
$args['post_title'] = $sanitized_title;
$updated = true;
}
if ($post->post_excerpt !== $sanitized_excerpt) {
$args['post_excerpt'] = $sanitized_excerpt;
$updated = true;
}
if ($updated) {
wp_update_post($args);
}
}
?>
Notes:
- Use this only as a temporary mitigation when patching is not immediately possible. The correct fix is to update the plugin so it stops outputting unescaped content.
- After deploying, scan existing attachments and sanitize suspicious titles (you can run a one‑time script to iterate through attachments and update titles similarly).
- Deploy as a must‑use plugin or a site‑specific plugin so it runs before most other plugins.
How a Web Application Firewall (WAF) / virtual patch helps
A WAF or virtual patch can provide short‑term protection for sites that cannot update immediately. Use it as a stopgap while you plan and apply the permanent fix.
Practical WAF/virtual patch measures for this specific issue: