Seraphinite Accelerator <= 2.28.14 - Authenticated (Subscriber+) Exposure of Sensitive Information to an Unauthorized Actor
Description
The Seraphinite Accelerator plugin for WordPress is vulnerable to Sensitive Information Exposure in all versions up to, and including, 2.28.14 via the `seraph_accel_api` AJAX action with `fn=GetData`. This is due to the `OnAdminApi_GetData()` function not performing any capability checks. This makes it possible for authenticated attackers, with Subscriber-level access and above, to retrieve sensitive operational data including cache status, scheduled task information, and external database state.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:NTechnical Details
<=2.28.14What Changed in the Fix
Changes introduced in v2.28.15
Source Code
WordPress.org SVNThis research plan targets a sensitive information exposure vulnerability in the **Seraphinite Accelerator** plugin (<= 2.28.14). The vulnerability exists because the `GetData` function of the plugin's administrative API lacks capability checks, allowing any authenticated user (including Subscribers…
Show full research plan
This research plan targets a sensitive information exposure vulnerability in the Seraphinite Accelerator plugin (<= 2.28.14). The vulnerability exists because the GetData function of the plugin's administrative API lacks capability checks, allowing any authenticated user (including Subscribers) to retrieve internal operational data.
1. Vulnerability Summary
- ID: CVE-2026-3058
- Vulnerability: Sensitive Information Exposure
- Vulnerable Action:
seraph_accel_api(AJAX action) - Vulnerable Parameter:
fn=GetData - Vulnerable Function:
OnAdminApi_GetData()(inferred callback within the API dispatcher) - Cause: The API handler verifies a WordPress nonce but fails to check if the current user has administrative privileges (e.g.,
current_user_can('manage_options')) before returning data.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Authentication: Required (Subscriber level or higher)
- Preconditions: The attacker must obtain a valid WordPress nonce for the
seraph_accel_apiaction. - HTTP Method:
GETorPOST - Parameters:
action:seraph_accel_apifn:GetData_wpnonce: A valid nonce for theseraph_accel_apiaction.
3. Code Flow
- The plugin registers an AJAX action
seraph_accel_api(likely viaadd_action('wp_ajax_seraph_accel_api', ...)inmain.phporoper.php). - Requests are dispatched to a handler that routes calls based on the
fnparameter. - When
fn=GetDatais requested, the dispatcher callsOnAdminApi_GetData(). OnAdminApi_GetData()(found in the plugin's administrative logic) retrieves operational state using functions likeCacheGetInfo()(fromoper.php) or by reading options viaPluginOptions::Get()(fromCmn/Plugin.php).- Because no capability check is performed, the response containing cache status, scheduled tasks, and database information is returned to the requester regardless of their role.
4. Nonce Acquisition Strategy
The plugin uses Plugin::GetAdminApiUri() (defined in Cmn/Plugin.php) to generate API URLs, which includes a nonce for the seraph_accel_api action.
Strategy:
- Create a Subscriber user and log in.
- Navigate to the WordPress Dashboard (
/wp-admin/index.php). - The plugin often prints administrative notices via
_OnAdminNotices()(inmain.php). These notices contain AJAX calls using nonces. - Check for the presence of a global JavaScript object or an inline script containing the nonce.
- Execution:
- Use
browser_evalto search for the nonce in the page source or global variables. - Look specifically for strings matching
_wpnonce=withinonclickattributes or script tags, as seen inmain.php's_OnAdminNoticescall toPlugin::GetAdminApiUri. - Search specifically for the JavaScript variable or localization key associated with the plugin (often
seraph_accel).
- Use
5. Exploitation Strategy
- Preparation:
- Identify a Subscriber user session.
- Extract the
seraph_accel_apinonce using the strategy in Section 4.
- Request:
- Send a GET request to
admin-ajax.phpwith the following parameters:action=seraph_accel_apifn=GetData_wpnonce=[EXTRACTED_NONCE]
- Send a GET request to
- Payload Formulation:
GET /wp-admin/admin-ajax.php?action=seraph_accel_api&fn=GetData&_wpnonce=[NONCE] HTTP/1.1 Cookie: wordpress_logged_in_[HASH]... - Refinement: If the response is empty, the function might require a
siteIdparameter. TrysiteId=m(standard identifier for the main site in this plugin).
6. Test Data Setup
- Install Plugin: Ensure Seraphinite Accelerator <= 2.28.14 is active.
- Enable Cache: Go to the plugin settings and enable caching so there is operational data to "Get".
- Create User:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
- Simulate State: To ensure nonces appear in notices, you can trigger a "settings changed" state:
wp option update seraph_accel_state '{"settChangedUpdateCache":true}'(Note: This is an example, the plugin might use a different key in theseraph_accel_stateJSON).
7. Expected Results
A successful exploit will return a JSON object containing sensitive system information. Look for keys such as:
nObj,size,sizeCacheObj(Cache metrics fromCacheGetInfo)tasksorqueue(Scheduled task info)dborremote(Database status)v(Version information)
8. Verification Steps
- Analyze Response: Confirm the HTTP status is
200 OKand the body is a JSON object. - Verify Content: Check if the JSON contains data that should only be visible to admins (e.g., file paths in the cache directory, specific database table counts, or internal task names).
- Capability Confirmation: Verify that the requesting user (
attacker) still has thesubscriberrole and lacks themanage_optionscapability:wp user get attacker --field=roles(Should returnsubscriber).
9. Alternative Approaches
- Diagnostic Endpoint: If
GetDatais restricted, try other functions that might be handled by the same dispatcher, such asGetStateorGetLog, which might also lack capability checks. - Direct Option Reading: Since the plugin uses
PluginOptions::Get(), check iffn=GetDataallows anoptionparameter to read anyseraph_accel_*option from the database. - Admin Notices: If the nonce is not in a notice, check the script localization:
browser_eval("window.seraph_accel_admin?.api_nonce")(inferred variable name based on plugin slug).
Summary
The Seraphinite Accelerator plugin for WordPress lacks capability checks in its administrative AJAX handler when processing the 'GetData' function. This allows authenticated users with subscriber-level permissions to retrieve sensitive internal data, including cache metrics, database status, and scheduled task information.
Vulnerable Code
// main.php @ 2.28.14 around line 2307 function OnAdminApi_GetData( $args ) { $siteId = !($args[ 'allSites' ]??null) ? GetSiteId() : null; $res = array(); if( $siteId ) { --- // main.php @ 2.28.14 around line 2478 function OnAdminApi_LogClear( $args ) { Gen::LogClear( GetCacheDir() . LogGetRelativeFile(), true ); }
Security Fix
@@ -2307,10 +2307,12 @@ function OnAdminApi_GetData( $args ) { + $res = array(); - $siteId = !($args[ 'allSites' ]??null) ? GetSiteId() : null; + if( !current_user_can( 'manage_options' ) ) + return( $res ); - $res = array(); + $siteId = !($args[ 'allSites' ]??null) ? GetSiteId() : null; if( $siteId ) { @@ -2478,6 +2480,9 @@ function OnAdminApi_LogClear( $args ) { + if( !current_user_can( 'manage_options' ) ) + return; + Gen::LogClear( GetCacheDir() . LogGetRelativeFile(), true ); }
Exploit Outline
The exploit involves an authenticated attacker with Subscriber-level access or higher performing the following steps: 1. Log in to the WordPress site as a Subscriber. 2. Access the WordPress dashboard and extract a valid WordPress nonce for the 'seraph_accel_api' action. This nonce is typically exposed in the HTML source of admin pages or within JavaScript objects (like 'seraph_accel') used for the plugin's UI notices. 3. Send an AJAX request to /wp-admin/admin-ajax.php with the parameters 'action=seraph_accel_api', 'fn=GetData', and the extracted '_wpnonce'. 4. If the site is multi-site or requires a specific ID, the attacker can append 'siteId=m' or 'allSites=1' to the request. 5. The server will respond with a JSON object containing sensitive system details, such as cache paths, file sizes, database table counts, and internal task queues, which are normally restricted to administrators.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.