
CakePHP 5.4.2 - Alta - Remota - Inyección de encabezados - SmtpTransport LF solitario remanente de GHSA-2qh5
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-smtp-crlf
Análisis: https://abraxaslabs.tech/research/cakephp-smtp-crlf
Clase: Inyección de cabeceras de correo Alcance: Remoto
CakePHP 5.4.2 (887b641) - Cake Software Foundation
GHSA-2qh5 / CVE-2026-77634 añadió str_replace("\r\n", '', $val) en SmtpTransport y MailTransport. Esa función de callback no hace nada ante un LF o CR aislado. Los nombres de cabecera siguen concatenándose sin sanear. La función mail() de PHP y los datos SMTP DATA que capturamos tratan un LF aislado como una nueva línea de cabecera.
Si una aplicación copia datos del usuario en una cabecera personalizada, un atacante puede añadir Bcc, reescribir Subject o irrumpir en el cuerpo enviando LF en lugar de CRLF. La corrección anunciada no lo impide. El cakephp/app estándar no introduce datos de la petición en cabeceras personalizadas por sí mismo.
| ID | aún sin CVE |
| Clase | Inyección de cabeceras de correo (residuo de LF aislado de GHSA-2qh5) |
| Alcance | Remoto (igual que GHSA-2qh5: la app copia datos del usuario en 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 |
| Producto | CakePHP |
| Afectado | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Autenticación | igual que GHSA-2qh5: la app copia datos del usuario en Message::setHeaders / addHeaders |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Requiere una aplicación que introduzca datos de la petición en cabeceras de correo personalizadas.
| Privilegio | Método / sink | Demostrado en laboratorio o inferido |
|---|---|---|
Inyectar una línea Bcc: adicional (o Cc: / To:) en el bloque de cabeceras SMTP DATA | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) y luego SmtpTransport::send | Demostrado en laboratorio. Tanto SMTP DATA como getHeadersString muestran una nueva línea Bcc:. Testigo X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
La misma inyección a través de MailTransport | Mismo callback en MailTransport::send | Demostrado en laboratorio sobre getHeadersString con la lista de inclusión y el callback de eliminación de MailTransport. Este laboratorio no invoca la función mail() de PHP |
| CR aislado además de LF aislado | ok\rBcc: ... | Demostrado en laboratorio. La eliminación solo de pares deja \r; los analizadores de cabeceras que dividen por CR/LF lo tratan como una nueva línea |
Reescribir Subject o irrumpir en el cuerpo | El valor contiene \nSubject: o \n\n | Inferido a partir de la misma concatenación. El laboratorio inyectó Bcc / X-Oracle, no Subject |
| Destinatario de sobre adicional | Bcc inyectado dentro de DATA | Inferido. Algunos MTA vuelven a analizar DATA. El RCPT TO de Cake sigue usando solo setTo / setCc / setBcc en el objeto Message |
Par \r\n de dos bytes | Eliminación de GHSA-2qh5 | Demostrado en laboratorio como cerrado. El control concatena okBcc:... |
| RCE no autenticado en una app esqueleto | no es este residuo | Cerrado |
CRLF en filename= de multipart | 5.4.2 ya elimina "/\r/\n | Cerrado |
Fijé cakephp/cakephp 5.4.2 tras GHSA-2qh5, GHSA-fxf7, GHSA-vjqc y la nota sobre filename= de 5.4.2. Las pruebas de transporte solo envían "line one\r\nline two" y esperan line oneline two.
SmtpTransport 5.4.2:
$headers = $message->getHeadersString(
[...],
"\r\n",
function (string $val): string {
return str_replace("\r\n", '', $val);
},
);
MailTransport usa el mismo callback. Message::getHeadersString aplica el callback sobre los valores y luego hace $key . ': ' . $val.
Errores ya registrados: dar GHSA-2qh5 por cerrado y abandonar; llamar a mail() de PHP en el laboratorio (el oráculo es SMTP DATA más getHeadersString); inflar esto a RCE no autenticado en una aplicación esqueleto. Teatro: una reverse shell.
python3 cakephp-smtp-crlf-Abraxas-Labs.py
o
cd lab
./run.sh
Composer cakephp/cakephp:5.4.2 en PHP 8.3. Receptor SMTP de loopback en 127.0.0.1:19410.
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS. Resultado: una cabecera X-Meta: okBcc: [email protected]: CAKEPHP-SMTP-CRLF-WITNESS.\n. Resultado: nuevas líneas Bcc: y X-Oracle: en SMTP DATA, en getHeadersString de Smtp y en getHeadersString de Mail.\r. Las mismas líneas adicionales.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
Eliminar o rechazar cualquier \r o \n en los nombres y valores de las cabeceras (igual que el saneador de filename= de la 5.4.2). Cubrir el LF solitario y el CR solitario en las pruebas de transporte, no solo el par \r\n.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Mailer/Transport/SmtpTransport.php · src/Mailer/Transport/MailTransport.php · src/Mailer/Message.phpGNU Affero GPL v3.0. Consulte LICENSE. Solo laboratorio de loopback. Sin garantía.