Mux Video Uploader <= 1.1.4 - Authenticated (Subscriber+) Information Exposure
Description
The Mux Video Uploader plugin for WordPress is vulnerable to Sensitive Information Exposure in all versions up to, and including, 1.1.4 via the muxvideo_enqueue_settings_script. This makes it possible for authenticated attackers, with subscriber-level access and above, to extract sensitive data including Mux API credentials.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:NTechnical Details
<=1.1.4What Changed in the Fix
Changes introduced in v1.1.5
Source Code
WordPress.org SVN# Research Plan: CVE-2026-7544 Information Exposure in Mux Video Uploader ## 1. Vulnerability Summary The **Mux Video Uploader** plugin (versions <= 1.1.4) is vulnerable to **Sensitive Information Exposure**. The plugin enqueues a settings script via the function `muxvideo_enqueue_settings_script` …
Show full research plan
Research Plan: CVE-2026-7544 Information Exposure in Mux Video Uploader
1. Vulnerability Summary
The Mux Video Uploader plugin (versions <= 1.1.4) is vulnerable to Sensitive Information Exposure. The plugin enqueues a settings script via the function muxvideo_enqueue_settings_script (likely hooked to admin_enqueue_scripts) and uses wp_localize_script to pass the Mux API credentials from the server to the client-side JavaScript.
Because this enqueuing and localization process lacks proper capability checks (e.g., current_user_can('manage_options')), any authenticated user with access to the WordPress admin dashboard—including low-privileged Subscribers—can view the page source and extract the decrypted tokenId and tokenSecret from the MuxVideoSettings JavaScript object.
2. Attack Vector Analysis
- Endpoint: Any WordPress admin page accessible to a Subscriber, typically
/wp-admin/profile.phpor/wp-admin/index.php. - Authentication: Required (Subscriber level or higher).
- Vulnerable Variable: The global JavaScript object
MuxVideoSettingslocalized into the page HTML. - Sensitive Data:
MuxVideoSettings.tokenId(Mux API Token ID)MuxVideoSettings.tokenSecret(Mux API Token Secret)
3. Code Flow
- The plugin registers a function
muxvideo_enqueue_settings_scriptto theadmin_enqueue_scriptshook. - Inside this function, it retrieves the plugin options using
get_option('muxvideo_options'). - The credentials
muxvideo_token_idandmuxvideo_token_secretare decrypted usingmux_maybe_decrypt()(found inincludes/functions.php, line 148). - The decrypted credentials are passed to
wp_localize_scriptto be used byassets/js/settings.js. - As shown in
assets/js/settings.js(lines 5-6):let idValue = MuxVideoSettings.tokenId; let secretValue = MuxVideoSettings.tokenSecret; - A Subscriber user logs into
/wp-admin/. WordPress executes all functions hooked toadmin_enqueue_scripts. - The server responds with HTML containing a
<script>block that definesMuxVideoSettingswith the plain-text credentials.
4. Nonce Acquisition Strategy
While the information exposure itself does not require a nonce (it is a GET-based leak of data into the DOM), subsequent actions (like using the Mux API via the plugin's AJAX handlers) would require the mux_token_nonce.
The source code suggests that mux_token_nonce is likely also localized into the same or a similar object. Based on includes/functions-wp_ajax.php, the AJAX handlers look for a nonce named mux_token_nonce.
To extract the credentials and the nonce:
- Navigate to
/wp-admin/profile.phpas a Subscriber. - Use
browser_evalto extract the values from the global JS scope.
5. Exploitation Strategy
- Preparation:
- Log in as an Administrator.
- Configure the plugin with dummy Mux API credentials (UUID for ID, 75 chars for Secret).
- Access as Attacker:
- Log in as a Subscriber user.
- Navigate to
/wp-admin/profile.php.
- Data Extraction:
- Check if the
MuxVideoSettingsobject exists in the global window scope. - Extract
tokenIdandtokenSecret.
- Check if the
- Proof of Concept:
- Output the extracted credentials to demonstrate exposure.
6. Test Data Setup
- Mux Options:
Use WP-CLI to set validly-formatted dummy credentials so the plugin processes them:
Note: The plugin's# Token ID: UUID format # Token Secret: 75 characters wp option update muxvideo_options '{"muxvideo_token_id":"decafbad-1337-4444-8888-1234567890ab", "muxvideo_token_secret":"this_is_a_very_long_secret_exactly_75_characters_long_for_validation_test_12"}' --format=jsonmuxvideo_handle_option_updatehook will automatically encrypt these when saved viaupdate_option. - Attacker User:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
7. Expected Results
The Subscriber user, despite having no administrative privileges, will be able to retrieve the following via the browser console or page source:
MuxVideoSettings.tokenId=="decafbad-1337-4444-8888-1234567890ab"MuxVideoSettings.tokenSecret=="this_is_a_very_long_secret_exactly_75_characters_long_for_validation_test_12"
8. Verification Steps
- HTTP Request:
Usehttp_requestas the Subscriber to GET/wp-admin/profile.php. - Regex Search:
Search the response body for:"tokenId":"decafbad-1337-4444-8888-1234567890ab""tokenSecret":"this_is_a_very_long_secret_exactly_75_characters_long_for_validation_test_12" - JavaScript Execution:
Usebrowser_eval("window.MuxVideoSettings")and verify the returned JSON object contains the sensitive keys.
9. Alternative Approaches
If the script is only enqueued on specific admin pages (though the ID suggests a general enqueue), check:
/wp-admin/admin.php?page=mux-video-settings(The plugin might fail to check capabilities on the settings page registration itself, allowing Subscribers to visit the URL).- Check for the object on the "Add New Post" page if the Mux Gutenberg block enqueues the same settings script. Based on the file name
assets/js/settings.js, it is highly likely intended for the settings page but erroneously enqueued globally in the admin area.
Summary
The Mux Video Uploader plugin for WordPress exposes sensitive Mux API credentials to any authenticated user with access to the admin dashboard, including low-privileged Subscribers. This occurs because the plugin enqueues a settings script globally and uses wp_localize_script to output decrypted API keys into a global JavaScript object without verifying that the current user has administrative permissions.
Vulnerable Code
// assets/js/settings.js lines 5-6 let idValue = MuxVideoSettings.tokenId; let secretValue = MuxVideoSettings.tokenSecret; --- // includes/functions.php line 148 function mux_maybe_decrypt(string $value): string { if ($value === '') return ''; $dec = mux_crypto_decrypt($value); return $dec !== '' ? $dec : $value; }
Security Fix
@@ -25,6 +25,10 @@ function muxvideo_enqueue_settings_script() { + if (!current_user_can('manage_options')) { + return; + } + $options = get_option('muxvideo_options', []); $token_id = isset($options['muxvideo_token_id']) ? mux_maybe_decrypt($options['muxvideo_token_id']) : ''; $token_secret = isset($options['muxvideo_token_secret']) ? mux_maybe_decrypt($options['muxvideo_token_secret']) : ''; wp_localize_script('muxvideo-settings', 'MuxVideoSettings', [ 'tokenId' => $token_id, 'tokenSecret' => $token_secret, ]); }
Exploit Outline
The vulnerability is exploited by an authenticated attacker with at least Subscriber-level privileges. Since the plugin enqueues the settings script via the 'admin_enqueue_scripts' hook without capability checks, the attacker simply needs to log in and navigate to any accessible admin page (such as /wp-admin/profile.php). By inspecting the page source or using the browser's developer console, the attacker can view the 'MuxVideoSettings' JavaScript object, which contains the decrypted Mux API tokenId and tokenSecret in plaintext.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.