← Back to Feed CACHED · 2026-07-22 15:34:04 · CACHE_KEY CVE-2026-4986
CVE-2026-4986 · CWE-862 · Disclosed 2026-06-09

The WPForms WordPress plugin before 1

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

An unlocked mailbox on your checkout page that anyone can stuff with fake 'payment received' notes

WPForms' PayPal Standard/Commerce integration exposes a webhook endpoint that accepts incoming payment event notifications (e.g., PAYMENT.SALE.COMPLETED) but never validates the PayPal-Transmission-Sig header, PAYPAL-CERT-URL, or webhook ID against PayPal's verification API. Any unauthenticated actor who knows or guesses the site's webhook URL can POST a forged JSON body and mark an arbitrary form submission / order as paid, fulfilled, refunded, or cancelled. Affected: WPForms 1.10.0.1 through 1.10.0.4 (Lite and Pro paths that ship the PayPal addon). Fixed in 1.10.0.5.

Vendor rating of 5.3 MEDIUM / Integrity:Low is defensible on the raw CIA math — no confidentiality loss, no availability impact, integrity limited to payment-state records. But the *business* impact (fraudulent order fulfillment, refund abuse, subscription state flips) is worse than the CVSS suggests for the subset of sites using WPForms as a checkout. For the vast majority of WPForms installs (contact forms, lead capture, no payment addon enabled), the endpoint isn't reachable in a meaningful way and the CVE is inert. Net: MEDIUM is fair as a fleet-wide rating; sites actually taking money via WPForms+PayPal should treat this as HIGH for themselves.

"Forged PayPal webhooks let attackers flip order status to 'paid' without paying — real money loss, but scoped to WPForms e-commerce sites."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Identify a WPForms + PayPal target

Attacker fingerprints WordPress sites running WPForms with the PayPal Standard or PayPal Commerce addon enabled. Public tools like wpscan, BuiltWith, or Wappalyzer surface WPForms; a checkout page containing a PayPal button confirms the addon is live. Mass-scanning via Shodan/urlscan for wp-content/plugins/wpforms filters candidates.
Conditions required:
  • Target runs WordPress with WPForms 1.10.0.1–1.10.0.4
  • PayPal addon activated on at least one form
  • Webhook endpoint reachable from Internet
Where this breaks in practice:
  • Only a small fraction of the ~6M WPForms installs use the paid PayPal addon
  • Cloudflare/WAF may hide plugin fingerprints
Detection/coverage: wpscan and Wordfence signatures flag plugin version; unauthenticated GET to plugin path returns known fingerprint
STEP 02

Locate the webhook endpoint

Enumerate the REST route or admin-ajax action WPForms registers for PayPal IPN/webhook callbacks (typically under /?wpforms-listener=paypal or a REST namespace like /wp-json/wpforms/v1/paypal/webhook). The endpoint accepts POST without authentication because it's designed to receive PayPal's server-to-server calls.
Conditions required:
  • Public HTTP(S) reachability
  • Attacker can enumerate WordPress REST routes
Where this breaks in practice:
  • Some hosts restrict REST to logged-in users
  • IP-allowlist of PayPal ranges (rare in WPForms deployments) blocks direct hits
Detection/coverage: NGINX/Apache logs show POST to the listener from non-PayPal ASN
STEP 03

Craft forged PayPal event

Build a JSON body mimicking PayPal's PAYMENT.SALE.COMPLETED or CHECKOUT.ORDER.APPROVED schema, referencing a custom_id or invoice value tied to a real pending form entry ID on the target. Because WPForms skips Paypal-Transmission-Sig and verify-webhook-signature API validation, the plugin trusts the body verbatim.
Conditions required:
  • Knowledge of a valid pending entry / order ID (often sequential and enumerable)
  • Knowledge of the PayPal webhook JSON schema (public)
Where this breaks in practice:
  • Guessing entry IDs may require some enumeration
  • Some sites cross-check email/amount downstream
Detection/coverage: None from WPForms; SIEM correlation on payment_id not matching any real PayPal transaction is possible with custom rules
STEP 04

POST the forgery — cURL / Burp / custom script

Send the crafted body via curl -X POST to the webhook URL with Content-Type: application/json. No auth header, no signature required. WPForms parses the event and updates the linked entry's payment status to completed (or refunded, voided depending on event type).
Conditions required:
  • No WAF rule blocking the POST
  • No rate-limit on unauthenticated REST
Where this breaks in practice:
  • Rate-limited hosts drop repeated POSTs
  • Some managed WP hosts (Kinsta, WPEngine) block unauthenticated REST writes
