Pre-secuestro de cuentas en la API de Prowler mediante la vinculación de cuentas sociales basada en correo electrónico sin verificación
Descripción
Autenticación incorrecta (CWE-287) en ProwlerSocialAccountAdapter.pre_social_login() (api/src/backend/api/adapters.py), la función que vincula un inicio de sesión de Google o GitHub con una cuenta de Prowler existente, en Prowler desde 5.4.0 y anterior a 5.35.0. Un atacante no autenticado puede tomar el control de la cuenta de un usuario que todavía no se ha registrado. La función vincula el inicio de sesión de Google o GitHub con cualquier cuenta existente que tenga la misma dirección de correo que la que devuelve el proveedor. No exige que esa dirección esté verificada, ni por el proveedor ni en la cuenta existente, y tampoco comprueba de ninguna otra forma que las dos cuentas sean de la misma persona.
El registro está abierto a cualquiera y no se requiere confirmación del correo. UserViewSet.get_permissions() (api/src/backend/api/v1/views.py) da AllowAny a la acción create, ACCOUNT_EMAIL_VERIFICATION está en none en api/src/backend/config/settings/social_login.py, y el ModelBackend de Django sólo comprueba la contraseña y is_active. Una cuenta registrada con la dirección de otra persona queda por tanto activa de inmediato y admite la contraseña que haya puesto quien la registró.
El atacante registra la dirección de correo de la víctima con una contraseña suya. La víctima inicia sesión más tarde con Google o GitHub. La función vincula ese inicio de sesión a la cuenta del atacante, y la víctima queda situada dentro de ella. sociallogin.connect() no restablece la contraseña ni desactiva la cuenta, de modo que el atacante conserva el acceso después. ACCOUNT_EMAIL_NOTIFICATIONS no está puesto en las versiones afectadas y django-allauth 65 lo toma como falso, por lo que el usuario no recibe ningún aviso de que se ha conectado un inicio de sesión social a su cuenta.
django-allauth realiza también el mismo enlace por su cuenta, sin pasar por esta función, porque SOCIALACCOUNT_EMAIL_AUTHENTICATION y SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT están ambos en True en el mismo fichero de configuración.
El atacante obtiene la cuenta de Prowler de la víctima: las credenciales de proveedor de nube conectadas a ella, los hallazgos de los escaneos y las pertenencias a inquilinos.
Tipo de vulnerabilidad (CWE)
- CWE-287: Autenticación incorrecta
Versiones afectadas
Prowler desde 5.4.0 y anterior a 5.35.0. El código y los ajustes implicados aparecen por primera vez en 5.4.0, y la API de Prowler no existe en versiones anteriores. Están afectadas todas las versiones desde 5.4.0 hasta 5.34.0, y no existe ninguna versión de parche intermedia. Estado por defecto: no afectado.
Sólo están afectadas las instalaciones que tengan activado el inicio de sesión con Google o GitHub.
Puntuación (CVSS 4.0)
Alta (7.6)
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
Los privilegios requeridos son Ninguno porque el registro está abierto a cualquiera que pueda alcanzar la API. Los requisitos de ataque son Presentes porque el ataque depende de dos condiciones que el atacante no controla: el servidor debe tener activado el inicio de sesión con Google o GitHub, y la víctima no debe haberse registrado todavía. La interacción del usuario es Pasiva porque la víctima sólo inicia sesión de la forma habitual, y el ataque no le exige ninguna acción fuera de lo normal. La confidencialidad y la integridad del sistema vulnerable son Altas porque el atacante tiene el control completo de la cuenta. La disponibilidad es Ninguna porque la víctima no pierde el acceso a la cuenta.
Las métricas del sistema subsiguiente son Ninguna: las credenciales de nube contenidas en la cuenta se cuentan como impacto sobre Prowler.
La primera mitad, registrar la dirección de otra persona, se probó en vivo contra la imagen prowlercloud/prowler-api:stable: POST /api/v1/users devuelve 201 para una dirección que quien la registra no posee, y POST /api/v1/tokens emite después un token para ella. La segunda mitad, el enlace en sí, requiere que el servidor tenga configurado el inicio de sesión con Google o GitHub, por lo que se verificó leyendo el código y no ejecutándolo.
Solución
Actualizar a Prowler 5.35.0 o posterior.
Ningún ajuste ni variable de entorno de las versiones afectadas desactiva el registro ni exige confirmación del correo, por lo que no puede corregirse únicamente mediante configuración.
Parche
Commit 0f31f1a3c (pull request #12013), publicado en 5.35.0. Antes de vincular, la dirección debe estar marcada como verificada en dos sitios: en la cuenta existente, en la tabla EmailAddress de django-allauth, y en la lista de direcciones que el propio proveedor informa como verificadas. Si falta cualquiera de las dos, devuelve 403. También pone SOCIALACCOUNT_EMAIL_AUTHENTICATION y SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT a False, de modo que django-allauth ya no realiza el enlace por su cuenta. Retorna de inmediato si la cuenta del proveedor ya está vinculada, y lee la dirección desde sociallogin.user.email antes de recurrir a extra_data, porque GitHub envía a veces la dirección principal fuera de los datos del perfil.
Créditos
- Nacho García Egea - descubridor
- Darío Rivas - analista
- Xoán M. Otero Jorge - analista
- Secur0 CNA - coordinador
- Prowler Cloud Security Team - desarrollador de la corrección Origen del descubrimiento: Externo
Registro oficial: CVE-2026-100169
Registros relacionados
- CVE-2026-59151 - el lado SAML de la misma función, corregido en 5.30.3