How BitFire Blocks CVE-2023-33996: CleanTalk Anti-Spam Missing Authorization

WordPress vulnerability research

BitFire FREE Bot Protection and BitFire PRO RASP block the missing-authorization AJAX attacks in CleanTalk Anti-Spam before they damage your site.

Authenticated Subscriber Medium Severity (CVSS 6.3) Unauthorized Data Modification Missing Authorization
BitFire · Vulnerability advisoryResearch published
AdvisoryCVE-2023-33996
ComponentAnti-Spam by CleanTalk – Spam Protection Without CAPTCHA
Relevant sourcelib/Cleantalk/ApbctWP/FindSpam/UsersChecker.php (plus CommentsChecker.php, CleantalkSettingsTemplates.php, inc/cleantalk-admin.php)
Executive summary

What WordPress administrators need to know

Anti-Spam by CleanTalk 6.10 and earlier gates seventeen admin AJAX handlers with nothing but a CSRF nonce that the plugin itself discloses to every logged-in user. A subscriber can scrape that nonce from any wp-admin page and then script direct POSTs to /wp-admin/admin-ajax.php to overwrite anti-spam settings, export the full configuration, mass-trash or spam comments, change comment statuses, and delete users flagged as spam. CVE-2023-33996 (CVSS 6.3) is a textbook missing-authorization flaw. BitFire FREE Bot Protection blocks the scripted exploit delivery before WordPress runs, and BitFire PRO RASP independently blocks the unauthorized database writes at the protected operation.

At a glance

Key facts

  • Missing authorization in Anti-Spam by CleanTalk through 6.10; fixed in 6.11
  • Seventeen admin AJAX handlers gated only by a nonce disclosed on every wp-admin page
  • Subscriber-level users can overwrite plugin settings, mass-modify comments, and delete flagged users
  • Sinks include wp_delete_user, wp_trash_comment, wp_spam_comment, and wp_set_comment_status
  • BitFire FREE Bot Protection blocks scripted admin-ajax exploit delivery before WordPress runs
  • BitFire PRO RASP blocks the non-admin database changes at the protected operation
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 techniquemissing authorization
Published2026-10-02
BitFire stops CVE-2023-33996 twice over: BitFire FREE Bot Protection kills the scripted admin-ajax delivery before WordPress runs, and BitFire PRO RASP blocks the unauthorized database changes at the exact moment the vulnerable handler tries to execute.
02
Technical analysis

How the vulnerability works

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

CVE-2023-33996: A Nonce Is Not an Authorization Check

Anti-Spam by CleanTalk 6.10 and earlier registers its spam-checking and settings-template handlers on wp_ajax_* hooks, which WordPress dispatches to every logged-in user, including subscribers. Each handler then ran only check_ajax_referer('ct_secret_nonce') — and that nonce is not a secret. The plugin localizes wp_create_nonce('ct_secret_nonce') into every wp-admin page as ctAdminCommon._ajax_nonce with no capability gating, so any subscriber who loads their profile page holds a valid token. Scripted POSTs to /wp-admin/admin-ajax.php then drive sinks such as UsersChecker::ctAjaxDeleteAllUsers looping wp_delete_user over flagged accounts, CommentsChecker ctAjaxTrashAll and ctAjaxSpamAll, wp_set_comment_status on arbitrary comments, and settings-template import or reset that overwrites stored plugin options. Net impact: unauthorized data modification with limited information disclosure, CVSS 6.3.

BitFire FREE Bot Protection Stops the Exploit Delivery

The whole attack is automated cross-account invocation: a script, not a person, POSTing restricted admin-ajax actions with a scraped nonce. That is precisely the traffic BitFire FREE Bot Protection is built to stop. Unknown or restricted clients cannot call sensitive APIs or probe exploit paths, and a client presenting as a browser must pass lightweight JavaScript verification that scripts and fake browsers fail. Bot Protection therefore kills this exploit at delivery — before WordPress loads a single vulnerable handler, there is no nonce use and no sink. Stated limitation: an explicitly allowed bot or a fully verified real browser is not categorically stopped, which is exactly why BitFire layers runtime enforcement underneath.

BitFire PRO RASP Blocks the Privileged Database Changes

If a request survives delivery, BitFire PRO RASP enforces authorization at the protected operation. Here the modifying code is the plugin itself — not WordPress core and not an approved membership or commerce plugin — so the database guard applies: when a non-admin subscriber request triggers the ajax_delete_all_users wp_delete_user loop, user insertion, or bulk wp_trash_comment and wp_spam_comment calls, BitFire PRO RASP blocks the account-related database write. The flagged users are not deleted and the comments are not trashed. RASP neither sanitizes the request nor needs to recognize CVE-2023-33996; it simply refuses the unauthorized privileged outcome, which is exactly where this vulnerability's impact lives.

Update to 6.11 and Enforce the Fix

CleanTalk 6.11 closes the flaw by routing every one of the seventeen handlers through a new helper, apbct__check_admin_ajax_request(), which keeps the nonce check and adds current_user_can('manage_options'), dying with a 403 otherwise. Update to 6.11 or later now. Note that the nonce-disclosure code itself remains in place — nonce secrecy was never the defense; the capability check is. While you patch, BitFire holds the line: delivery blocked at the request layer, privileged writes blocked at runtime.

If Your Site Was Affected, Investigate for Persistence

Patching closes the known path; it does not undo a compromise that already succeeded. An abuser of this flaw could rewrite plugin settings and destroy or reshape user and comment data, so treat any site that ran 6.10 or earlier as suspect. Run BitFire Threat Hunter to sweep for backdoor administrator accounts, hidden database triggers, long-running PHP processes, and droppers that can restore malware or reinfect the site. Remove every persistence mechanism it finds and rotate your WordPress and database credentials. The absence of an obvious malicious file is not proof of a clean site.

Protect the Site You Patch

CVE-2023-33996 turns 200,000 CleanTalk installations into soft targets through one missing capability check. BitFire's answer is layered and decisive: BitFire FREE Bot Protection stops the scripted admin-ajax delivery before WordPress runs, and BitFire PRO RASP blocks the unauthorized user and comment database changes at the protected operation. Update to CleanTalk 6.11 or later, put BitFire in front of your site, and run Threat Hunter if the vulnerable version was ever live. Install BitFire today and make this exploit class irrelevant to your WordPress stack.

03
Source review

Vulnerable and fixed code

The relevant source is located in lib/Cleantalk/ApbctWP/FindSpam/UsersChecker.php (plus CommentsChecker.php, CleantalkSettingsTemplates.php, inc/cleantalk-admin.php).

BeforeVulnerable behavior
public static function ctAjaxDeleteAllUsers($count_all = 0)
{
    check_ajax_referer('ct_secret_nonce', 'security');
AfterCorrected behavior
function apbct__check_admin_ajax_request()
{
    check_ajax_referer('ct_secret_nonce', 'security');

    if ( ! current_user_can('manage_options') ) {
        wp_die('-1', 403);
    }
}
// Applied in place of the bare nonce check inside all seventeen affected handlers
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 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 →