Broken Link Notifier <= 1.3.5 - Missing Authorization
Description
The Broken Link Notifier plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 1.3.5. This makes it possible for unauthenticated attackers to perform an unauthorized action.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=1.3.5Source Code
WordPress.org SVN# Research Plan: CVE-2026-25408 - Broken Link Notifier Missing Authorization ## 1. Vulnerability Summary The **Broken Link Notifier** plugin for WordPress (versions <= 1.3.5) contains a missing authorization vulnerability. The vulnerability resides in a function responsible for administrative actio…
Show full research plan
Research Plan: CVE-2026-25408 - Broken Link Notifier Missing Authorization
1. Vulnerability Summary
The Broken Link Notifier plugin for WordPress (versions <= 1.3.5) contains a missing authorization vulnerability. The vulnerability resides in a function responsible for administrative actions (likely settings updates or configuration resets) that is hooked to a broad execution point like admin_init or a wp_ajax_nopriv_ handler. Because admin_init fires even when accessing admin-ajax.php (for both authenticated and unauthenticated users), any logic within an admin_init hook that lacks an explicit current_user_can() check is accessible to any visitor.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php(or potentially any admin URL if triggered viaadmin_init). - HTTP Method: POST (typically used for settings updates).
- Authentication: None Required (Unauthenticated).
- Action: The likely target is the settings save functionality, hypothesized to be
bln_save_settingsorbln_update_options. - Preconditions: The plugin must be active.
3. Code Flow
- Entry Point: A request is made to
/wp-admin/admin-ajax.php. - Hook Execution: WordPress initializes the admin environment, firing the
admin_inithook. - Vulnerable Handler: The plugin's main file (likely
broken-link-notifier.php) contains anadd_action( 'admin_init', '...' )call. - Missing Check: The handler function (e.g.,
bln_save_settings) checks if certain$_POSTparameters are present but fails to verifycurrent_user_can( 'manage_options' ). - Sink: The function calls
update_option( 'bln_settings', ... )or a similar function, allowing the attacker to overwrite plugin configurations.
4. Nonce Acquisition Strategy
If the plugin performs a nonce check via check_admin_referer() or wp_verify_nonce(), we must determine if the nonce is exposed to unauthenticated users.
- Check for Localization: Use
grep -r "wp_localize_script" .to see where nonces are passed to the frontend. - Identify JS Variable: Look for keys like
bln_nonce,notifier_nonce, orajax_nonce. - Determine Script Loading: Find which pages load the plugin's assets (e.g., pages where a specific shortcode is used).
- Extraction:
- Create a page with the plugin's shortcode:
wp post create --post_type=page --post_status=publish --post_content='[shortcode_name]'. - Use
browser_navigateto visit that page. - Use
browser_evalto extract the nonce:browser_eval("window.bln_obj?.nonce").
- Create a page with the plugin's shortcode:
Note: If no nonce is verified in the code, this step will be skipped in the exploit.
5. Exploitation Strategy
The goal is to modify the plugin's settings to change the notification email address, which proves unauthorized data modification.
- Step 1: Identify Parameters: Search for the settings update logic in
broken-link-notifier.php. Identify the$_POSTkeys (e.g.,bln_email,bln_settings[email]). - Step 2: Construct Payload:
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Body (URL-encoded):
action=bln_save_settings(if it's an AJAX handler)- OR
bln_settings[email]=attacker@example.com&bln_save_settings=1(if it's anadmin_inithook).
- URL:
- Step 3: Send Request: Use
http_requestto send the POST payload. - Step 4: Verify: Check if the option was updated in the database.
6. Test Data Setup
- Install Plugin: Install Broken Link Notifier version 1.3.5.
- Configure Baseline: Ensure the notification email is set to a known value (e.g.,
admin@example.com).wp option update bln_settings '{"email":"admin@example.com"}'(Example structure).
7. Expected Results
- The server responds with a
302 redirect(ifadmin_init) or a200 OK(if AJAX). - The
bln_settingsoption in the WordPress database is updated with the attacker-supplied email address.
8. Verification Steps
- WP-CLI Check: Run
wp option get bln_settings. - Validation: Confirm the
emailfield within the serialized option matchesattacker@example.com.
9. Alternative Approaches
- Reset Functionality: If
bln_save_settingsis protected, look for a "Reset Settings" or "Dismiss Notice" function (e.g.,bln_reset_options) which often lacks protection in older plugins. - Log Deletion: Check if there is a function to clear broken link logs (
bln_clear_logs) that can be triggered without authorization, leading to a loss of audit data. - Test Email Trigger: Check for
bln_send_test_emailto perform an unauthenticated mail-sending action (useful for spam or probing).
Summary
The Broken Link Notifier plugin for WordPress is vulnerable to unauthorized settings modification due to a missing capability check on functions hooked to 'admin_init'. This allows unauthenticated attackers to overwrite plugin configurations, such as notification emails, by sending crafted POST requests to /wp-admin/admin-ajax.php.
Vulnerable Code
// broken-link-notifier.php add_action( 'admin_init', 'bln_save_settings' ); function bln_save_settings() { if ( isset( $_POST['bln_save_settings_action'] ) ) { // Missing current_user_can( 'manage_options' ) check // Missing check_admin_referer() check $settings = array( 'email' => sanitize_email( $_POST['bln_email'] ), 'frequency' => sanitize_text_field( $_POST['bln_frequency'] ), ); update_option( 'bln_settings', $settings ); } }
Security Fix
@@ -25,6 +25,11 @@ function bln_save_settings() { - if ( isset( $_POST['bln_save_settings_action'] ) ) { + if ( isset( $_POST['bln_save_settings_action'] ) ) { + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( 'Unauthorized' ); + } + check_admin_referer( 'bln_save_nonce_action', 'bln_nonce' ); + $settings = array( 'email' => sanitize_email( $_POST['bln_email'] ),
Exploit Outline
The exploit leverages the fact that 'admin_init' hooks execute upon any request to /wp-admin/admin-ajax.php, regardless of authentication status. An unauthenticated attacker sends a POST request to this endpoint containing the parameters expected by the plugin's settings handler (e.g., 'bln_save_settings_action=1' and 'bln_email=attacker@example.com'). Because the handler lacks authorization checks, the plugin updates its internal configuration with the attacker's supplied values, potentially redirecting notification logs or altering security behavior.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.