CVE-2026-65437 vulnerability and BitFire protection

How BitFire Blocks CVE-2026-65437: CleanTalk Anti-Spam Stored XSS

WordPress vulnerability research

BitFire's FREE WAF blocks the malicious request URIs behind CVE-2026-65437 before WordPress runs, keeping CleanTalk SpamFireWall die-page XSS from firing.

Unauthenticated CVSS 7.2 High Script execution on site origin Stored Cross-Site Scripting
BitFire · Vulnerability advisoryResearch published
AdvisoryCVE-2026-65437
ComponentAnti-Spam by CleanTalk – Spam Protection Without CAPTCHA
Relevant sourcelib/Cleantalk/ApbctWP/Firewall/SFW.php (diePage() placeholder substitution; same pattern in AntiFlood.php and AntiCrawler.php)
Executive summary

What WordPress administrators need to know

CleanTalk Anti-Spam, installed on more than 200,000 WordPress sites, ships firewall interstitial pages that echo the raw request URI without output escaping. In versions 6.82 and earlier, a denied or test request whose target carries HTML metacharacters has that target substituted straight into a single-quoted href attribute, letting attacker script execute on your site's origin. The same attacker-controlled URL and User-Agent are persisted in the plugin's firewall log table. Fixed in 6.83. BitFire's FREE WAF stops the attack earlier: it inspects the request target before WordPress boots and blocks requests carrying XSS payloads, so the poisoned interstitial is never rendered.

At a glance

Key facts

  • No login, nonce, or capability check guards the firewall check; it runs for anonymous visitors on every front-end request.
  • Raw $_SERVER['REQUEST_URI'] is substituted into the SpamFireWall, Anti-Flood, and Anti-Crawler die pages with no escaping in 6.82.
  • The {REQUEST_URI} placeholder lands inside a single-quoted href attribute in die_page_sfw.html, so metacharacters break out and inject script.
  • CVSS 7.2: network-exploitable, low complexity, no privileges required, changed scope (C:L/I:L).
  • 6.83 wraps every die-page substitution in esc_url(), esc_html(), and esc_attr(), breaking attribute-context injection.
  • BitFire FREE WAF detects XSS payloads in the request target and blocks them before WordPress loads the plugin.
01
Vulnerability overview

Understand the exposure

The affected component, attack path, and practical risk for WordPress websites.

Affected componentAnti-Spam by CleanTalk – Spam Protection Without CAPTCHA
Potential reach200000 installations
Attack techniquestored cross-site scripting
Published2026-09-30
BitFire's FREE WAF reads every request target before WordPress executes, so the crafted URI behind CVE-2026-65437 is detected and blocked before CleanTalk's firewall can render one line of poisoned HTML.
02
Technical analysis

How the vulnerability works

Research details, affected versions, exploitation behavior, and remediation guidance.

Unauthenticated Stored XSS in the SpamFireWall Die Pages

CleanTalk's SpamFireWall hooks init at priority 1 and runs for every front-end request, anonymous included. When it denies a visitor — IP matched in the SFW table, Anti-Flood or Anti-Crawler limits tripped, or ?sfw_test_ip= forcing the test page — the plugin renders a 403 interstitial and dies. In 6.82, SFW.php captures $_SERVER['REQUEST_URI'] unsanitized, maps it to the {REQUEST_URI} placeholder, and injects it with str_replace into a single-quoted href attribute in die_page_sfw.html. Metacharacters in the request target break out of the attribute, so attacker-controlled markup and script execute on your site's origin. Anti-Flood and Anti-Crawler die pages repeat the same unescaped substitutions, and ?debug=1 adds raw header and $_SERVER dumps to the output.

BitFire FREE WAF Stops the Poisoned Request Before WordPress Runs

CVE-2026-65437 lives entirely in what the request carries: the malicious payload must ride in the URI for the die page to echo it. That is exactly the data BitFire's WAF inspects. BitFire FREE's web application firewall evaluates every URL, query string, and request target before WordPress loads a single plugin, detecting cross-site scripting syntax and common evasion patterns. A request target crafted for this CVE is flagged and blocked at the request layer — init never fires, Firewall::run() never executes, and no interstitial is ever rendered with attacker markup inside. This is behavior-based protection, so it needs no CVE-specific virtual patch. BitFire's WAF ships in BitFire FREE for eligible non-commercial sites; commercial sites need the appropriate commercial license.

