/

CVE-2026-104725

Severity:

HIGH RISK

(8.8)

Privilege Escalation (CWE-269) in Groundhogg WordPress

CVE-2026-104725

Deferred

Vulnerability type

Category:

Privilege Escalation

CWE:

CWE-269

Impact:

Account Takeover and Unauthorized Administrative Access

Severity:

HIGH RISK

(8.8)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

Groundhogg for WordPress contains a privilege escalation flaw caused by missing ownership and capability checks when updating a contact's linked WordPress user. An authenticated user with sufficient sales-related permissions may link a contact to an administrator account and use an auto-login link to authenticate as that administrator.

Groundhogg for WordPress contains a privilege escalation flaw caused by missing ownership and capability checks when updating a contact's linked WordPress user. An authenticated user with sufficient sales-related permissions may link a contact to an administrator account and use an auto-login link to authenticate as that administrator.

Affected context

The issue occurs in Groundhogg installations where authenticated users have the edit_contacts capability and related note permissions. The vulnerable contact-editing workflow accepts a user identifier without adequately verifying ownership or requiring capabilities associated with managing or promoting WordPress users. Exploitation also depends on auto-login links being generated in note content and remaining readable to the initiating user.

The issue occurs in Groundhogg installations where authenticated users have the edit_contacts capability and related note permissions. The vulnerable contact-editing workflow accepts a user identifier without adequately verifying ownership or requiring capabilities associated with managing or promoting WordPress users. Exploitation also depends on auto-login links being generated in note content and remaining readable to the initiating user.

Exploit preconditions

  • Attack surface: Authenticated Groundhogg contact-management functionality in WordPress
  • Required access: An authenticated account with edit_contacts, plus the ability to add and view notes; sales representative-level access may satisfy these conditions by default
  • Trigger point: Processing a contact update through the process_edit() function and generating an {auto_login_link} value in a note
  • Target condition: A valid administrator WordPress user account must be available for association with the contact
  • Why exploitation is possible: The application does not sufficiently verify contact ownership or require edit_users or promote_users before accepting an arbitrary linked user ID and generating an authentication URL
  • Attack surface: Authenticated Groundhogg contact-management functionality in WordPress
  • Required access: An authenticated account with edit_contacts, plus the ability to add and view notes; sales representative-level access may satisfy these conditions by default
  • Trigger point: Processing a contact update through the process_edit() function and generating an {auto_login_link} value in a note
  • Target condition: A valid administrator WordPress user account must be available for association with the contact
  • Why exploitation is possible: The application does not sufficiently verify contact ownership or require edit_users or promote_users before accepting an arbitrary linked user ID and generating an authentication URL

Why this happens

The underlying bug is an authorization failure caused by missing object-level ownership validation and insufficient capability enforcement. The contact-editing logic trusts a user-supplied account identifier without confirming that the requester may associate the contact with that account. This behavior maps to CWE-269: Improper Privilege Management, because a lower-privileged authenticated user can cause a privileged identity to be used in an authentication workflow.

The underlying bug is an authorization failure caused by missing object-level ownership validation and insufficient capability enforcement. The contact-editing logic trusts a user-supplied account identifier without confirming that the requester may associate the contact with that account. This behavior maps to CWE-269: Improper Privilege Management, because a lower-privileged authenticated user can cause a privileged identity to be used in an authentication workflow.

Potential impact

  • An authenticated attacker could obtain administrator-level access
  • The attacker may modify WordPress settings, content, users, or plugin configuration
  • The attacker could create persistent accounts or additional privileged access
  • Sensitive site, customer, and marketing data could be exposed
  • The compromised site could be used to distribute malicious content or affect connected services
  • An authenticated attacker could obtain administrator-level access
  • The attacker may modify WordPress settings, content, users, or plugin configuration
  • The attacker could create persistent accounts or additional privileged access
  • Sensitive site, customer, and marketing data could be exposed
  • The compromised site could be used to distribute malicious content or affect connected services

General mitigation guidance

Mitigation generally focuses on enforcing authorization at every contact-to-user association boundary and preventing lower-privileged users from influencing privileged authentication identities.

Common defensive patterns include:

  • Require explicit capability checks for user association, user management, and privilege changes
  • Enforce object-level ownership and authorization checks for every contact update
  • Reject references to privileged accounts unless the requester has an appropriate administrative capability
  • Avoid generating authentication links for identities selected through insufficiently trusted input
  • Treat auto-login URLs as highly sensitive credentials and minimize their persistence, visibility, and lifetime
  • Apply least privilege to sales and marketing roles, including note creation and note viewing permissions
  • Review existing contacts, notes, authentication links, and administrator sessions for unexpected changes

