
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
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 un CR isolato. I nomi degli header vengono ancora concatenati senza sanitizzazione. La funzione PHP mail() e i dati SMTP DATA 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 body inviando LF invece di CRLF. La correzione annunciata non lo impedisce. Il pacchetto standard 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 inserisce dati della richiesta in header mail personalizzati.
| Privilegio | Metodo / sink | Provato in lab o dedotto |
|---|---|---|
Iniettare una riga Bcc: (o Cc: / To:) extra nel blocco header di SMTP DATA | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) poi SmtpTransport::send | Provato in lab. SMTP DATA e getHeadersString mostrano entrambi una nuova riga Bcc:. Testimone X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
Stessa iniezione tramite MailTransport | Stesso callback in MailTransport::send | Provato 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: ... | Provato 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 body | Il valore contiene \nSubject: o \n\n | Dedotto dalla stessa concatenazione. Il lab ha iniettato Bcc / X-Oracle, non Subject |
| Destinatario envelope extra | Bcc iniettato dentro DATA | Dedotto. Alcuni MTA ri-analizzano DATA. Il RCPT TO di Cake usa ancora solo setTo / setCc / setBcc sull'oggetto Message |
Coppia \r\n a due byte | Strip di GHSA-2qh5 | Provato in lab, 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 lo stesso callback. Message::getHeadersString applica il callback ai valori, poi esegue $key . ': ' . $val.
Vicoli ciechi già registrati: considerare GHSA-2qh5 chiuso e andare avanti; chiamare la funzione PHP mail() nel lab (l'oracolo è SMTP DATA più getHeadersString); gonfiare questo a RCE non autenticata su un'app skeleton. Teatro: una reverse shell.
python3 cakephp-smtp-crlf-Abraxas-Labs.py
oppure
cd lab
./run.sh
Composer cakephp/cakephp:5.4.2 in PHP 8.3. Sink SMTP su loopback a 127.0.0.1:19410.
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS. Risultato: un solo 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 extra.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 di filename= della 5.4.2). Coprire LF isolato e CR isolato nei test dei transport, 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 lab su loopback. Nessuna garanzia.