Overview
Groundhogg — CRM, Newsletters, and Marketing Automation, a WordPress plugin by trainingbusinesspros used to run email marketing, sales pipelines, and automation funnels, is affected by an authenticated privilege-escalation vulnerability tracked as CVE-2026-97644. The flaw affects all versions up to and including 4.9 and carries a CVSS 3.1 score of 8.8 (High), vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H.
The vendor-assigned advisory title describes the issue precisely: "Groundhogg ≤ 4.9 — Authenticated (Sales Person+) Privilege Escalation via Contact Identity Rebinding leading to Administrator Account Takeover via user_id Parameter (v3 /contacts) chained with v4 /emails/test." An attacker holding only a low-privilege Sales Person role can chain two plugin REST endpoints to fully take over an Administrator account — no admin interaction required.
The vulnerability was reserved 2026-09-24, the vendor was notified the same day, it was publicly disclosed 2026-10-02, and the CVE record was published 2026-10-03. The finding is credited to researcher Supakiad S. (m3ez). As of publication there is no entry in the CISA KEV catalog, no public proof-of-concept exploit code, and no known ransomware tie-in.
Vulnerability Details
| Attribute | Value |
|---|---|
| CVE ID | CVE-2026-97644 |
| Severity | High |
| CVSS v3.1 Score | 8.8 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| CWE | CWE-269 — Improper Privilege Management |
| Affected Product | Groundhogg — CRM, Newsletters, and Marketing Automation (WordPress) |
| Affected Versions | ≤ 4.9 |
| Patched Version | 4.9.1 and later |
| Privileges Required | Low — authenticated Sales Person role (or higher) |
| User Interaction | None |
| Attack Vector | Network (remote) |
| Vendor | trainingbusinesspros |
| Assigner | Wordfence |
| Reporter | Supakiad S. (m3ez) |
| CISA KEV | Not listed |
| Public PoC | None observed |
How It Works
Step 1 — Contact Identity Rebinding via POST /gh/v3/contacts
The root cause sits in the create_contact function behind Groundhogg's v3 REST endpoint, POST /gh/v3/contacts. That endpoint is gated solely by the add_contacts capability — a permission granted to the plugin's Sales Person role and above — and it forwards the entire request payload, including a security-bearing user_id field, straight into the upsert logic of Contacts_DB::add().
The problem is that Contacts_DB::add() does not apply the same ownership checks as Contacts_DB::update(). The update path verifies that a caller can only modify contact records they own or have explicit permission to edit. The add/upsert path skips that guard entirely. A low-privileged user can therefore submit a crafted create_contact request that sets user_id to the numeric ID of an Administrator, creating (or rebinding) a contact record that the application's data layer now treats as belonging to that Administrator — even though the request was authenticated as a Sales Person.
This is the "Contact Identity Rebinding" at the heart of the advisory: the attacker doesn't compromise the Administrator's credentials, they manipulate which WordPress identity a contact record — and by extension, any authentication artifact derived from it — is bound to.
Step 2 — Chaining into POST /gh/v4/emails/test
On its own, a mismatched user_id on a contact record is a data-integrity problem. The advisory escalates it to full account takeover by chaining it with Groundhogg's v4 email-testing endpoint, POST /gh/v4/emails/test. That endpoint is restricted by the send_emails capability, which — like add_contacts — is also available to the Sales Person role.
When invoked against the attacker-rebound contact, the test-email flow generates an auto_login_url containing a one-time permissions key. Because the contact record is now bound to the Administrator's user_id, the generated login link is itself bound to the Administrator identity. Visiting that URL authenticates the attacker's browser session as the Administrator — completing the privilege escalation from Sales Person to full site Administrator in two authenticated API calls.
Attack Summary
1. Attacker authenticates to WordPress/Groundhogg with a low-privilege Sales Person account
2. Attacker sends POST /gh/v3/contacts with a crafted payload setting user_id to an Administrator's ID
3. Contacts_DB::add() upserts the record without the ownership checks Contacts_DB::update() enforces
4. The contact record is now rebound to the Administrator identity in Groundhogg's data layer
5. Attacker sends POST /gh/v4/emails/test targeting the rebound contact
6. Groundhogg issues an auto_login_url with a one-time permissions key bound to the Administrator
7. Attacker visits the link and is authenticated as Administrator — full site takeoverImpact Assessment
| Impact Area | Description |
|---|---|
| Privilege Escalation | Authenticated low-privilege users (Sales Person+) can escalate to full Administrator |
| Account Takeover | The chained exploit yields a live, authenticated Administrator session via a one-time login link |
| Confidentiality | Full access to site content, subscriber/contact data, and stored credentials once Admin access is obtained |
| Integrity | Attacker can modify any site content, users, plugins, or settings as Administrator |
| Availability | Administrator access permits site defacement, plugin/theme deactivation, or full takedown |
| Blast Radius | Any WordPress site running Groundhogg ≤ 4.9 with multiple user roles (common on marketing/sales teams) is exposed |
Recommendations
For Site Administrators
- Update Groundhogg to version 4.9.1 or later immediately. The vendor's fix removes the unguarded upsert path in the v3 contacts endpoint. Verify the installed version via Plugins → Installed Plugins or
wp plugin get groundhogg --field=version. - Audit existing user roles. Review all accounts with the Groundhogg Sales Person role (or any role granting
add_contacts/send_emails) and confirm they are still appropriate and necessary. - Review contact records for anomalous
user_idbindings, particularly any contact tied to an Administrator account that wasn't created through normal onboarding. - Rotate WordPress Administrator credentials and force a re-login for all Admin accounts as a precaution if the plugin was running an affected version in production.
For Security Teams
- Hunt for exploitation indicators: unexpected
POSTrequests to/gh/v3/contactscontaining auser_idfield, followed shortly by requests to/gh/v4/emails/testfor the same contact. - Enable WAF rules that flag API payloads to Groundhogg's REST namespace (
/wp-json/gh/) containing unexpecteduser_idparameters. - Enforce least privilege on all custom REST endpoints beyond this plugin: validate that the requester's own identity is consistent with any identity attribute (
user_id, owner fields, etc.) being written or referenced in a payload — not just that the requester holds the matching capability. - Monitor authentication logs for Administrator sessions originating from
auto_login_url/ one-time permission-key flows that don't correlate with a normal admin login event.
For Users with Sales/Marketing Roles
- If your organization runs Groundhogg, confirm with IT/security that the plugin has been patched before continuing to use contact-management or email-test features.
- Report any unexpected permission changes or unfamiliar Administrator activity to your security team immediately.
Key Takeaways
- CVE-2026-97644 is a High-severity (CVSS 8.8) privilege-escalation flaw in the Groundhogg WordPress plugin, affecting all versions ≤ 4.9.
- The root cause is that the v3
create_contactREST endpoint (POST /gh/v3/contacts) forwards an unvalidateduser_idfield intoContacts_DB::add(), which — unlikeContacts_DB::update()— lacks ownership checks. - Chaining this with the v4
POST /gh/v4/emails/testendpoint lets an authenticated Sales Person escalate to a full Administrator session via a one-time login link. - The flaw is fixed in version 4.9.1 — all sites running Groundhogg should update immediately.
- No public exploit code or CISA KEV listing exists yet, but the attack requires only low-privilege authenticated access and no admin interaction, making it a realistic risk on any multi-role WordPress/marketing deployment.
- Defense in depth matters: API endpoints must validate consistency between the authenticated requester and any identity fields in the payload, not rely on capability checks alone.