Mitigation generally focuses on enforcing authorization at every contact-to-user association boundary and preventing lower-privileged users from influencing privileged authentication identities.

Common defensive patterns include:

  • Require explicit capability checks for user association, user management, and privilege changes
  • Enforce object-level ownership and authorization checks for every contact update
  • Reject references to privileged accounts unless the requester has an appropriate administrative capability
  • Avoid generating authentication links for identities selected through insufficiently trusted input
  • Treat auto-login URLs as highly sensitive credentials and minimize their persistence, visibility, and lifetime
  • Apply least privilege to sales and marketing roles, including note creation and note viewing permissions
  • Review existing contacts, notes, authentication links, and administrator sessions for unexpected changes

How teams detect issues like this

Detection and review can focus on:

  • Static analysis for contact-update handlers that accept user identifiers without authorization checks
  • Code review signals such as direct assignment of request parameters to account-link fields
  • Verification that object ownership, capability checks, and target-user privilege checks occur before updates
  • Monitoring for lower-privileged users changing contact associations to administrator accounts
  • Auditing notes for unexpected {auto_login_link} usage or authentication URLs
  • Policy checks that restrict auto-login functionality and sensitive note visibility by role
  • Automated application security testing that exercises authorization boundaries across WordPress roles

Detection and review can focus on:

  • Static analysis for contact-update handlers that accept user identifiers without authorization checks
  • Code review signals such as direct assignment of request parameters to account-link fields
  • Verification that object ownership, capability checks, and target-user privilege checks occur before updates
  • Monitoring for lower-privileged users changing contact associations to administrator accounts
  • Auditing notes for unexpected {auto_login_link} usage or authentication URLs
  • Policy checks that restrict auto-login functionality and sensitive note visibility by role
  • Automated application security testing that exercises authorization boundaries across WordPress roles

Sources

SourceLink
github.comgithub.com/groundhoggwp/groundhogg/commit/804abf42a
plugins.trac.wordpress.orgplugins.trac.wordpress.org/browser/groundhogg/tags/4.9/admin/contacts/contacts-page.php#L507
plugins.trac.wordpress.orgplugins.trac.wordpress.org/browser/groundhogg/tags/4.9/admin/contacts/contacts-page.php#L565
plugins.trac.wordpress.orgplugins.trac.wordpress.org/browser/groundhogg/tags/4.9/includes/classes/note.php#L58
plugins.trac.wordpress.orgplugins.trac.wordpress.org/browser/groundhogg/tags/4.9/includes/replacements.php#L1811
plugins.trac.wordpress.orgplugins.trac.wordpress.org/browser/groundhogg/tags/4.9/includes/rewrites.php#L471
plugins.trac.wordpress.orgplugins.trac.wordpress.org/changeset?reponame=&new=3724910%40groundhogg%2Ftags%2F4.9.1&old=3724058%40groundhogg%2Ftags%2F4.9
wordfence.comwordfence.com/threat-intel/vulnerabilities/id/715b4d10-b19a-4b37-8a76-985c37975c93?source=cve

Frequently asked

questions

An authenticated user may be able to exploit it when their role includes the required contact-editing and note permissions, such as sales representative-level access in affected configurations.

No. The attack path is intended to allow a sufficiently privileged non-administrator account to obtain administrator-level authentication through the vulnerable contact and auto-login workflow.

Enforce ownership and capability checks before accepting any linked WordPress user ID, and restrict authentication-link generation to trusted administrative workflows.

Apply least-privilege role design, validate authorization on both the object and target identity, protect or avoid persistent auto-login URLs, and test every privileged workflow with lower-privileged roles.

An authenticated user may be able to exploit it when their role includes the required contact-editing and note permissions, such as sales representative-level access in affected configurations.

No. The attack path is intended to allow a sufficiently privileged non-administrator account to obtain administrator-level authentication through the vulnerable contact and auto-login workflow.

Enforce ownership and capability checks before accepting any linked WordPress user ID, and restrict authentication-link generation to trusted administrative workflows.

Apply least-privilege role design, validate authorization on both the object and target identity, protect or avoid persistent auto-login URLs, and test every privileged workflow with lower-privileged roles.

Find out what's already
exploitable in your codebase.