
CVE-2026-40776 — Control de Acceso Roto + IDOR en WordPress Eventin (wp-event-solution) <= 4.1.8
Divulgación de información personal identificable (PII) y falsificación de pedidos sin autenticación en el plugin de WordPress Eventin (más de 10 000 instalaciones activas). Un endpoint REST público entrega un nonce wp_rest a cualquier visitante, y tres callbacks de permisos posteriores aceptan ese nonce como sustituto de la autenticación, colapsando la autorización en todos los endpoints de pedidos de clientes.
Informe técnico completo: https://lorenzofradeani.com/en/blog/cve-2026-40776 Aviso de Patchstack: https://patchstack.com/database/wordpress/plugin/wp-event-solution/vulnerability/wordpress-eventin-plugin-4-1-8-broken-access-control-vulnerability
Tres problemas se combinan para lograr una omisión completa de la autorización:
core/Admin/hooks.php (líneas 68–77) registra /wp-json/eventin/v1/nonce con permission_callback => '__return_true' y devuelve un nonce wp_rest recién generado a cualquier llamador no autenticado.core/Order/ aceptan ese nonce como única comprobación de autorización:
OrderController::get_item_permissions_check (líneas 146–148) — current_user_can(...) || wp_verify_nonce(...) ; el || hace que el nonce por sí solo sea suficiente.OrderController::create_item_permissions_check (líneas 476–478) — solo wp_verify_nonce(...).PaymentController::create_payment_permission_check (líneas 66–70) — solo .De extremo a extremo, cuatro peticiones no autenticadas bastan para volcar todos los pedidos de clientes (nombres completos, correos electrónicos, números de teléfono, métodos de pago, lista de asistentes) y para forjar pedidos nuevos. Consulta ADVISORY.md para el desglose técnico completo y poc/poc-eventin.sh para un PoC reproducible.
Actualiza wp-event-solution a 4.1.9 o posterior. No hay ninguna solución alternativa dentro de la versión para versiones anteriores, salvo desactivar el plugin o bloquear las rutas REST afectadas (/wp-json/eventin/v1/nonce, /wp-json/eventin/v2/orders*, /wp-json/eventin/v2/payments, /wp-json/eventin/v2/orders/book-seats) en la capa del servidor web / WAF.
.
├── README.md this file
├── ADVISORY.md full technical advisory + code review
├── LICENSE MIT
├── poc/
│ └── poc-eventin.sh 4-step bash PoC against a local lab
└── screenshots/
├── poc1-idor-pii-leak.png IDOR read of order #21 with full PII
├── poc2-no-nonce-blocked.png same request without nonce → 401
└── poc3-fake-order-created.png unauthenticated POST creating a fake order
Este material se publica con fines defensivos y educativos: para ayudar a los operadores de sitios WordPress a identificar la exposición, para ayudar a los autores de plugins a evitar el mismo error (tratar un nonce CSRF como autenticación) y para documentar un ejemplo real de cómo el cortocircuito || en un callback de permisos colapsa la autorización. No ejecutes el PoC contra sistemas que no sean tuyos o para los que no tengas autorización escrita explícita para probar.
| Campo | Valor |
|---|
| CVE | CVE-2026-40776 |
| PSID de Patchstack | 85de025d71e7 |
| CWE | CWE-862 — Falta de autorización |
| CVSS v3.1 | 7.5 (ALTO) |
| Plugin | Eventin — Calendario de eventos, reserva de eventos, entradas y registro (wp-event-solution) |
| Versiones afectadas | <= 4.1.8 |
| Corregido en | 4.1.9 |
| Instalaciones activas | 10,000+ |
| Autenticación requerida | Ninguna (no autenticado) |
| Interacción del usuario | Ninguna |
| Reportado por | Lorenzo Fradeani — investigación independiente de seguridad |
| Coordinado por | Patchstack |
| Divulgación pública | 2026-04-29 |
wp_verify_nonce(...)OrderController::get_item (líneas 310–317) carga cualquier pedido por ID secuencial de entrada de WordPress sin verificar la propiedad, y /book-seats (líneas 129–137) usa permission_callback => function() { return true; } (sin autenticación alguna).| Fecha | Evento |
|---|
| 2026-03-10 | Reportado a Patchstack |
| 2026-04-07 | El proveedor publica Eventin 4.1.9 (corrección) |
| 2026-04-13 | Hito de coordinación (Patchstack) |
| 2026-04-29 | Divulgación pública (aviso de Patchstack) |
| 2026-05-01 | Los rastreadores de terceros lo incorporan (WP-Firewall, Managed-WP, SolidWP) |
| 2026-05-04 | Este repositorio se publica |