SMTP-Injection vermeiden: Eine Whitebox-Einführung
Sam Sanoop
15. September 2022
0 Min. LesezeitSMTP-Injection-Schwachstellen werden von Entwicklern und Sicherheitsexperten häufig missverstanden und von statischen Analyseprodukten übersehen. In diesem Blog erfahren Sie, wie häufige SMTP-Injection-Schwachstellen in Bibliotheken und Anwendungen auftreten können. Außerdem erhalten Sie Tipps, wie Sie sie schnell finden und beheben.
Einführung in SMTP
Das Simple Mail Transfer Protocol (SMTP) ist ein E-Mail-Protokoll zum Senden und Empfangen von E-Mail-Nachrichten. E-Mail-Clients für Endbenutzer verwenden SMTP in der Regel, um Nachrichten zur Weiterleitung an einen Mailserver zu senden. SMTP-Server nutzen üblicherweise das Transmission Control Protocol über Port 25 (für Klartext) und Port 587 (für verschlüsselte Kommunikation).
Moderne Software und Anwendungen nutzen das SMTP-Protokoll häufig als Teil eines Nutzerablaufs und versenden E-Mails als Reaktion auf eine Nutzeraktion. Ein Beispiel sind Registrierungsbestätigungen: Dabei wird eine Nutzer-E-Mail-Adresse mit einem vordefinierten Begrüßungstext kombiniert und die E-Mail zur Zustellung an das E-Mail-Konto des Nutzers an einen SMTP-Server weitergeleitet.
Während einer SMTP-Sitzung zwischen einem SMTP-Client und einem Server kann ein Client mehrere SMTP-Befehle verwenden. Einige gängige Beispiele sind:
HELO/EHLO– Mit dem BefehlHELOwird die SMTP-Sitzung gestartet, z. B.HELO snyk.io.MAIL FROM– Mit dem BefehlMAIL FROMwird eine Mailübertragung mit einer Absender-E-Mail-Adresse gestartet, z. B.MAIL FROM "[foo@snyk.io](mailto:foo@snyk.io)".RCPT TO– Mit dem BefehlRCPT TOwird der Empfänger der E-Mail angegeben, z. B.RCPT TO "[foobar@snyk.io](mailto:foobar@snyk.io)".DATA– Mit dem BefehlDATAbittet der Client den Server um die Erlaubnis, die Maildaten zu übertragen. Der Antwortcode 354 erteilt diese Erlaubnis, und der Client beginnt, den Inhalt der E-Mail Zeile für Zeile zu übermitteln. DieDATA-Übertragung kann mit einem.-Zeichen beendet werden.
Nachfolgend sehen Sie ein Beispiel für eine SMTP-Kommunikation zwischen einem Client und einem Server.
Was ist SMTP-Injection?
SMTP-Injection kann auftreten, wenn ein Angreifer beliebige SMTP-Befehle in eine SMTP-Kommunikation zwischen einem Client und einem Server einschleusen kann. Dies kann geschehen, indem zusätzliche CRLF-Zeichen in nutzergesteuerte Parameter eingefügt werden, die ohne Validierung oder ausreichende Bereinigung in einen SMTP-Befehl übernommen werden.
Solche Fälle treten häufig in Webanwendungen auf, die Bibliotheken zum Senden von SMTP-Befehlen verwenden oder über interne Implementierungen verfügen, die nutzergesteuerte Parameter nicht validieren.
Die Auswirkungen einer SMTP-Injection können je nach Kontext der betroffenen Anwendung unterschiedlich ausfallen. Zu den häufigen Folgen gehören:
Kopien von E-Mails an Dritte senden.
Den Inhalt der an den SMTP-Server gesendeten Nachricht verändern.
Die von SMTP-Injection betroffene Anwendung als Proxy für Phishing-Angriffe nutzen.
Um SMTP-Injection besser zu verstehen, sehen wir uns die folgenden Beispiele an.
Szenario 1: SMTP-Injection
Entwickler verwenden häufig Bibliotheken von Drittanbietern, um E-Mails an einen SMTP-Server zu senden. Diese bieten eine Alternative zu den SMTP-Funktionen der Standardbibliothek. Ein Beispiel für eine solche Bibliothek ist smtp-client. smtp-client bietet verschiedene Felder zum Festlegen von Hostname, Authentifizierung, Empfänger und Absender, die anschließend als Teil einer SMTP-Nachricht gesendet werden können.
Betrachten wir jedoch ein Szenario, in dem sich das Feld s.rcpt nicht festlegen lässt und nur s.mail vom Nutzer gesteuert wird. In solchen Fällen können CRLF-Zeichen verwendet werden, um einen neuen Befehl einzufügen, beispielsweise from@sender.com>\r\nRCPT TO:<[attacker@snyk.io](mailto:attacker@snyk.io).
Beispiel:
Da keine Validierung stattgefunden hat, verarbeitet der SMTP-Client die CRLF-Zeichen und behandelt RCPT TO:<[attacker@snyk.io](mailto:attacker@snyk.io) als neuen SMTP-Befehl. Das folgende Bild zeigt, wie ein SMTP-Server diesen Befehl akzeptiert.

