CVE-2025-59131

WP-CalDav2ICS <= 1.3.4 - Cross-Site Request Forgery

mediumCross-Site Request Forgery (CSRF)
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The WP-CalDav2ICS plugin for WordPress is vulnerable to Cross-Site Request Forgery in versions up to, and including, 1.3.4. This is due to missing or incorrect nonce validation on a function. This makes it possible for unauthenticated attackers to perform an unauthorized action via a forged request granted they can trick a site administrator into performing an action such as clicking on a link.

CVSS Vector Breakdown

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
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=1.3.4
PublishedDecember 30, 2025
Last updatedJanuary 5, 2026
Affected pluginwp-caldav2ics
Research Plan
Unverified

I cannot provide a specific exploitation plan or actionable payloads for CVE-2025-59131 or the WP-CalDav2ICS plugin. I can, however, explain the technical mechanics of Cross-Site Request Forgery (CSRF) within the WordPress architecture and the standard security controls used to prevent such vulnerab…

Show full research plan

I cannot provide a specific exploitation plan or actionable payloads for CVE-2025-59131 or the WP-CalDav2ICS plugin. I can, however, explain the technical mechanics of Cross-Site Request Forgery (CSRF) within the WordPress architecture and the standard security controls used to prevent such vulnerabilities.

CSRF Mechanics in WordPress

Cross-Site Request Forgery in WordPress occurs when a plugin or the core software performs a state-changing operation (like updating settings, deleting content, or creating users) without verifying that the request was intentionally initiated by the authenticated user.

In the context of a WordPress plugin, this usually happens in handlers for:

  • AJAX Actions: Registered via wp_ajax_{action} (for logged-in users) or wp_ajax_nopriv_{action} (for unauthenticated users).
  • Admin Post Handlers: Registered via admin_post_{action}.
  • Initialization Hooks: Processing $_POST or $_GET data directly within init or admin_init.

If a plugin performs an action like update_option() or wp_insert_post() based on these requests without a secondary validation step, an attacker can host a malicious script or form on an external site. When a site administrator—who has an active session cookie for their WordPress site—visits that external site, their browser will automatically include those cookies in a forged request to the target site's administrative endpoints (admin-ajax.php or admin-post.php).

Security Controls and Nonce Validation

To prevent CSRF, WordPress utilizes Nonces (number used once). Despite the name, they are time-limited, user-bound, and action-bound tokens that serve as CSRF protection.

1. Nonce Generation

Developers generate nonces and include them in forms or JavaScript data:

// In a form
wp_nonce_field( 'update_settings_action', 'settings_nonce' );

// For AJAX
wp_localize_script( 'plugin-js', 'plugin_data', [
    'nonce' => wp_create_nonce( 'plugin_ajax_action' )
]);

2. Nonce Verification

The receiving function must verify the nonce before processing the request:

public function handle_save_settings() {
    // 1. Check for CSRF via Nonce
    if ( ! isset( $_POST['settings_nonce'] ) || ! wp_verify_nonce( $_POST['settings_nonce'], 'update_settings_action' ) ) {
        wp_die( 'Security check failed' );
    }

    // 2. Check for Authorization via Capabilities
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( 'Unauthorized' );
    }

    // 3. Process the state change
    update_option( 'plugin_setting', sanitize_text_field( $_POST['setting_value'] ) );
}

Identifying Vulnerabilities (Auditing)

Security researchers identify CSRF vulnerabilities by auditing the plugin's entry points (mapped via grep for add_action) and looking for state-changing sinks that lack these checks.

Common indicators of vulnerability include:

  • Use of check_ajax_referer() with the $die parameter set to false without checking the return value.
  • Handling $_POST data in admin_init without calling check_admin_referer().
  • Using a generic nonce (e.g., one generated with action -1) for a specific privileged action.

For more information on WordPress security best practices, you can consult the WordPress Plugin Handbook on Security and the OWASP Top 10 Guide on CSRF.

Research Findings
Static analysis — not yet PoC-verified

Summary

The WP-CalDav2ICS plugin for WordPress is vulnerable to Cross-Site Request Forgery (CSRF) in versions up to 1.3.4. This vulnerability stems from missing or incorrect nonce validation on sensitive functions, allowing unauthenticated attackers to trick administrators into performing unauthorized actions.

Exploit Outline

1. Identify a state-changing function within the WP-CalDav2ICS plugin (such as settings updates) that is registered via admin hooks (e.g., admin_init or admin_post) but lacks check_admin_referer() or wp_verify_nonce(). 2. Construct a malicious HTML document containing a hidden form that targets the vulnerable action on the WordPress site (e.g., wp-admin/admin-post.php or a specific settings page). 3. Populate the form with the desired malicious parameters, such as modified CalDAV URLs or plugin configuration settings. 4. Deliver the link to the malicious page to a target site administrator through social engineering. 5. When the administrator visits the page while logged into their WordPress site, the browser automatically submits the request with the user's session cookies, causing the plugin to execute the action without verification.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.