
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
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 ein No-op für ein einzelnes LF oder CR. Header-Namen werden weiterhin unsanitisiert 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 fügt Request-Daten nicht von sich aus in benutzerdefinierte Header ein.
| ID | noch keine CVE |
| Klasse | Mail-Header-Injection (Lone-LF-Überbleibsel von GHSA-2qh5) |
| Reichweite | Remote (wie GHSA-2qh5: App kopiert Benutzerdaten in Message::setHeaders) |
| CWE | CWE-93 |
| CVSS | High: 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 einfügt.
| Privileg | Methode / Sink | Im Lab bewiesen 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 bewiesen. 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 bewiesen an getHeadersString mit der MailTransport-Include-Liste und dem Strip-Callback. Dieses Lab ruft PHP mail() nicht auf |
| Einzelnes CR ebenso wie einzelnes LF | ok\rBcc: ... | Im Lab bewiesen. Pair-only-Strip lässt \r übrig; Header-Parser, die auf CR/LF splitten, behandeln es als neue Zeile |
Subject umschreiben oder in den Body eindringen | Wert enthält \nSubject: oder \n\n | Abgeleitet aus derselben Konkatenation. Lab injizierte Bcc / X-Oracle, nicht Subject |
| Zusätzlicher Envelope-Empfänger | Injiziertes Bcc innerhalb DATA | Abgeleitet. Manche MTAs parsen DATA neu. Cakes RCPT TO verwendet weiterhin nur setTo / setCc / setBcc am Message-Objekt |
Zwei-Byte-\r\n-Paar | GHSA-2qh5-Strip | Im Lab bewiesen geschlossen. 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 5.4.2-filename=-Hinweis 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 mappt den Callback über Werte und macht dann $key . ': ' . $val.
Bereits festgehaltene Irrwege: GHSA-2qh5 als geschlossen betrachten und weitergehen; PHP mail() im Lab aufrufen (das Orakel ist SMTP DATA plus getHeadersString); das zu unauth RCE auf einer Skeleton-App aufblasen. 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 auf 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. Dieselben zusätzlichen 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
Jedes \r oder \n in Header-Namen und -Werten entfernen oder ablehnen (wie der 5.4.2-filename=-Sanitizer). Einzelnes LF und einzelnes CR in den Transport-Tests abdecken, 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.