CVE-2026-1640

Taskbuilder <= 5.0.2 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Project/Task Comment Creation

mediumMissing Authorization
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
5.0.3
Patched in
1d
Time to patch

Description

The Taskbuilder – WordPress Project Management & Task Management plugin for WordPress is vulnerable to authorization bypass in all versions up to, and including, 5.0.2. This is due to missing authorization checks on the project and task comment submission functions (AJAX actions: wppm_submit_proj_comment and wppm_submit_task_comment). This makes it possible for authenticated attackers, with subscriber-level access and above, to create comments on any project or task (including private projects they cannot view or are not assigned to), and inject arbitrary HTML and CSS via the insufficiently sanitized comment_body parameter.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=5.0.2
PublishedFebruary 17, 2026
Last updatedFebruary 18, 2026
Affected plugintaskbuilder

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan: CVE-2026-1640 - Taskbuilder Missing Authorization ## 1. Vulnerability Summary The **Taskbuilder** plugin for WordPress (versions <= 5.0.2) is vulnerable to an authorization bypass. Two specific AJAX actions, `wppm_submit_proj_comment` and `wppm_submit_task_comment`, fa…

Show full research plan

Exploitation Research Plan: CVE-2026-1640 - Taskbuilder Missing Authorization

1. Vulnerability Summary

The Taskbuilder plugin for WordPress (versions <= 5.0.2) is vulnerable to an authorization bypass. Two specific AJAX actions, wppm_submit_proj_comment and wppm_submit_task_comment, fail to implement proper capability checks or project-level ownership verification. This allows any authenticated user (starting from the Subscriber role) to submit comments on any project or task, including those they are not assigned to or that are marked as private. Additionally, the comment_body parameter is insufficiently sanitized, allowing for the injection of arbitrary HTML and CSS (Stored XSS/HTML Injection).

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • AJAX Actions: wppm_submit_proj_comment and wppm_submit_task_comment
  • HTTP Method: POST
  • Authentication: Required (Subscriber role or higher).
  • Vulnerable Parameters:
    • comment_body: Carries the HTML/CSS payload.
    • proj_id (for project comments): Target Project ID.
    • task_id (for task comments): Target Task ID.
  • Preconditions:
    • The attacker must have a valid subscriber-level account.
    • The attacker needs to know (or brute-force) the ID of a target project or task.

3. Code Flow (Inferred)

  1. Registration: The plugin registers the actions via add_action( 'wp_ajax_wppm_submit_proj_comment', ... ) and add_action( 'wp_ajax_wppm_submit_task_comment', ... ).
  2. Missing Check: Within the handler functions (likely in includes/admin/class-wppm-ajax.php or includes/public/class-wppm-public-ajax.php), the code likely checks for a nonce but fails to call current_user_can() or verify if the $current_user_id has permission to interact with the specific proj_id or task_id.
  3. Data Handling: The comment_body is retrieved from $_POST and passed to a database insertion function (using $wpdb).
  4. Sanitization Sink: The sanitization likely uses wp_kses with a weak configuration or only sanitize_text_field (which might be bypassed or incorrectly applied to HTML content intended for the editor), allowing HTML tags like <div>, <style>, or <img> with event handlers.

4. Nonce Acquisition Strategy

The Taskbuilder plugin typically localizes a global JavaScript object containing nonces.

  1. Identify Shortcode: Taskbuilder uses shortcodes like [wppm_project_list] or [wppm_task_board] to render its interface.
  2. Setup Page: Create a page containing a Taskbuilder shortcode to ensure scripts are loaded.
    wp post create --post_type=page --post_title="Task Portal" --post_status=publish --post_content='[wppm_project_list]'
    
  3. Extraction via Browser:
    • Login as a Subscriber.
    • Navigate to the "Task Portal" page.
    • Use browser_eval to extract the nonce from the localized script object. Based on common Taskbuilder patterns:
      • Variable Name (Inferred): wppm_admin or wppm_public.
      • Nonce Key (Inferred): wppm_nonce.
    • Action: browser_eval("window.wppm_public?.nonce || window.wppm_admin?.nonce").