Detection/coverage: WAF alerts on unusual POST body if signatures exist (Wordfence Premium has a rule post-disclosure)
STEP 05

Realize business impact

Site owner ships physical goods, grants digital access, activates a subscription, or issues a refund based on the forged 'paid' state. On e-commerce WPForms sites this equals direct financial loss; on donation forms it corrupts records; on gated-content sites it grants free access.
Conditions required:
  • Downstream automation (fulfillment, license issuance, email drip) triggers on payment_status = completed
Where this breaks in practice:
  • Manual order review catches obvious anomalies
  • Accounting reconciliation with PayPal ledger surfaces mismatches within 24-72h
Detection/coverage: Weekly PayPal-vs-WordPress reconciliation report; PayPal dashboard shows no matching transaction
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNo confirmed campaigns as of 2026-07-22. Not on CISA KEV.
Public PoCWPScan advisory documents the forged-webhook technique; no weaponized public exploit repo, but the JSON payload is trivially reproducible from PayPal's own webhook docs.
EPSS0.00197 (~0.2%) — very low predicted 30-day exploitation likelihood.
KEV statusNot listed.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N — network, no auth, no user interaction, integrity-only impact rated Low.
Affected versionsWPForms 1.10.0.1 → 1.10.0.4 (PayPal addon required to be active).
Fixed version1.10.0.5 (released before 2026-06-09 disclosure).
Exposure populationWPForms is on ~6M WordPress sites per wordpress.org active-install data; only a *minority* run the PayPal addon (paid tier). Realistic exploitable population likely low tens of thousands globally.
DisclosureReported by Sudhanshu Chauhan (RedHunt Labs), coordinated by WPScan, published 2026-06-09.
CWECWE-862 Missing Authorization — specifically missing webhook signature verification (PayPal's verify-webhook-signature API not called).
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to MEDIUM (5.3/10)

The decisive factor is narrow exploitable population combined with integrity-only impact scoped to a single site's payment ledger: only WPForms installs with the PayPal addon actively wired to fulfillment automation are meaningfully at risk, and blast radius stops at that one site's orders — no cross-tenant, no code execution, no data exfil. That keeps this squarely in MEDIUM despite the unauthenticated network attack vector.

HIGH vulnerability mechanics and fix version
MEDIUM real-world exploited population size
LOW in-the-wild exploitation activity (no telemetry either way)

Why this verdict

  • Unauthenticated + network reachable keeps this from being LOW — anyone on the Internet can hit the endpoint, no phishing or foothold required.
  • Integrity-only, single-tenant blast radius caps it at MEDIUM — attacker can flip payment state on the target site but cannot read data, escalate on the host, or pivot to other WordPress sites.
  • Role multiplier: WPForms is *not* in the high-value-role catalog. Even on an e-commerce site, the affected surface is one plugin's payment reconciliation table, not the identity, hypervisor, or CI plane. No fleet-scale outcome is plausible.
  • Friction: PayPal addon required. The base WPForms plugin doesn't expose the vulnerable listener — the paid PayPal addon must be installed and activated. Most WPForms sites use it purely for contact/lead forms and are unaffected.
  • Friction: business logic often catches it. Sites doing manual fulfillment, accounting reconciliation, or PayPal-dashboard cross-checks detect forged 'paid' states within days. Fully-automated dropship or digital-goods sites are the real victims.
  • EPSS 0.2% and no KEV listing — no exploitation pressure driving an upgrade.

Why not higher?

HIGH would require either fleet-scale blast radius (this is per-site, integrity-only) or credible active exploitation (none reported, EPSS <1%). The bug can't be chained into RCE, credential theft, or lateral movement on the WordPress host — it terminates at a database field flip.

Why not lower?

LOW would ignore that the attack is unauthenticated, remotely reachable, trivial to weaponize from PayPal's public webhook schema, and directly monetizable on affected e-commerce sites. A site owner facing free-goods fraud does not experience this as LOW.

05 · Compensating Control

What to do — in priority order.

  1. Update WPForms to 1.10.0.5 or later — The definitive fix. Push through your WordPress patch pipeline within the noisgate MEDIUM 365-day window, but if you run WPForms + PayPal for real revenue, treat as HIGH for your own environment and deploy inside 30 days.
  2. WAF-block the webhook endpoint to PayPal IP ranges only — Add a Cloudflare / Wordfence / ModSecurity rule allowing POSTs to /?wpforms-listener=paypal and the plugin's REST route ONLY from PayPal's published IPN/webhook egress ranges. Deploy same-day on money-taking sites as an interim gate.
  3. Enable PayPal-side reconciliation job — Nightly cron: pull PayPal transaction ledger via API, diff against WPForms entries flagged payment_status=completed, alert on any WPForms 'paid' entry with no matching PayPal transaction. Catches forgeries within 24h even on unpatched sites.
  4. Disable auto-fulfillment on WPForms payment triggers — For high-risk workflows (digital downloads, license keys, shipping label generation), require manual approval or a second signal (e.g., Stripe order, PayPal API pull) before fulfillment until patched.
What doesn't work
  • MFA / 2FA on WordPress admin — the vulnerable endpoint is unauthenticated by design; admin MFA doesn't touch it.
  • Fail2ban / login brute-force protections — the attack isn't a login, it's a single legitimate-looking POST.
  • Generic 'update WordPress core' — this is a plugin CVE; core updates do nothing.
  • Disabling xmlrpc.php — unrelated attack surface.
06 · Verification

Crowdsourced verification payload.

Run this on the WordPress host (or via SSH to it) as any user with read access to wp-content/plugins/. Invoke as ./check-wpforms.sh /var/www/html where the argument is the WordPress docroot. No root required.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate verifier for CVE-2026-4986 (WPForms PayPal webhook forgery)
# Usage: ./check-wpforms.sh <wordpress-docroot>
set -u
DOCROOT="${1:-/var/www/html}"
FIXED="1.10.0.5"

if [ ! -d "$DOCROOT" ]; then
  echo "UNKNOWN: docroot $DOCROOT not found"
  exit 2
fi

PLUGIN_FILE=$(find "$DOCROOT/wp-content/plugins" -maxdepth 3 -type f -name 'wpforms.php' 2>/dev/null | head -n1)
if [ -z "$PLUGIN_FILE" ]; then
  # Lite variant
  PLUGIN_FILE=$(find "$DOCROOT/wp-content/plugins" -maxdepth 3 -type f -name 'wpforms-lite.php' 2>/dev/null | head -n1)
fi

if [ -z "$PLUGIN_FILE" ]; then
  echo "PATCHED: WPForms plugin not installed on this host"
  exit 0
fi

VERSION=$(grep -iE '^\s*\*?\s*Version:' "$PLUGIN_FILE" | head -n1 | sed -E 's/.*Version:\s*([0-9.]+).*/\1/')
if [ -z "$VERSION" ]; then
  echo "UNKNOWN: could not parse version from $PLUGIN_FILE"
  exit 2
fi

# Check whether PayPal addon is active (increases real risk)
PAYPAL_ADDON=$(find "$DOCROOT/wp-content/plugins" -maxdepth 4 -type d -iname 'wpforms-paypal*' 2>/dev/null | head -n1)

# semver compare: vulnerable if 1.10.0.1 <= v < 1.10.0.5
awk_cmp() { awk -v v="$1" -v f="$2" 'BEGIN{split(v,a,"."); split(f,b,"."); for(i=1;i<=4;i++){x=a[i]+0;y=b[i]+0; if(x<y){print "lt";exit} else if(x>y){print "gt";exit}} print "eq"}'; }
LOWER=$(awk_cmp "$VERSION" "1.10.0.1")
UPPER=$(awk_cmp "$VERSION" "$FIXED")

if { [ "$LOWER" = "gt" ] || [ "$LOWER" = "eq" ]; } && [ "$UPPER" = "lt" ]; then
  if [ -n "$PAYPAL_ADDON" ]; then
    echo "VULNERABLE: WPForms $VERSION with PayPal addon active — CVE-2026-4986 exploitable"
    exit 1
  else
    echo "VULNERABLE: WPForms $VERSION installed (PayPal addon not detected — bug present but not reachable). Patch anyway."
    exit 1
  fi
fi

echo "PATCHED: WPForms $VERSION (>= $FIXED or outside affected range)"
exit 0
07 · Bottom Line

If you remember one thing.

TL;DR
MEDIUM verdict. Per the noisgate remediation SLA, push WPForms 1.10.0.5+ across your WordPress fleet within the 365-day window — but any site actually running the PayPal addon for revenue should be treated as HIGH for that estate and patched inside 30 days. There is no noisgate mitigation SLA for MEDIUM, so go straight to remediation; however, on money-taking sites deploy the PayPal-IP-allowlist WAF rule and turn on nightly PayPal↔WPForms reconciliation this week as a bridge control. Monday morning: inventory which sites have wpforms-paypal* present (the verifier script above), rank those first, and schedule the plugin update through your normal change window.

Sources

  1. WPScan advisory
  2. NVD — CVE-2026-4986
  3. Vulnerability-Lookup CIRCL
  4. PayPal — Verify a Webhook Signature
  5. CWE-862 Missing Authorization
  6. WPForms Changelog
  7. CISA KEV Catalog
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.