
CakePHP 5.4.2 - Hoch - Remote - Header-Injection - SmtpTransport einzelnes LF Überbleibsel von GHSA-2qh5
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-smtp-crlf
Write-up: https://abraxaslabs.tech/research/cakephp-smtp-crlf
Klasse: Mail-Header-Injection Reichweite: Remote
CakePHP 5.4.2 (887b641) - Cake Software Foundation
GHSA-2qh5 / CVE-2026-77634 fügte str_replace("\r\n", '', $val) in SmtpTransport und MailTransport hinzu. Dieser Callback ist wirkungslos bei einem einzelnen LF oder CR. Header-Namen werden weiterhin ungefiltert konkateniert. PHP mail() und die SMTP-DATA, die wir erfasst haben, behandeln ein einzelnes LF als neue Header-Zeile.
Wenn eine App Benutzerdaten in einen benutzerdefinierten Header kopiert, kann ein Angreifer Bcc hinzufügen, den Subject umschreiben oder durch Senden von LF statt CRLF in den Body eindringen. Der angekündigte Fix verhindert das nicht. Das Standard-cakephp/app schreibt Request-Daten nicht von sich aus in benutzerdefinierte Header.
| ID | noch keine CVE |
| Klasse | Mail-Header-Injection (übrig gebliebenes einzelnes LF aus GHSA-2qh5) |
| Reichweite | Remote (wie GHSA-2qh5: App kopiert Benutzerdaten in Message::setHeaders) |
| CWE | CWE-93 |
| CVSS | Hoch: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Produkt | CakePHP |
| Betroffen | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | wie GHSA-2qh5: App kopiert Benutzerdaten in Message::setHeaders / addHeaders |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Erfordert eine Anwendung, die Request-Daten in benutzerdefinierte Mail-Header schreibt.
| Privileg | Methode / Sink | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|
Eine zusätzliche Bcc:-Zeile (oder Cc: / To:) in den SMTP-DATA-Header-Block einschleusen | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) dann SmtpTransport::send | Im Lab nachgewiesen. SMTP DATA und getHeadersString zeigen beide eine neue Bcc:-Zeile. Zeuge X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
Dieselbe Injection über MailTransport | Derselbe Callback in MailTransport::send | Im Lab nachgewiesen an getHeadersString mit der Include-Liste und dem Strip-Callback von MailTransport. Dieses Lab ruft PHP mail() nicht auf |
| Einzelnes CR ebenso wie einzelnes LF | ok\rBcc: ... | Im Lab nachgewiesen. Das Entfernen nur von Paaren lässt \r zurück; Header-Parser, die an CR/LF trennen, behandeln es als neue Zeile |
Subject umschreiben oder in den Body eindringen | Wert enthält \nSubject: oder \n\n | Abgeleitet aus derselben Konkatenation. Im Lab wurden Bcc / X-Oracle injiziert, nicht Subject |
| Zusätzlicher Envelope-Empfänger | Injiziertes Bcc innerhalb von DATA | Abgeleitet. Manche MTAs parsen DATA erneut. Cakes RCPT TO verwendet weiterhin nur setTo / setCc / setBcc am Message-Objekt |
Zweibyte-Paar \r\n | Strip aus GHSA-2qh5 | Im Lab nachgewiesen geschlossen. Die Kontrolle konkateniert okBcc:... |
| Unauthentifizierte RCE auf einer Skeleton-App | nicht dieses Überbleibsel | Geschlossen |
Multipart filename= CRLF | 5.4.2 entfernt bereits "/\r/\n | Geschlossen |
Ich habe cakephp/cakephp 5.4.2 nach GHSA-2qh5, GHSA-fxf7, GHSA-vjqc und dem filename=-Hinweis zu 5.4.2 gepinnt. Die Transport-Tests senden nur "line one\r\nline two" und erwarten line oneline two.
SmtpTransport 5.4.2:
$headers = $message->getHeadersString(
[...],
"\r\n",
function (string $val): string {
return str_replace("\r\n", '', $val);
},
);
MailTransport verwendet denselben Callback. Message::getHeadersString bildet den Callback über Werte ab und führt dann $key . ': ' . $val aus.
Bereits festgehaltene Fehlwege: GHSA-2qh5 als geschlossen zu betrachten und sich abzuwenden; PHP mail() im Lab aufzurufen (das Orakel ist SMTP DATA plus getHeadersString); dies zu unauth RCE auf einer Skeleton-App aufzublähen. Theater: eine Reverse Shell.
python3 cakephp-smtp-crlf-Abraxas-Labs.py
oder
cd lab
./run.sh
Composer cakephp/cakephp:5.4.2 in PHP 8.3. Loopback-SMTP-Sink unter 127.0.0.1:19410.
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS. Ergebnis: ein Header X-Meta: okBcc: [email protected]: CAKEPHP-SMTP-CRLF-WITNESS.\n. Ergebnis: neue Bcc:- und X-Oracle:-Zeilen in SMTP DATA, Smtp getHeadersString und Mail getHeadersString.\r. Gleiche zusätzliche Zeilen.SUCCESS cakephp-smtp-crlf pin=5.4.2 control-crlf-stripped=yes lf-bcc=yes cr-leftover=yes how=smtp-data-bcc-line CAKEPHP-SMTP-CRLF-WITNESS
Entferne oder lehne jedes \r oder \n in Header-Namen und -Werten ab (wie beim filename=-Sanitizer in 5.4.2). Decke in den Transport-Tests einzelne LF und einzelne CR ab, nicht nur das \r\n-Paar.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Mailer/Transport/SmtpTransport.php · src/Mailer/Transport/MailTransport.php · src/Mailer/Message.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.