Kurz vor Jahresende 2023 hat SEC Consult einen E-Mail-Spoofing-Angriff veröffentlicht, der die Kombination von E-Mail-Diensten ausnutzt, die Zeilenenden anders als mit <CR><LF> behandeln. Der Angriff nutzt die Verwirrung beim ENDE-DER-DATEN in einem empfangenden Maildienst aus, indem ein sendender Maildienst dazu gebracht wird, <LF>.<LF> oder <LF>.<CR><LF> mitten in einer E-Mail-Nachricht zu senden, gefolgt von den SMTP-Befehlen des Angreifers, die eine gefälschte E-Mail-Nachricht einschleusen (die standardmäßige ENDE-DER-DATEN-Sequenz ist <CR><LF>.<CR><LF>).
Die Schwachstelle wurde vor vielen Jahrzehnten in Sendmail eingeführt, indem das nicht standardmäßige Zeilenende <LF> zusätzlich zum Standard <CR><LF> erlaubt wurde. Für die Kompatibilität mit Programmen, die ein Verhalten wie bei Sendmail erwarten, wurde das nicht standardmäßige Zeilenende <LF> auch von anderen SMTP-Servern, einschließlich Postfix und Exim, zugelassen. Das hatte zur Folge, dass ein Zero-Day-Angriff für Postfix, Sendmail und Exim möglich war.
Für Administratoren hat dies nun die Folge, dass der Versand einer nicht standardkonformen E-Mail mit einem gepatchten SMTP-Server zu der Fehlermeldung „Error: bare <LF> received“ führen kann. Gerade wenn man ältere SMTP-Mailer-Klassen einsetzt kann dies zu einigen Überraschungen beim Versand von E-Mail führen.
Um diesen Fehler in Ihrer SMTP-Klasse zu beheben, müssen Sie sicherstellen, dass alle Zeilenenden korrekt mit \r\n formatiert sind. Hier sind einige Schritte, die Sie unternehmen können:
1. Überprüfen und Anpassen des Quellcodes
Durchsuchen Sie Ihren Code nach Stellen, an denen Sie Daten an den SMTP-Server senden. Achten Sie besonders auf die Verwendung von \n
und ersetzen Sie diese gegebenenfalls durch \r\n
. Dies könnte in Bereichen sein, in denen Sie E-Mail-Header oder den E-Mail-Body setzen.
Beispiel:
Wenn Sie Zeilenenden in Ihrem Code direkt setzen, ändern Sie von:
$headers .= "Content-Type: text/plain; charset=UTF-8\n";
zu:
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
2. Verwendung von Funktionen oder Klassen, die das Handling für Sie übernehmen
Wenn Sie eine Bibliothek oder eine Klasse für SMTP-Kommunikation verwenden (wie PHPMailer oder SwiftMailer), stellen diese oft sicher, dass die Daten korrekt formatiert sind. Stellen Sie sicher, dass Sie die aktuelle Version solcher Bibliotheken verwenden und die Dokumentation bezüglich korrekter Zeilenenden beachten.
3. Automatisierte Ersetzung
Für dynamisch generierte Inhalte oder Inhalte, die aus externen Quellen stammen, können Sie eine Ersetzung durchführen, bevor Sie die Daten senden:
$content = str_replace("\n", "\r\n", str_replace("\r", "", $content));
Diese Zeile ersetzt zuerst alle \r
durch nichts (um doppelte \r
zu vermeiden, falls einige Zeilenenden bereits als \r\n
formatiert sind) und ersetzt dann alle \n
durch \r\n
.