5. Exploitation Strategy

Step 1: Create Target Data (Admin)

As an administrator, create a project and a task that the subscriber should not be able to access.

  1. Create a Project (note the ID).
  2. Create a Task within that project (note the ID).

Step 2: Obtain Subscriber Credentials

  1. Create a subscriber user: wp user create attacker attacker@example.com --role=subscriber --user_pass=password123.

Step 3: Extract Nonce

  1. Log into the WordPress dashboard as attacker.
  2. Navigate to a page where Taskbuilder is active (created in Test Data Setup).
  3. Extract the nonce using the browser_eval tool.

Step 4: Submit Unauthorized Comment

Send a POST request to admin-ajax.php targeting a project ID the subscriber doesn't own.

HTTP Request (Example for wppm_submit_proj_comment):

POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded

action=wppm_submit_proj_comment&proj_id=[TARGET_PROJ_ID]&wppm_nonce=[NONCE]&comment_body=<div style="color:red; font-size:50px;">Hacked</div><img src=x onerror=alert(document.domain)>

6. Test Data Setup

  1. Plugin Activation: Ensure taskbuilder version 5.0.2 is installed and active.
  2. Target Project:
    • Create a project via WP-CLI or UI.
    • wp db query "INSERT INTO wp_wppm_projects (project_name, created_by, project_status) VALUES ('Secret Project', 1, 'active');" (Note: Actual table names should be verified, usually wp_wppm_projects).
  3. Subscriber User:
    • wp user create victim_sub sub@test.com --role=subscriber --user_pass=password
  4. Shortcode Page:
    • wp post create --post_type=page --post_status=publish --post_content='[wppm_project_list]'

7. Expected Results

  • Response: The server should return a 200 OK status, often with a JSON response like {"status":"success"} or the HTML of the rendered comment.
  • Behavior: Even though the subscriber is not assigned to the "Secret Project," the comment is successfully stored in the database.
  • XSS Trigger: When an administrator views the project comments, the injected HTML/JavaScript (alert) will execute.

8. Verification Steps

  1. Database Check:
    # Check the comments table (e.g., wp_wppm_project_comments)
    wp db query "SELECT comment_body FROM wp_wppm_project_comments WHERE proj_id = [TARGET_PROJ_ID] ORDER BY id DESC LIMIT 1;"
    
  2. Verification of Unauthorized Entry: Confirm the user_id associated with the new comment matches the Subscriber's ID, despite them having no relationship with the project.

9. Alternative Approaches

  • Task Comments: If wppm_submit_proj_comment is patched or behaves differently, attempt the exploit via wppm_submit_task_comment with the task_id parameter.
  • CSS Injection: Use the comment_body to inject <style> tags that disrupt the admin UI (e.g., body { display: none !important; }) to demonstrate the lack of sanitization.
  • Brute Force IDs: Since the vulnerability is missing authorization, if IDs are sequential, the attacker can iterate through proj_id=1, 2, 3... to spray comments across all projects in the system.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Taskbuilder plugin for WordPress (versions <= 5.0.2) is vulnerable to authorization bypass and Stored Cross-Site Scripting (XSS). The AJAX actions for submitting project and task comments fail to verify user permissions, allowing any authenticated user (Subscriber+) to post comments to arbitrary projects or tasks and inject malicious HTML or CSS.

Exploit Outline

1. Authenticate to the WordPress site with Subscriber-level privileges. 2. Navigate to a page containing a Taskbuilder shortcode (like [wppm_project_list]) to extract the security nonce from the localized JavaScript object (e.g., window.wppm_public.nonce). 3. Identify the target proj_id or task_id via enumeration or observation. 4. Send a POST request to /wp-admin/admin-ajax.php with the action parameter set to 'wppm_submit_proj_comment' or 'wppm_submit_task_comment'. 5. Include the valid nonce, the target ID, and a malicious HTML/JavaScript payload in the 'comment_body' parameter (e.g., <script>alert(document.domain)</script>). 6. The payload will be stored and executed in the context of any user, including administrators, who views the project or task comments.

Check if your site is affected.

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