| CVE Identifier & CNA | CVE-2026-3844 · NVD Record · Assigned by Wordfence CNA (e342b1c0-6e7f-4e2c-8a52-018df12c12a0) |
| Credited Finder / Firm | Hung Nguyen — Founder & Principal Security Researcher, HungSec Labs (github.com/Hung2124) |
| Affected Component | Breeze WordPress Caching Plugin <= 2.4.4 · inc/class-breeze-cache-cronjobs.php (lines 89–119) |
| CWE Classification | CWE-434: Unrestricted Upload of File with Dangerous Type |
1. Vulnerability Overview & Root Cause
The Breeze Cache plugin for WordPress (versions up to and including 2.4.4) contains an unauthenticated arbitrary file upload vulnerability in the fetch_gravatar_from_remote() method inside inc/class-breeze-cache-cronjobs.php. When the "Host Files Locally - Gravatars" option is enabled, the plugin intercepts avatar URLs and downloads remote avatar resources to a publicly accessible cache directory on the server filesystem.
Because fetch_gravatar_from_remote() derived the local filename directly from the remote URL path without validating the file extension or verifying the HTTP response MIME content type via wp_check_filetype_and_ext(), an unauthenticated attacker can supply a crafted Gravatar URL pointing to a .php payload and achieve arbitrary code execution (RCE).
2. Vulnerable Code & Upstream Remediation Diff (Trac Changeset 3511463)
// File: inc/class-breeze-cache-cronjobs.php (Breeze <= 2.4.4 vs 2.4.5 Patch) private function fetch_gravatar_from_remote( $grav_url_id, $grav_Save_path ) { $response = wp_remote_get( $grav_url_id, array( 'timeout' => 15 ) ); if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { return false; } $body = wp_remote_retrieve_body( $response ); - // VULNERABLE: Writes raw response body directly to $grav_Save_path without MIME or extension validation - breeze_read_write_file( $grav_Save_path, $body ); + // FIXED (v2.4.5 - Changeset 3511463): Validate Content-Type & enforce strict image extension allow-list + $content_type = wp_remote_retrieve_header( $response, 'content-type' ); + $allowed_mime = array( 'image/jpeg', 'image/png', 'image/gif', 'image/webp' ); + if ( ! in_array( strtolower( $content_type ), $allowed_mime, true ) ) { + return false; + } + breeze_read_write_file( $grav_Save_path, $body ); }
3. Disclosure & Patch Verification References
- WordPress Trac Vulnerable Source: inc/class-breeze-cache-cronjobs.php#L119
- WordPress Trac Remediation Changeset: Changeset 3511463/breeze