
Python-PoC für CVE-2026-93453, eine SOGo-Schwachstelle beim Poisoning von Passwort-Reset-Links über einen angreiferkontrollierten Origin-Header, die das Abfangen von Reset-Tokens und die Übernahme von Konten ermöglicht.
Ein Exploit für eine Schwachstelle, bei der SOGo den Passwort-Reset-Link, den es per E-Mail an Benutzer sendet, direkt aus dem vom Client gelieferten Origin-Header zusammensetzt. Ein anonymer Angreifer, der den Login eines Opfers kennt, sendet eine Wiederherstellungsanfrage mit einem kontrollierten Origin; der Link in der per E-Mail versandten „Password reset"-Nachricht zeigt dann auf den Host des Angreifers, während das eingebettete JWT ein vollkommen gültiges Wiederherstellungs-Token bleibt. Einen Klick des Opfers später befindet sich das Token im Zugriffsprotokoll des Angreifers, und POST /SOGo/changePassword tauscht es gegen ein neues Passwort — vollständige Kontoübernahme von E-Mail, Kalendern und Kontakten, ohne Authentifizierung bei irgendeinem Schritt. Der E-Mail-Zweig überspringt zusätzlich die Prüfung von SOGoPasswordRecoveryEnabled (dieses Flag wird nur im SecretQuestion-Zweig konsultiert), sodass der E-Mail-Vektor auch dann funktioniert, wenn der Betreiber glaubt, die Wiederherstellung sei deaktiviert.
Record: https://www.cve.org/CVERecord?id=CVE-2026-93453
| Betroffen | SOGo < 5.12.11 (≤ 5.12.10) |
| Behoben | 5.12.11 (SOGoPasswordRecoveryBaseURLs-Allowlist) |
| Voraussetzungen | Opfer mit SecondaryEmail-Wiederherstellungsmodus; Angreifer kennt den userName; Opfer klickt auf den per E-Mail gesendeten Link |
| Auswirkung | Kontoübernahme |
// 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
Die tokenisierte Reset-URL ist Origin + request URI + JWT, wer also den
Header setzt, setzt den Host, an den das Geheimnis des Opfers wandert. Dies ist
Passwort-Reset-Poisoning (CWE-640 / CWE-601), kein offenes Redirect: Das JWT wird von
/SOGo/changePassword akzeptiert, egal welcher Host es dorthin gebracht hat.
// 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
Unter 5.12.11 erhält ein fremder Origin eine 403 („Password recovery email in
error"); unter ≤ 5.12.10 liefert dieselbe Anfrage 200 und die Mail wird versandt —
auf diesen Unterschied stützt sich 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
Nur Standardbibliothek (Python 3.8+). Unterstützt --proxy, --insecure,
--timeout, --no-color und --prefix für nicht standardmäßige SOGo-Mount-Punkte.
Das PoC benötigt keine Angreifer-Infrastruktur: poison bewirkt lediglich, dass der Server
den Link per E-Mail versendet, und der vergiftete Host ist der, den Sie in --origin angeben.
Auf einer verwundbaren Instanz wird der per E-Mail versandte Link zu
https://attacker.example/SOGo/passwordRecoveryEmail?token=<valid HS256 JWT>
— das Token wandert in dem Moment zu Ihrem Host, in dem das Opfer klickt.
check verwendet einen nicht existierenden Canary-Benutzernamen, sodass niemals eine E-Mail an ein
echtes Postfach zugestellt wird; 200 = der E-Mail-Zweig akzeptierte den fremden Origin (verwundbare
Signatur), 403 = 5.12.11-Allowlist oder nicht gesetzte SOGoPasswordRecoveryBaseURLs
(nicht ausnutzbar). Für einen definitiven Selbsttest poison Sie ein Konto, das Ihnen gehört,
und lesen Sie den Link-Host in Ihrem eigenen Posteingang.
passwordRecoveryEmailAction)Nur für autorisierte Tests und Forschung. Verwenden Sie es nur gegen Systeme, die Ihnen gehören oder für die Sie ausdrückliche Testgenehmigung haben.