CVE-2026-85659
The PilotPress plugin for WordPress is vulnerable to Privilege Escalation via Account Takeover in…
- Risk score
- 59/100
- CVSS
- 8.8 v3.1
- Exploit chance (30 days)
- 0.4%
- Published
- 16 Oct 2026
Open in the live forecast Today's forecast
What to know
- What it is
- The PilotPress plugin for WordPress is vulnerable to Privilege Escalation via Account Takeover in all versions up to, and including, 2.0.43. The vulnerability exists because the update_cc_details() AJAX handler forwards an attacker-supplied username parameter to ONTRAPORT via api_call('update_cc_details', ...) before …
- Affected
- See advisory
- Fix
- Apply the vendor's security update; see the linked advisory.
- Exploitation
- No known exploitation
Why it is Yellow
- CVSS 8.8 high
References
- https://plugins.trac.wordpress.org/browser/pilotpress/tags/2.0.39/pilotpress.php?rev=3642310#L1029
- https://plugins.trac.wordpress.org/browser/pilotpress/tags/2.0.39/pilotpress.php?rev=3642310#L1099
- https://plugins.trac.wordpress.org/browser/pilotpress/tags/2.0.39/pilotpress.php?rev=3642310#L1690
- https://plugins.trac.wordpress.org/browser/pilotpress/tags/2.0.39/pilotpress.php?rev=3642310#L2380
- https://plugins.trac.wordpress.org/changeset/3737004
- https://www.wordfence.com/threat-intel/vulnerabilities/id/ceee48dd-72a7-49c3-90d5-7af1a30f9ecb?source=cve
Original description
The PilotPress plugin for WordPress is vulnerable to Privilege Escalation via Account Takeover in all versions up to, and including, 2.0.43. The vulnerability exists because the `update_cc_details()` AJAX handler forwards an attacker-supplied `username` parameter to ONTRAPORT via `api_call('update_cc_details', ...)` before performing the local `username_exists()` collision check, and aborts without rolling back the remote rename when a collision is detected — leaving the remote ONTRAPORT contact renamed to an existing WordPress Administrator's login. On a subsequent login attempt, `user_login()` (hooked to `wp_authenticate`) authenticates against ONTRAPORT using the renamed login and the attacker's own password, resolves the local WordPress user row via `get_user_by('login', $username)` — which now selects the real Administrator's row — and calls `wp_set_password()` against that Administrator's user ID; because the `user_level != 10` guard only suppresses PilotPress's own cookie issuance rather than returning a `WP_Error` to core, WordPress proceeds to validate the newly-synchronized password and issues a full Administrator authentication cookie to the attacker. This makes it possible for authenticated attackers with Subscriber-level access and above — specifically any PilotPress member holding a valid ONTRAPORT contact and the Customer Center nonce — to fully take over an Administrator account.
Last activity 16 Oct 2026. Patch Forecast updates every hour.