Missing Authorization en Prospero Flow CRM permite a cualquier usuario autenticado escalar privilegios mediante el endpoint de guardado de permisos
Descripción
Missing Authorization (CWE-639) en PermissionSaveController (app/Http/Controllers/Permission/PermissionSaveController.php), expuesto en POST /permission, en Prospero Flow CRM 5.2.0, que permite a cualquier usuario autenticado, con independencia de su rol, reasignar el conjunto completo de permisos de cualquier rol del sistema, incluido el suyo propio, mediante una petición que envía el array roles[<role_id>][] con los permisos deseados, debido a que ni la ruta ni el controlador aplicaban comprobación de autorización alguna: la ruta se declara en routes/web.php sin ->can() ni middleware('permission:...'), el método save() recibía un Illuminate\Http\Request genérico sin authorize() y ejecutaba Role::findById($role_id)->syncPermissions($permissions) directamente sobre la entrada de la petición, a diferencia del resto de rutas del proyecto, que sí declaran su permiso requerido (por ejemplo ->can('create lead') en routes/module/lead.php o middleware('permission:read company|update company') en la ruta /setting). Esto resulta en una escalada de privilegios vertical completa: la prueba de concepto aportada, ejecutada desde una cuenta con rol Seller, asigna a ese rol los 38 permisos definidos en la aplicación, incluidos create user, delete user, delete company, bank card view number y bank card view cvv, y verifica el cambio comparando el código de respuesta de /user/create, /supplier y /lead/delete/{id} antes y después de la petición.
Tipo de vulnerabilidad (CWE)
CWE-639 Authorization bypass through User-Controlled key
Versiones afectadas
Prospero Flow CRM anteriores a 5.2.1 (corregido en 5.2.1 por el commit 86a7d655, de fecha 2026-06-20). El endpoint se introdujo junto con el panel de permisos en el commit ac1919b7 (2023-03-24), en la versión 2.2.11, y estuvo presente sin autorización en las etiquetas v1.0.0, v2.0.1 y v4.6.0, por lo que sí hubo releases etiquetadas distribuidas en estado vulnerable. La versión 5.2.1 no tiene etiqueta git: la primera etiqueta que incorpora la corrección es v5.5.3. Las versiones se leen de la constante APP_VERSION en version.php. Estado por defecto: no afectado.
Puntuación (CVSS 4.0)
Alta (High)
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Solución
Actualizar a la versión 5.2.1 o superior. La corrección no se etiquetó: la primera release etiquetada que la incorpora es v5.5.3.
Parche
Commit 86a7d655
Créditos
- k1di3 - finder (descubridor)
- Cristian Fernández Cornejo - analyst (analista)
- Xoán M. Otero Jorge - analyst (analista)
- Secur0 CNA - coordinator (coordinador)
- Gustavo Novaro - remediation developer (desarrollador de la corrección) Origen del descubrimiento: Externo Registro oficial: CVE-2026-59233