Eventin (wp-event-solution) Broken Access Control / IDOR (CVE-2026-40776)
by Lorenzo Fradeani · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-40776 / Patchstack PSID 85de025d71e7
- Category
- web
- Affected product
- Eventin — Events Calendar, Event Booking, Ticket & Registration (wp-event-solution WordPress plugin)
- Affected versions
- <= 4.1.8 (fixed in 4.1.9)
- Disclosed
- 2026-07-05
- Patch status
- patched
Tags
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-04 |
| Author / Researcher | Lorenzo Fradeani |
| CVE / Advisory | CVE-2026-40776 / Patchstack PSID 85de025d71e7 |
| Category | web |
| Severity | High |
| CVSS Score | 7.5 (CVSS v3.1) |
| Status | PoC |
| Tags | wordpress, wordpress-plugin, broken-access-control, idor, nonce-misuse, cwe-862, pii-disclosure, unauthenticated |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Eventin — Events Calendar, Event Booking, Ticket & Registration (wp-event-solution WordPress plugin) |
| Versions Affected | <= 4.1.8 (fixed in 4.1.9) |
| Language / Platform | PHP / WordPress REST API; PoC is a bash script |
| Authentication Required | No (unauthenticated) |
| Network Access Required | Yes |
Summary
The Eventin WordPress plugin (10,000+ active installs) exposes a public REST endpoint, /wp-json/eventin/v1/nonce, that hands a valid wp_rest nonce to any unauthenticated visitor. Three separate REST controllers then treat possession of that nonce as sufficient authorization — one via a short-circuiting current_user_can(...) || wp_verify_nonce(...) check, two via wp_verify_nonce(...) alone with no capability check at all. Combined with an IDOR on the order-read endpoint (no ownership verification against sequential post IDs) and a fully open seat-booking endpoint (permission_callback hardcoded to true), any unauthenticated attacker can chain four requests to dump every customer order’s PII (names, emails, phone numbers, payment methods, attendee rosters) and to forge new orders or exhaust event seats. The root cause is conflating a CSRF nonce (which is not user-identity-bound) with authentication.
Vulnerability Details
Root Cause
core/Admin/hooks.php registers /wp-json/eventin/v1/nonce with permission_callback => '__return_true', publicly issuing a wp_rest nonce; OrderController and PaymentController then accept that nonce (via wp_verify_nonce) as a substitute for a capability check in their *_permissions_check methods, and get_item loads orders by raw post ID with no ownership check.
Attack Vector
- Request
/wp-json/eventin/v1/nonce(unauthenticated) to obtain a validwp_restnonce. - Use the nonce as the
X-WP-Nonceheader to callOrderController::get_itemwith sequential order IDs, reading full customer PII without authentication (IDOR). - Use the same nonce to call the order-creation and payment endpoints, forging arbitrary orders/payments.
- Call the fully open
/book-seatsendpoint (no permission check at all) to reserve or exhaust event seats.
Impact
Unauthenticated disclosure of all customer order PII across an Eventin-powered site, plus the ability to forge orders/payments and exhaust seat-limited events — a complete authorization bypass on the plugin’s order/payment subsystem.
Environment / Lab Setup
Target: WordPress 6.7 + Eventin (wp-event-solution) <= 4.1.8, default configuration
Attacker: bash, curl (see poc/poc-eventin.sh)
Proof of Concept
PoC Script
See
poc/poc-eventin.shandADVISORY.mdin this folder.
| |
The script performs the four-step unauthenticated chain against a local lab: fetch a public wp_rest nonce, use it to read an existing order’s full PII via IDOR, demonstrate that the same request is rejected (401) without the nonce, and then use the nonce to create a forged order — matching the screenshots referenced in the upstream README (poc1-idor-pii-leak, poc2-no-nonce-blocked, poc3-fake-order-created).
Detection & Indicators of Compromise
Signs of compromise:
- Bulk sequential requests to
/wp-json/eventin/v2/orders/{id}from anonymous clients - Unexpected orders/payments created without a corresponding logged-in session
- Seat-booking endpoint hit at high volume from a single source
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update Eventin (wp-event-solution) to 4.1.9 or later |
| Interim mitigation | Block or restrict /wp-json/eventin/v1/nonce, /wp-json/eventin/v2/orders*, /wp-json/eventin/v2/payments, and /wp-json/eventin/v2/orders/book-seats at the WAF/web-server layer, or disable the plugin, until patched |
References
Notes
Mirrored from https://github.com/lorenzofradeani/CVE-2026-40776 on 2026-07-05.