If Your Site Was Affected, Investigate for Persistence

Update to CleanTalk 6.83 immediately — the release escapes every die-page substitution with esc_url(), esc_html(), and esc_attr() before the str_replace injection, so metacharacters can no longer terminate the attribute. The disclosure is a stored XSS: the attacker's URL and User-Agent persist in the apbct_sfw_logs table and are exported to CleanTalk's service, and the plugin source alone does not pin down every place that data may surface. Patching closes the known path; it does not undo a compromise that already happened. Script that ran in an administrator's browser can act with that session's authority. Run BitFire PRO Threat Hunter to sweep for backdoor administrator accounts, hidden database triggers, long-running PHP processes, and droppers that can restore malware — then remove every persistence mechanism and rotate credentials.

Block CVE-2026-65437 at the Request Layer with BitFire

CVE-2026-65437 turns a spam filter into an XSS delivery page, but the attack dies at BitFire's request layer: the FREE WAF detects the XSS payload in the request target and blocks it before WordPress or CleanTalk ever executes. Pair that prevention with fast patching to 6.83 and, for any site that ran 6.82 or earlier, a BitFire PRO Threat Hunter investigation to rule out leftover persistence. Deploy BitFire today and make the next vulnerable plugin irrelevant.

03
Source review

Vulnerable and fixed code

The relevant source is located in lib/Cleantalk/ApbctWP/Firewall/SFW.php (diePage() placeholder substitution; same pattern in AntiFlood.php and AntiCrawler.php).

BeforeVulnerable behavior
// lib/Cleantalk/ApbctWP/Firewall/SFW.php 6.82 (diePage())
'{CLEANTALK_URL}'  => $apbct->data['wl_url'],
'{REMOTE_ADDRESS}' => $result['ip'],
'{REQUEST_URI}'    => $request_uri,
'{COOKIE_DOMAIN}'  => $this->cookie_domain,

foreach ($replaces as $place_holder => $replace) {
    $this->sfw_die_page = str_replace($place_holder, $replace, $this->sfw_die_page);
}
AfterCorrected behavior
// lib/Cleantalk/ApbctWP/Firewall/SFW.php 6.83 (diePage())
'{CLEANTALK_URL}'  => esc_url($apbct->data['wl_url']),
'{REMOTE_ADDRESS}' => esc_html($result['ip']),
'{REQUEST_URI}'    => esc_url($request_uri),
'{COOKIE_DOMAIN}'  => esc_html($this->cookie_domain),

foreach ($replaces as $place_holder => $replace) {
    $this->sfw_die_page = str_replace($place_holder, $replace, $this->sfw_die_page);
}
04
Zero-day protection

Protection from the first exploit request

BitFire protects WordPress servers on day zero—before a vulnerability is publicly known and before other vendors have time to develop signatures or patches.

01 · VerifyStop unknown clients

Bot controls and browser verification stop untrusted automated clients before previously unknown exploit code reaches WordPress.

02 · DetectBlock malicious behavior

General WAF protections identify dangerous request behavior and hostile payloads without waiting for a vulnerability-specific signature.

03 · PreventContain attacks at runtime

RASP follows execution inside PHP and prevents unauthorized changes to protected files, accounts, and database content.

BitFire · WordPress protectionZero-day ready
BitFire zero-day WordPress vulnerability protection
BitFire combines verified-client controls, behavior-based WAF detection, and runtime RASP enforcement to protect WordPress before an exploit has a name, CVE, signature, or vendor patch.
About the author

Cory Marsh

Cory has more than 20 years of internet security experience and is a lead developer on the BitFire project.

Read BitFire security research →
Protect your WordPress website

Add protection before the next exploit arrives.

BitFire combines bot controls, request inspection, malware detection, and runtime protection in one WordPress security platform.

Protect my site free →