CVE-2026-7544

Mux Video Uploader <= 1.1.4 - Authenticated (Subscriber+) Information Exposure

mediumExposure of Sensitive Information to an Unauthorized Actor
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
1.1.5
Patched in
1d
Time to patch

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:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Low
Confidentiality
None
Integrity
None
Availability

Technical Details

Affected versions<=1.1.4
PublishedJuly 10, 2026
Last updatedJuly 11, 2026

What Changed in the Fix

Changes introduced in v1.1.5

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

# 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.php or /wp-admin/index.php.
  • Authentication: Required (Subscriber level or higher).
  • Vulnerable Variable: The global JavaScript object MuxVideoSettings localized into the page HTML.
  • Sensitive Data:
    • MuxVideoSettings.tokenId (Mux API Token ID)
    • MuxVideoSettings.tokenSecret (Mux API Token Secret)

3. Code Flow

  1. The plugin registers a function muxvideo_enqueue_settings_script to the admin_enqueue_scripts hook.
  2. Inside this function, it retrieves the plugin options using get_option('muxvideo_options').
  3. The credentials muxvideo_token_id and muxvideo_token_secret are decrypted using mux_maybe_decrypt() (found in includes/functions.php, line 148).
  4. The decrypted credentials are passed to wp_localize_script to be used by assets/js/settings.js.
  5. As shown in assets/js/settings.js (lines 5-6):
    let idValue = MuxVideoSettings.tokenId;
    let secretValue = MuxVideoSettings.tokenSecret;
    
  6. A Subscriber user logs into /wp-admin/. WordPress executes all functions hooked to admin_enqueue_scripts.
  7. The server responds with HTML containing a <script> block that defines MuxVideoSettings with 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:

  1. Navigate to /wp-admin/profile.php as a Subscriber.
  2. Use browser_eval to extract the values from the global JS scope.

5. Exploitation Strategy

  1. Preparation:
    • Log in as an Administrator.
    • Configure the plugin with dummy Mux API credentials (UUID for ID, 75 chars for Secret).
  2. Access as Attacker:
    • Log in as a Subscriber user.
    • Navigate to /wp-admin/profile.php.
  3. Data Extraction:
    • Check if the MuxVideoSettings object exists in the global window scope.
    • Extract tokenId and tokenSecret.
  4. Proof of Concept:
    • Output the extracted credentials to demonstrate exposure.

6. Test Data Setup

  1. Mux Options:
    Use WP-CLI to set validly-formatted dummy credentials so the plugin processes them:
    # 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=json
    
    Note: The plugin's muxvideo_handle_option_update hook will automatically encrypt these when saved via update_option.
  2. 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

  1. HTTP Request:
    Use http_request as the Subscriber to GET /wp-admin/profile.php.
  2. 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"
  3. JavaScript Execution:
    Use browser_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:

  1. /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).
  2. 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.
Research Findings
Static analysis — not yet PoC-verified

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

--- a/includes/functions.php
+++ b/includes/functions.php
@@ -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.