Breeze – WordPress Cache Plugin <= 2.2.21 - Missing Authorization to Cache Deletion
Description
The Breeze - WordPress Cache Plugin plugin for WordPress is vulnerable to unauthorized cache clearing in all versions up to, and including, 2.2.21. This is due to the REST API endpoint `/wp-json/breeze/v1/clear-all-cache` being registered with `permission_callback => '__return_true'` and authentication being disabled by default when the API is enabled. This makes it possible for unauthenticated attackers to clear all site caches (page cache, Varnish, and Cloudflare) via a simple POST request, granted the administrator has enabled the API integration feature.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=2.2.21Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2025-13864 (Breeze Cache) ## 1. Vulnerability Summary The Breeze Cache plugin (<= 2.2.21) for WordPress contains a missing authorization vulnerability in its REST API implementation. The plugin registers a route `/wp-json/breeze/v1/clear-all-cache` with the `permis…
Show full research plan
Exploitation Research Plan: CVE-2025-13864 (Breeze Cache)
1. Vulnerability Summary
The Breeze Cache plugin (<= 2.2.21) for WordPress contains a missing authorization vulnerability in its REST API implementation. The plugin registers a route /wp-json/breeze/v1/clear-all-cache with the permission_callback explicitly set to __return_true. When the "API Integration" feature is enabled in the plugin settings, this endpoint becomes accessible to unauthenticated users, allowing them to clear the site's entire page cache, Varnish cache, and Cloudflare cache.
2. Attack Vector Analysis
- Endpoint:
/wp-json/breeze/v1/clear-all-cache - Method:
POST - Authentication: None (Unauthenticated)
- Precondition: The "API Integration" feature must be enabled in the Breeze settings. By default, this might be disabled, but if a site owner enables it for legitimate automation, it exposes the endpoint to the public.
- Payload: No specific payload body is required; the act of hitting the endpoint triggers the clearing logic.
3. Code Flow (Inferred)
- Route Registration: The plugin uses the
rest_api_inithook. Inside the callback,register_rest_routeis called for the namespacebreeze/v1. - Vulnerable Endpoint: The route
clear-all-cacheis defined with:methods => 'POST'(or possiblyWP_REST_Server::CREATABLE)permission_callback => '__return_true'
- Feature Check: The handler likely checks if the API feature is active by querying
get_option('breeze_very_basic_settings'). - Action Sink: If the check passes, the handler calls internal functions like
breeze_clear_all_cache()or logic that interacts withBreeze_Configurationto purge filesystem cache (wp-content/cache/breeze/), Varnish via HTTP PURGE, and Cloudflare via their API.
4. Nonce Acquisition Strategy
According to the vulnerability description, the REST API is unauthenticated by design when the feature is enabled.
- No Nonce Needed: Since
permission_callbackis__return_true, the WordPress REST API will not enforce the_wpnoncecheck usually required for cookie-authenticated sessions. - Verification: If the exploit returns a
403 Forbiddenwith a message about a missing nonce, I will:- Search the source for
wp_localize_scriptto find if a nonce is passed to the frontend for this specific API. - Check for a key like
breeze_rest_noncein the globalwindowobject of the admin dashboard.
- Search the source for
5. Exploitation Strategy
- Setup Phase: Enable the Breeze plugin and ensure the API Integration is active.
- State Baseline: Verify that cache files exist in
wp-content/cache/breeze/. - Exploit Execution: Use the
http_requesttool to send aPOSTrequest to the vulnerable endpoint. - Verification Phase: Check if the cache directory is empty or if specific cache files have been deleted.
Proposed HTTP Request
POST /wp-json/breeze/v1/clear-all-cache HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{}
6. Test Data Setup
- Install/Activate Plugin:
wp plugin install breeze --version=2.2.21 --activate - Enable API Integration:
Breeze settings are typically stored in thebreeze_very_basic_settingsoption.# Set the 'breeze-api-enabled' flag to '1' within the settings array # Note: Structure might be an array, need to verify exact key name (inferred: 'breeze-api-enabled') wp option patch insert breeze_very_basic_settings breeze-api-enabled 1 - Generate Cache:
Navigate to the homepage as an anonymous user to trigger page caching.# Using the browser tool to hit the home page multiple times - Verify Cache Presence:
ls -R /var/www/html/wp-content/cache/breeze/
7. Expected Results
- HTTP Response:
200 OKor201 Created. The body likely contains a JSON success message (e.g.,{"success": true, "message": "Cache cleared successfully"}). - System State: The directory
/var/www/html/wp-content/cache/breeze/should be emptied or have significantly fewer files/directories than before the request.
8. Verification Steps
- Check Filesystem via CLI:
# Confirm the cache directory is empty find /var/www/html/wp-content/cache/breeze/ -type f | wc -l # Expected: 0 - Check REST API Response:
Ensure the response code was200and not401(Unauthorized) or403(Forbidden).
9. Alternative Approaches
- Missing API Check: If the exploit fails, check if the plugin uses a different option key than
breeze-api-enabled(e.g.,breeze_api_integration). - Endpoint Discovery: If
/wp-json/breeze/v1/clear-all-cachereturns 404, list all registered routes to find the correct namespace or version:http_request GET /wp-json/ - Method Variation: Try
GETifPOSTfails, although the description specifies a POST request.
Summary
The Breeze WordPress Cache plugin (up to version 2.2.21) exposes a REST API endpoint that allows unauthenticated users to clear all site caches, including page cache, Varnish, and Cloudflare. This occurs because the endpoint uses '__return_true' for its permission check and does not implement additional authentication when the plugin's API integration feature is enabled.
Vulnerable Code
// Inferred registration in the REST API handler, typically found in files like inc/cache/breeze-api.php or similar register_rest_route( 'breeze/v1', '/clear-all-cache', array( 'methods' => 'POST', 'callback' => array( $this, 'clear_all_cache' ), 'permission_callback' => '__return_true', ) );
Security Fix
@@ -10,7 +10,9 @@ register_rest_route( 'breeze/v1', '/clear-all-cache', array( 'methods' => 'POST', 'callback' => array( $this, 'clear_all_cache' ), - 'permission_callback' => '__return_true', + 'permission_callback' => function () { + return current_user_can( 'manage_options' ); + }, ) );
Exploit Outline
The exploit targets sites where the administrator has enabled the 'API Integration' feature in the Breeze settings. 1. Target Identification: Confirm the Breeze plugin is active and the REST API is accessible at /wp-json/breeze/v1/. 2. Precondition Check: Ensure the 'API Integration' setting is enabled (this setting traditionally bypasses other internal auth checks in the vulnerable versions). 3. Payload Delivery: Send an unauthenticated HTTP POST request to the /wp-json/breeze/v1/clear-all-cache endpoint. No specific body payload or nonce is required because the permission_callback is hardcoded to return true. 4. Result: The plugin executes its cache-clearing logic, purging local filesystem caches in wp-content/cache/breeze/ and triggering remote purges for Varnish or Cloudflare if those integrations are configured.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.