Neben smtp-client fand Snyk auch Schwachstellen in den Perl-Paketen Email MIME und Net::SMTP, die ebenfalls über mehrere Felder für SMTP-Injection anfällig sind. Dieses Sicherheitsproblem wurde den zuständigen Bibliotheksbetreuern gemeldet. In den neuesten Versionen dieser Pakete wurden Fehlerbehebungen implementiert.
Szenario 2: SMTP-Injection
In zahlreichen Sprachökosystemen gibt es auch Low-Level-Bibliotheken, mit denen Entwickler mit einem SMTP-Server kommunizieren können. Ein Beispiel dafür ist smtp-channel.
Bei smtp-channel können Entwickler Nutzer-E-Mails mit nutzerseitig bereitgestellten Eingaben erstellen und die Daten als Stream an smtp-channel übergeben. In solchen Fällen kann ein Angreifer zusätzliche Header hinzufügen und die bestehende SMTP-Sitzung nutzen, um eine E-Mail zu fälschen. Der folgende Code veranschaulicht dieses Problem:
Szenario 3: SMTP-Injection
Auch Mail-Builder-Bibliotheken, die zusammen mit SMTP-Clients verwendet werden, können von SMTP-Injection betroffen sein. Ein Beispiel dafür findet sich im email Python package. Das email-Paket ist eine Bibliothek zur Verwaltung von E-Mail-Nachrichten. In diesem Fall ist SMTP-Injection möglich, wenn CRLF-Zeichen in das Feld mail.headerregistry.Address eingegeben werden.
Das folgende Bild zeigt, wie der vorhandene RCPT-Befehl mit dem Zeichen > geschlossen und mit \r\n ein neuer Header cC eingeschleust wird. Dieser wird, wie unten zu sehen, als neuer RCPT-Befehl gesendet.

Diese Schwachstelle wurde vom Python-Sicherheitsteam in den Versionen 3.X behoben – klicken Sie hier, um die vollständigen Release Notes einzusehen. Die Versionen 2.X sind jedoch weiterhin anfällig.
Szenario 4: SMTP-Injection
Bei der Suche nach SMTP-Injection-Schwachstellen sollten Sie beachten, dass auch andere Felder wie Hostname und Quelladresse CRLF-Zeichen zulassen und dadurch SMTP-Injection ermöglichen können.
Im folgenden Beispiel werden die an aiosmtplib übergebenen Felder From und To bereinigt. Es ist jedoch weiterhin möglich, den Wert in source_address zu manipulieren und einen beliebigen SMTP-Befehl einzufügen. Den Proof of Concept (PoC), der dies veranschaulicht, sehen Sie unten:
Dadurch entsteht die folgende SMTP-Kommunikation.

Weitere Fälle, die Sie berücksichtigen sollten
In bestimmten Situationen können Mail-Bibliotheken auch Möglichkeiten zur Codeausführung eröffnen. Ein Beispiel dafür ist die Funktion mail().Wenn Nutzereingaben in den fünften Parameter der Funktion mail() gelangen, kann ein Angreifer dies zur Codeausführung ausnutzen – klicken Sie hier, um ein Beispiel für dieses Problem anzusehen.
SMTP-Injection-Schwachstellen werden häufig mit Mail-Injection-Schwachstellen verwechselt. Bei einer Mail-Injection-Schwachstelle kann ein Angreifer eine E-Mail-Funktion missbrauchen, um mithilfe einer SMTP-Funktion beliebige E-Mails zu versenden und Phishing-Angriffe durchzuführen. Bei einer SMTP-Injection hingegen werden CRLF-Zeichen verwendet, um beliebige Header einzuschleusen, mit denen sich anschließend E-Mails fälschen und Phishing-Angriffe durchführen lassen.
SMTP-Injection verhindern
SMTP-Injection wird von Entwicklern und Open-Source-Bibliotheksbetreuern häufig übersehen. In den meisten Fällen sollten die Bibliotheksbetreuer diese Probleme beheben. Viele bekannte Bibliotheken – darunter JavaMail, PHPMailer und RubyMail – verhindern SMTP-Injection bereits, indem sie CRLF-Zeichen bereinigen. Bei Low-Level-Bibliotheken wie smtp-channel ist der Entwickler, der die Bibliothek nutzt, für die Validierung und Bereinigung der Nutzereingaben verantwortlich.
Um die Open-Source-Community sicherer zu machen, hat das Snyk-Sicherheitsteam auch SMTP-Injection-Schwachstellen in den folgenden Bibliotheken offengelegt.
Bibliothek | Sprache | Behobene Version |
|---|---|---|
| C | In Master behoben |
| Perl | Keine Fehlerbehebung verfügbar |
| Perl | Keine Fehlerbehebung verfügbar |
| Python | In 1.1.7 behoben |
| NodeJS | Keine Fehlerbehebung verfügbar |
Starten Sie mit Capture-the-Flag
Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Challenges lösen.
