
CakePHP 5.4.2 - Alto - Remoto - Iniezione di header - SmtpTransport LF isolato residuo di GHSA-2qh5
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-smtp-crlf
Write-up: https://abraxaslabs.tech/research/cakephp-smtp-crlf
Classe: Mail header injection Portata: Remota
CakePHP 5.4.2 (887b641) - Cake Software Foundation
GHSA-2qh5 / CVE-2026-77634 ha aggiunto str_replace("\r\n", '', $val) su SmtpTransport e MailTransport. Quel callback è un no-op per un LF o CR isolato. I nomi degli header vengono ancora concatenati senza sanitizzazione. La funzione PHP mail() e il DATA SMTP che abbiamo catturato trattano un LF isolato come una nuova riga di header.
Se un'app copia dati utente in un header personalizzato, un attaccante può aggiungere Bcc, riscrivere Subject o inserirsi nel corpo inviando LF invece di CRLF. La correzione annunciata non lo impedisce. Lo skeleton cakephp/app non inserisce dati della richiesta in header personalizzati di per sé.
| ID | nessuna CVE al momento |
| Classe | Mail header injection (residuo di LF isolato di GHSA-2qh5) |
| Portata | Remota (come GHSA-2qh5: l'app copia dati utente in Message::setHeaders) |
| CWE | CWE-93 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Prodotto | CakePHP |
| Affetto | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | come GHSA-2qh5: l'app copia dati utente in Message::setHeaders / addHeaders |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Richiede un'applicazione che inserisca dati della richiesta in header di posta personalizzati.
| Privilegio | Metodo / sink | Dimostrato in lab o dedotto |
|---|---|---|
Iniettare una riga Bcc: (o Cc: / To:) aggiuntiva nel blocco header del DATA SMTP | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) poi SmtpTransport::send | Dimostrato in lab. Sia il DATA SMTP sia getHeadersString mostrano una nuova riga Bcc:. Testimone X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
Stessa iniezione tramite MailTransport | Stesso callback in MailTransport::send | Dimostrato in lab su getHeadersString con la include list e il callback di strip di MailTransport. Questo lab non chiama la funzione PHP mail() |
| CR isolato oltre a LF isolato | ok\rBcc: ... | Dimostrato in lab. Lo strip della sola coppia lascia \r; i parser di header che dividono su CR/LF lo trattano come una nuova riga |
Riscrivere Subject o inserirsi nel corpo | Valore contenente \nSubject: o \n\n | Dedotto dalla stessa concatenazione. Il lab ha iniettato Bcc / X-Oracle, non Subject |
| Destinatario envelope aggiuntivo | Bcc iniettato all'interno del DATA | Dedotto. Alcuni MTA ri-analizzano il DATA. Il RCPT TO di Cake usa ancora solo setTo / setCc / setBcc sull'oggetto Message |
Coppia \r\n di due byte | Strip di GHSA-2qh5 | Dimostrato in lab come chiuso. Il controllo concatena okBcc:... |
| RCE non autenticata su un'app skeleton | non questo residuo | Chiuso |
CRLF in filename= multipart | 5.4.2 rimuove già "/\r/\n | Chiuso |
Ho fissato cakephp/cakephp 5.4.2 dopo GHSA-2qh5, GHSA-fxf7, GHSA-vjqc e la nota su filename= della 5.4.2. I test dei transport inviano solo "line one\r\nline two" e si aspettano line oneline two.
SmtpTransport 5.4.2:
$headers = $message->getHeadersString(
[...],
"\r\n",
function (string $val): string {
return str_replace("\r\n", '', $val);
},
);
MailTransport usa la stessa callback. Message::getHeadersString applica la callback ai valori, poi esegue $key . ': ' . $val.
Vicoli ciechi già registrati: considerare GHSA-2qh5 chiuso e andare avanti; chiamare mail() di PHP nel lab (l'oracolo è SMTP DATA più getHeadersString); gonfiare la cosa fino a un RCE non autenticato su un'app scheletro. Teatro: una reverse shell.
python3 cakephp-smtp-crlf-Abraxas-Labs.py
o
cd lab
./run.sh
Composer cakephp/cakephp:5.4.2 in PHP 8.3. Sink SMTP loopback su 127.0.0.1:19410.
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS. Risultato: un header X-Meta: okBcc: [email protected]: CAKEPHP-SMTP-CRLF-WITNESS.\n. Risultato: nuove righe Bcc: e X-Oracle: in SMTP DATA, in Smtp getHeadersString e in Mail getHeadersString.\r. Stesse righe aggiuntive.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
Rimuovere o rifiutare qualsiasi \r o \n nei nomi e nei valori degli header (come il sanitizer filename= della 5.4.2). Coprire nei test di trasporto il caso di LF isolato e CR isolato, non solo la coppia \r\n.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Mailer/Transport/SmtpTransport.php · src/Mailer/Transport/MailTransport.php · src/Mailer/Message.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio su loopback. Nessuna garanzia.