NVD has published three critical, network-vector WordPress plugin vulnerabilities in the last three days: CVE-2026-14281, CVE-2026-89055, and CVE-2026-93399. The highest-risk issue is CVE-2026-14281, rated CVSS 9.8, affecting The Automation Web Platform – Notifications and OTP for WooCommerce, Advanced Country Code plugin in all versions up to and including 4.8.6. The defect is exactly the class internet scanners operationalize fastest: a publicly accessible WordPress REST route, POST /wp-json/wawp/v1/signup/<op>, with missing permission enforcement and no key allowlist, enabling unauthorized privilege gain.
This is not a patch-later Tuesday problem. WordPress plugins sit behind reusable URL patterns, and wp-json routes are easy to enumerate at scale. If the affected plugins are present on an internet-facing WooCommerce, review, or booking site, assume probing will begin quickly if it has not already. Treat CVE-2026-89055 and CVE-2026-93399 with the same urgency: both are rated CVSS 9.1, and the available NVD summaries indicate authorization bypass in Customer Reviews for WooCommerce and Insecure Direct Object Reference in Bookly. The supplied summaries are truncated, so confirm exact fixed versions against NVD, the plugin changelogs, and your vulnerability feed before closure.
Technical Analysis
Affected products and versions confirmed from the advisory summary:
| CVE | CVSS | Affected plugin | Impact pattern | Version detail from summary |
|---|---|---|---|---|
| CVE-2026-14281 | 9.8 | Automation Web Platform – Notifications and OTP for WooCommerce, Advanced Country Code | Unauthorized privilege gain through unauthenticated REST action | All versions up to and including 4.8.6 |
| CVE-2026-89055 | 9.1 | Customer Reviews for WooCommerce | Authorization bypass | Truncated in source summary; verify affected and fixed versions |
| CVE-2026-93399 | 9.1 | Bookly | Insecure Direct Object Reference | Versions up to a truncated bound; verify affected and fixed versions |
CVE-2026-14281 is the clearest exploitation path. WordPress exposes REST routes under /wp-json/. A route shaped like POST /wp-json/wawp/v1/signup/<op> implies an operation parameter in the path that can switch behavior server-side. The advisory states two controls failed together: the route is publicly reachable without adequate permission checks, and sensitive operations are not constrained by an allowlist of valid keys. From a defender perspective, that combination turns a normal signup endpoint into an action dispatcher. If one <op> value creates users, modifies roles, resets credentials, or changes plugin state, an unauthenticated remote request can cross into privilege gain without touching wp-login.php.
The other two CVEs are consistent with common WordPress authorization failures. CVE-2026-89055 is described as an authorization bypass in a reviews workflow; typical failure modes include trusting a client-supplied review, comment, order, or customer identifier without validating ownership or capability. CVE-2026-93399 is an IDOR in Bookly; expect horizontal or vertical object access where changing an appointment, booking, customer, or staff identifier returns or mutates another tenant object. Even when the immediate impact is data exposure, IDOR frequently becomes the first step in account takeover, payment fraud, or stored XSS placement.
Exploitation status: the provided NVD summary does not state confirmed in-the-wild exploitation, a public PoC, or CISA KEV inclusion. Do not use the absence of those labels as a de-prioritization reason. These are network-exploitable WordPress plugin flaws with critical scores; check the CISA KEV catalog and NVD pages continuously during the response window: https://nvd.nist.gov/vuln/detail/CVE-2026-14281, https://nvd.nist.gov/vuln/detail/CVE-2026-89055, https://nvd.nist.gov/vuln/detail/CVE-2026-93399, and https://www.cisa.gov/known-exploited-vulnerabilities-catalog.
Detection and Response
Prioritize three questions for every WordPress estate: is the plugin installed, is the vulnerable route or object pattern reachable, and did any request correlate with privilege, user, review, booking, or file changes? Pull web access logs, WAF logs, WordPress audit logs, plugin update history, wp_users and wp_usermeta changes, outbound connections from PHP workers, and filesystem writes under wp-content. Preserve logs before rotating or cleaning; on suspected compromise, snapshot the host and database before remediation.
Sigma rules
Deploy these against Apache, Nginx, WAF, reverse proxy, or CDN logs normalized into your Sigma pipeline. Tune field names to your log schema, but keep the logic tight: exact route for CVE-2026-14281, method plus success status, and burst behavior for object enumeration.
---
title: WordPress WAWP Signup REST Route Unauthenticated Operation
tid: 550d9a23-0f72-4e3a-a8c5-1d2f3b4c5d6e
status: experimental
description: Detects POST requests to the publicly accessible WAWP signup REST route associated with CVE-2026-14281, especially when followed by success or redirect status codes.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-14281
author: Security Arsenal
date: 2026/04/06
tags:
- attack.initial_access
- attack.privilege_escalation
- attack.t1190
logsource:
category: webserver
detection:
selection:
http_method: 'POST'
url_path|contains: '/wp-json/wawp/v1/signup/'
success_status:
http_status:
- 200
- 201
- 302
condition: selection and success_status
falsepositives:
- Legitimate OTP or signup traffic; investigate volume, source reputation, and resulting WordPress user or role changes
level: critical
---
title: WordPress REST or Admin Object Enumeration Burst
tid: 7a3f1c82-9e4b-4d67-bc12-3e5a8f901234
status: experimental
description: Detects burst access to WordPress REST, admin-ajax, booking, review, or customer object endpoints consistent with authorization bypass or IDOR probing.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-89055
- https://nvd.nist.gov/vuln/detail/CVE-2026-93399
author: Security Arsenal
date: 2026/04/06
tags:
- attack.discovery
- attack.initial_access
- attack.t1190
logsource:
category: webserver
detection:
selection:
http_method:
- 'GET'
- 'POST'
url_path|contains:
- '/wp-json/'
- '/wp-admin/admin-ajax.php'
- 'bookly'
- 'review'
- 'customer'
- 'appointment'
- 'booking'
suspicious_status:
http_status:
- 200
- 201
- 302
- 403
condition: selection and suspicious_status
falsepositives:
- Normal storefront browsing; alert on single source generating many distinct numeric object IDs, alternating 200 and 403 responses, or requests lacking normal cookies and referer
level: high
Microsoft Sentinel / Defender KQL
Use this where Apache, Nginx, CDN, or WAF events arrive through Syslog/CEF. It looks for the exact WAWP route and then broadens to authorization-bypass and IDOR-like probing across reviews and bookings.
let lookback = 7d;
let wawp_route = @'/wp-json/wawp/v1/signup/';
let object_terms = dynamic(['bookly','review','reviews','customer','appointment','booking','admin-ajax.php','wp-json']);
union isfuzzy=true
(CommonSecurityLog
| where TimeGenerated >= ago(lookback)
| extend Url = tostring(coalesce(RequestURL, RequestContext, Message))
| extend Method = tostring(RequestMethod)
| extend Status = toint(HttpStatusCode)
| extend Src = tostring(SourceIP)
| extend Host = tostring(coalesce(DestinationHostName, Computer))
),
(Syslog
| where TimeGenerated >= ago(lookback)
| extend Url = tostring(SyslogMessage)
| extend Method = iff(SyslogMessage has 'POST', 'POST', iff(SyslogMessage has 'GET', 'GET', ''))
| extend Status = extract(@'" (\d{3}) ', 1, tostring(SyslogMessage))
| extend Src = tostring(coalesce(HostIP, SourceIP, Computer))
| extend Host = tostring(Computer)
)
| where Url has wawp_route and Method == 'POST'
or (Url has_any (object_terms) and Method in ('GET','POST') and Status in (200,201,302,403))
| summarize Requests=count(), DistinctUrls=dcount(Url), Statuses=make_set(Status), SampleUrls=make_set(Url, 20) by Src, Host, bin(TimeGenerated, 10m)
| where Requests >= 25 or Url has wawp_route or (Statuses has 200 and Statuses has 403 and DistinctUrls >= 10)
| sort by Requests desc;
Velociraptor VQL
Run this on Linux web hosts to identify web-worker spawned commands, suspicious PHP files in upload paths, and active outbound connections from web processes. It is an evidence-collection hunt, not a standalone verdict.
-- Recent PHP files in upload or cache paths are high-signal after WordPress authorization bugs
SELECT FullPath, Mtime, Size
FROM glob(globs=[
'/var/www/*/wp-content/uploads/**/*.php',
'/var/www/html/wp-content/uploads/**/*.php',
'/srv/www/*/wp-content/uploads/**/*.php',
'/var/www/*/wp-content/cache/**/*.php'
])
WHERE Mtime > now() - 1209600
-- Web servers or PHP workers launching shells or downloaders warrant immediate isolation
SELECT Pid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE CommandLine =~ '(curl|wget|nc|ncat|bash|sh|perl|python|base64|eval|chmod \+x|/tmp|/dev/shm)'
OR Exe =~ '/(tmp|dev/shm|var/tmp)/'
OR Name =~ '(sh|bash|dash|nc|ncat|python|perl)'
-- Unexpected egress from PHP-FPM, Apache, Nginx workers, or containerized WordPress processes
SELECT Pid, Name, RemoteAddr, RemotePort, State
FROM netstat()
WHERE State =~ 'ESTABLISHED'
AND (Name =~ '(php-fpm|php|apache2|httpd|nginx|wordpress)' OR RemotePort in (80,443,4444,53))
Audit and hardening script
Run from a maintenance shell on the WordPress host or management node. The script intentionally avoids deleting plugins automatically; it inventories plugin names and versions, searches logs for the vulnerable route, and emits a reversible Nginx or Apache block snippet you can deploy during triage.
#!/usr/bin/env bash
set -euo pipefail
WP_ROOT=''
if [[ -n '${1:-}' ]]; then WP_ROOT='$1'; fi
if [[ -z '$WP_ROOT' ]]; then
for d in /var/www/html /var/www/*/ /srv/www/*/; do
[[ -f '${d%/}/wp-config.php' ]] && WP_ROOT='${d%/}' && break
done
fi
[[ -n '$WP_ROOT' && -f '$WP_ROOT/wp-config.php' ]] || { echo 'wp-config.php not found; pass WordPress root as argument'; exit 2; }
echo '== Installed plugins matching affected titles =='
find '$WP_ROOT/wp-content/plugins' -maxdepth 2 -type f -name '*.php' -print0 2>/dev/null | \
while IFS= read -r -d '' f; do
head -n 40 '$f' | grep -Eiq 'Plugin Name:.*(Automation Web Platform|Notifications and OTP|Advanced Country Code|Customer Reviews for WooCommerce|Bookly)' && echo '$f'
done
if command -v wp >/dev/null 2>&1; then
echo '== WP-CLI plugin status =='
wp --path='$WP_ROOT' plugin list --fields=name,title,status,version,update 2>/dev/null || true
fi
echo '== Recent hits to CVE-2026-14281 route =='
for log in /var/log/nginx/*access*.log /var/log/apache2/*access*.log /var/log/httpd/*access_log /var/log/caddy/*access*.log; do
[[ -r '$log' ]] || continue
grep -E 'POST[[:space:]]+[^ ]*/wp-json/wawp/v1/signup/' '$log' | tail -n 200 && echo "-- source: $log"
done
echo '== Candidate block rule for emergency change control =='
cat <<'EOF'
# Nginx: temporary deny while patching or removing the vulnerable WAWP plugin
location ~* ^/wp-json/wawp/v1/signup/ { return 403; }
# Apache 2.4: place in vhost or .htaccess only as a short-term control
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^wp-json/wawp/v1/signup/ - [R=403,L]
EOF
echo '== WordPress integrity quick checks =='
find '$WP_ROOT/wp-content/uploads' '$WP_ROOT/wp-content/cache' -type f -name '*.php' -mtime -14 -print 2>/dev/null | head -n 200
getent passwd | awk -F: '$3 >= 1000 {print $1}' | while read -r u; do id '$u'; done | grep -Ei 'sudo|wheel|adm|root' || true
Remediation
- Inventory immediately. Enumerate every WordPress site, staging copy, multisite network, container image, and forgotten marketing subdomain. Confirm plugin presence by directory, database
active_plugins, WP-CLI, and composer or deployment manifests, not only by the admin UI. - Patch or remove CVE-2026-14281 now. For Automation Web Platform – Notifications and OTP for WooCommerce, Advanced Country Code, any version <= 4.8.6 is vulnerable per the summary. Update only to a release that explicitly fixes CVE-2026-14281 and is greater than 4.8.6; if the vendor has not published a fixed build, deactivate and remove the plugin. Do not rely on hiding the route.
- Apply compensating controls for all three CVEs. Block
POST /wp-json/wawp/v1/signup/at the edge unless business-approved, restrict REST andadmin-ajax.phpby IP where feasible, enforce WAF virtual patches, and disable unauthenticated REST exposure for plugins that do not need it. - Verify exact fixed versions for CVE-2026-89055 and CVE-2026-93399. Because the supplied summaries are truncated, do not guess version bounds. Use the NVD entries, WordPress plugin repository changelog, vendor advisory, and your commercial threat feed to confirm affected ranges and the precise fixed release before closing tickets.
- Rotate secrets and review identities. After patching, rotate WordPress salts, API keys, SMTP or OTP provider credentials, payment gateway tokens, and database credentials if there is any evidence of exploitation. Audit
wp_users,wp_usermetacapabilities, new administrators, password resets, review moderation changes, and Bookly appointment or customer records. - Rebuild on confirmed compromise. If you find the vulnerable route plus a success status followed by privilege, file, or database changes, isolate the host, preserve evidence, restore from known-good backup, redeploy clean code, and rotate all credentials reachable by WordPress. Do not clean in place on production ecommerce or booking systems.
- Set deadlines. Internet-facing WooCommerce, review, or Bookly sites: remediate within 24 hours, and block the WAWP route immediately if patching must wait. All other exposed WordPress sites: 72 hours. If CISA adds any of these CVEs to KEV, follow applicable federal or internal KEV SLAs and revalidate compensating controls.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.