
PoC en Python para CVE-2026-93453, una vulnerabilidad de envenenamiento del enlace de restablecimiento de contraseña en SOGo mediante una cabecera Origin controlada por el atacante que permite la interceptación del token de restablecimiento y la toma de control de la cuenta.
Un exploit para una vulnerabilidad en la que SOGo construye el enlace de restablecimiento de contraseña que envía por correo a los usuarios directamente a partir de la cabecera Origin proporcionada por el cliente. Un atacante anónimo que conoce el login de una víctima envía una solicitud de recuperación con un Origin controlado; el enlace dentro del mensaje "Password reset" enviado por correo apunta entonces al host del atacante, mientras que el JWT incrustado sigue siendo un token de recuperación perfectamente válido. Un clic de la víctima después, el token está en el registro de acceso del atacante, y POST /SOGo/changePassword lo canjea por una nueva contraseña — toma de control total de la cuenta de correo, calendarios y contactos, sin autenticación en ningún paso. La rama de correo además omite la comprobación de SOGoPasswordRecoveryEnabled (ese flag solo se consulta en la rama de SecretQuestion), por lo que el vector de correo funciona incluso cuando el operador cree que la recuperación está desactivada.
Registro: https://www.cve.org/CVERecord?id=CVE-2026-93453
| Afectado | SOGo < 5.12.11 (≤ 5.12.10) |
| Corregido | 5.12.11 (lista de permitidos SOGoPasswordRecoveryBaseURLs) |
| Requisitos previos | víctima con modo de recuperación SecondaryEmail; el atacante conoce el userName; la víctima hace clic en el enlace enviado por correo |
| Impacto | toma de control de la cuenta |
// UI/MainUI/SOGoRootPage.m:1374 (tag SOGo-5.12.10) — passwordRecoveryEmailAction
url = [NSString stringWithFormat:@"%@%@?token=%@",
[[request headers] objectForKey:@"origin"], // <-- raw client header
[request uri],
jwtToken]; // <-- valid HS256 JWT, 10 min TTL
La URL de restablecimiento con token es Origin + request URI + JWT, por lo que quien establece la cabecera establece el host al que viaja el secreto de la víctima. Esto es envenenamiento de restablecimiento de contraseña (CWE-640 / CWE-601), no una redirección abierta: el JWT es aceptado por /SOGo/changePassword sin importar qué host lo haya transportado hasta allí.
// 5.12.11 — the fix: origins are validated against a mandatory allowlist
baseUrls = [[SOGoSystemDefaults sharedSystemDefaults] passwordRecoveryBaseURLs];
serverUrl = [[request headers] objectForKey:@"origin"];
if (!(baseUrls && [baseUrls count] > 0)) // unset config -> 403
if (![baseUrls containsObject:serverUrl]) // foreign origin -> 403
En 5.12.11 un Origin ajeno recibe un 403 ("Password recovery email in error"); en ≤ 5.12.10 la misma solicitud devuelve 200 y el correo se envía — esa diferencia es en lo que se basa check.
# non-destructive probe: canary user + foreign Origin, classify the reply
python3 CVE-2026-93453.py check https://sogo.example
# poison: dispatch the reset mail for the victim with your host in the link
python3 CVE-2026-93453.py poison https://sogo.example --user victim --origin https://attacker.example
Solo biblioteca estándar (Python 3.8+). Admite --proxy, --insecure, --timeout, --no-color y --prefix para puntos de montaje de SOGo no estándar.
El PoC no necesita infraestructura del atacante: poison solo hace que el servidor envíe el enlace por correo, y el host envenenado es el que pongas en --origin. En una instancia vulnerable el enlace enviado por correo se convierte en https://attacker.example/SOGo/passwordRecoveryEmail?token=<valid HS256 JWT> — el token viaja a tu host en el momento en que la víctima hace clic.
check usa un nombre de usuario canario inexistente para que nunca se entregue un correo a un buzón real; 200 = la rama de correo aceptó el Origin ajeno (firma vulnerable), 403 = lista de permitidos de 5.12.11 o SOGoPasswordRecoveryBaseURLs sin establecer (no explotable). Para una autoprueba definitiva, envenena una cuenta que poseas y lee el host del enlace en tu propio buzón.
passwordRecoveryEmailAction)Solo para pruebas e investigación autorizadas. Úsalo únicamente contra sistemas que poseas o para los que tengas permiso explícito de probar.