Product Addons and Product Options With Custom Fields – WowAddons <= 1.6.8 - Missing Authorization
Description
The Product Addons and Product Options With Custom Fields – WowAddons plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 1.6.8. 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
What Changed in the Fix
Changes introduced in v1.6.9
Source Code
WordPress.org SVN# Exploitation Research Plan - CVE-2026-57377 ## 1. Vulnerability Summary The **Product Addons and Product Options With Custom Fields – WowAddons** plugin (versions <= 1.6.8) contains a **Missing Authorization** vulnerability in its REST API implementation. Specifically, the `hello_bar` endpoint fa…
Show full research plan
Exploitation Research Plan - CVE-2026-57377
1. Vulnerability Summary
The Product Addons and Product Options With Custom Fields – WowAddons plugin (versions <= 1.6.8) contains a Missing Authorization vulnerability in its REST API implementation. Specifically, the hello_bar endpoint fails to properly restrict access, allowing unauthenticated attackers to invoke the hello_bar_callback function. This function permits the setting of arbitrary transients in the WordPress database, which can be used to dismiss site-wide administrative notices or manipulate plugin state.
2. Attack Vector Analysis
- Endpoint:
/wp-json/prad/v1/hello_bar - HTTP Method:
POST - Vulnerable Function:
PRAD\Includes\Admin\Notice::hello_bar_callback - Parameters:
type: Must be exactlyhello_barto pass the conditional check.id: The identifier for the transient to be created/updated (sanitized viasanitize_key).
- Authentication: None (Unauthenticated).
- Preconditions: The plugin must be active.
3. Code Flow
- Route Registration: In
includes/admin/class-notice.php, theregister_rest_routemethod is called duringrest_api_init. It registers theprad/v1/hello_barroute. - Missing Check: In affected versions (<= 1.6.8), the
permission_callbackfor this route is either missing, returnstrue, or fails to check for an appropriate capability (likemanage_options). - Request Handling: An attacker sends a
POSTrequest to/wp-json/prad/v1/hello_bar. - Callback Execution: The
hello_bar_callbackmethod is executed:- It retrieves
typeandidfrom the request parameters. - It checks if
type === 'hello_bar'. - If true, it calls
Xpo::set_transient_without_cache( $id, 'hide', 1296000 );.
- It retrieves
- Data Sink:
Xpo::set_transient_without_cachewrites a transient to thewp_optionstable (prefixed with_transient_) with the valuehide.
4. Nonce Acquisition Strategy
This vulnerability is located in a REST API endpoint that lacks authorization. By default, WordPress REST API endpoints do not require a nonce for unauthenticated access if the permission_callback is not enforcing one.
Conclusion: No nonce is required for this exploitation.
5. Exploitation Strategy
The goal is to demonstrate that an unauthenticated user can set a transient that suppresses a site-wide notice.
Step-by-Step Plan:
- Target Identification: Identify a target transient ID used by the plugin. According to
get_hellobar_config()inincludes/admin/class-notice.php, valid IDs include:prad_helloBar_summer1_flash_sale_2026_1
- Malicious Request: Send an unauthenticated
POSTrequest to the REST API. - Trigger: Use the
http_requesttool to perform the action.
Payload Detail:
- URL:
http://<target>/wp-json/prad/v1/hello_bar - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
type=hello_bar&id=prad_helloBar_summer1_flash_sale_2026_1
6. Test Data Setup
- Install Plugin: Ensure
product-addonsversion 1.6.8 is installed and active. - Verify Baseline: Check that the transient
prad_helloBar_summer1_flash_sale_2026_1does not exist yet.
7. Expected Results
- Response: The server should return a
200 OKstatus with a JSON body:{ "success": true, "message": "Hello Bar Action performed" } - Database Change: A new entry will appear in the
wp_optionstable with the key_transient_prad_helloBar_summer1_flash_sale_2026_1and the valuehide.
8. Verification Steps
After sending the HTTP request, verify the transient state via WP-CLI:
# Check if the transient is set to 'hide'
wp transient get prad_helloBar_summer1_flash_sale_2026_1
# Alternatively, check the options table directly
wp option get _transient_prad_helloBar_summer1_flash_sale_2026_1
The output should be hide.
9. Alternative Approaches
If the hello_bar endpoint is patched or behaves differently, check for other routes registered in register_rest_route. The source snippet shows an array-based loop for routes; if other endpoints like set_dismiss_notice were added in the same file without permission_callback, they would also be vulnerable.
Another test is to use an arbitrary id to prove generic transient injection:
- Body:
type=hello_bar&id=cve_poc_test_id - Verification:
wp transient get cve_poc_test_id(should returnhide).
Summary
The WowAddons Product Addons plugin for WordPress is vulnerable to unauthorized transient manipulation due to a missing or inadequate authorization check on its REST API. Unauthenticated attackers can exploit the 'prad/v1/hello_bar' endpoint to set arbitrary WordPress transients to the value 'hide', allowing them to suppress site-wide administrative notices or interfere with plugin state.
Vulnerable Code
// includes/admin/class-notice.php line 39 public function register_rest_route() { $routes = array( // Hello Bar. array( 'endpoint' => 'hello_bar', 'methods' => 'POST', 'callback' => array( $this, 'hello_bar_callback' ), 'permission_callback' => function () { return current_user_can( Xpo::prad_manage_admin_permisson_handler() ); }, ), ); --- // includes/admin/class-notice.php line 82 public function hello_bar_callback( \WP_REST_Request $request ) { $request_params = $request->get_params(); $type = isset( $request_params['type'] ) ? sanitize_text_field( $request_params['type'] ) : ''; $id = isset( $request_params['id'] ) ? sanitize_key( $request_params['id'] ) : ''; if ( 'hello_bar' === $type && ! empty( $id ) ) { Xpo::set_transient_without_cache( $id, 'hide', 1296000 ); } return new \WP_REST_Response( array( 'success' => true, 'message' => __( 'Hello Bar Action performed', 'product-addons' ), ), 200 ); }
Security Fix
@@ -45,7 +45,7 @@ 'endpoint' => 'hello_bar', 'methods' => 'POST', 'callback' => array( $this, 'hello_bar_callback' ), - 'permission_callback' => function () { - return current_user_can( Xpo::prad_manage_admin_permisson_handler() ); - }, + 'permission_callback' => function () { + return current_user_can( 'manage_options' ); + }, ),
Exploit Outline
An unauthenticated attacker can manipulate the site's transients by sending a POST request to the '/wp-json/prad/v1/hello_bar' REST API endpoint. The request must include a 'type' parameter set to 'hello_bar' and an 'id' parameter containing the name of the transient to be set (e.g., 'prad_helloBar_summer1_flash_sale_2026_1'). Because the 'permission_callback' either lacks a strict capability check or fails to validate for administrative privileges, the plugin will execute the 'hello_bar_callback' function and call 'set_transient', writing the value 'hide' to the specified option in the WordPress database. This can be used to bypass administrative UI notices or interfere with other transient-based logic.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.