
PoC Python pour CVE-2026-93453, une faille d'empoisonnement du lien de réinitialisation de mot de passe SOGo via un en-tête Origin contrôlé par l'attaquant, permettant l'interception du jeton de réinitialisation et la prise de contrôle de compte.
Un exploit pour une faille où SOGo assemble le lien de réinitialisation de mot de passe qu'il envoie par courriel aux utilisateurs directement à partir de l'en-tête Origin fourni par le client. Un attaquant anonyme qui connaît l'identifiant de connexion d'une victime envoie une requête de récupération avec un Origin contrôlé ; le lien contenu dans le message « Password reset » envoyé par courriel pointe alors vers l'hôte de l'attaquant tandis que le JWT intégré reste un jeton de récupération parfaitement valide. Un clic de la victime plus tard, le jeton se retrouve dans le journal d'accès de l'attaquant, et POST /SOGo/changePassword l'échange contre un nouveau mot de passe — prise de contrôle complète du compte de messagerie, des calendriers et des contacts, sans authentification à aucune étape. La branche courriel ignore en outre la vérification SOGoPasswordRecoveryEnabled (ce drapeau n'est consulté que dans la branche SecretQuestion), de sorte que le vecteur courriel fonctionne même lorsque l'opérateur pense que la récupération est désactivée.
Enregistrement : https://www.cve.org/CVERecord?id=CVE-2026-93453
| Affecté | SOGo < 5.12.11 (≤ 5.12.10) |
| Corrigé | 5.12.11 (liste d'autorisation SOGoPasswordRecoveryBaseURLs) |
| Prérequis | victime avec le mode de récupération SecondaryEmail ; l'attaquant connaît le userName ; la victime clique sur le lien envoyé par courriel |
| Impact | prise de contrôle de compte |
// 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
L'URL de réinitialisation tokenisée est Origin + request URI + JWT, donc celui qui définit l'en-tête définit l'hôte vers lequel se dirige le secret de la victime. Il s'agit d'un empoisonnement de réinitialisation de mot de passe (CWE-640 / CWE-601), et non d'une redirection ouverte : le JWT est accepté par /SOGo/changePassword quel que soit l'hôte qui l'a transporté jusque-là.
// 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
Sur la 5.12.11, un Origin étranger reçoit un 403 (« Password recovery email in error ») ; sur la ≤ 5.12.10, la même requête renvoie 200 et le courriel est envoyé — c'est cette différence sur laquelle check se base.
# 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
Bibliothèque standard uniquement (Python 3.8+). Prend en charge --proxy, --insecure, --timeout, --no-color et --prefix pour les points de montage SOGo non standard.
Le PoC ne nécessite aucune infrastructure d'attaquant : poison fait seulement en sorte que le serveur envoie le lien par courriel, et l'hôte empoisonné est celui que vous mettez dans --origin. Sur une instance vulnérable, le lien envoyé par courriel devient https://attacker.example/SOGo/passwordRecoveryEmail?token=<valid HS256 JWT> — le jeton se dirige vers votre hôte dès que la victime clique.
check utilise un nom d'utilisateur canari inexistant afin qu'aucun courriel ne soit jamais délivré à une véritable boîte aux lettres ; 200 = la branche courriel a accepté l'Origin étranger (signature vulnérable), 403 = liste d'autorisation 5.12.11 ou SOGoPasswordRecoveryBaseURLs non défini (non exploitable). Pour un auto-test définitif, faites un poison sur un compte que vous possédez et lisez l'hôte du lien dans votre propre boîte de réception.
passwordRecoveryEmailAction)Pour les tests et la recherche autorisés uniquement. À utiliser uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation explicite de test.