
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
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. Ese callback no hace nada ante un LF o CR aislado. Los nombres de cabecera siguen concatenándose sin sanear. PHP mail() y el 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 colarse en el cuerpo enviando LF en lugar de CRLF. El fix anunciado no lo impide. El cakephp/app estándar no introduce datos de la petición en cabeceras personalizadas por sí solo.
| ID | sin CVE todavía |
| Clase | Inyección de cabeceras de correo (resto 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) |
| Auth | igual que GHSA-2qh5: la app copia datos del usuario en Message::setHeaders / addHeaders |
| Licencia | GNU Affero GPL v3.0 |
| Lab | 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 | Probado en lab o inferido |
|---|---|---|
Inyectar una línea Bcc: (o Cc: / To:) adicional en el bloque de cabeceras de SMTP DATA | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) y luego SmtpTransport::send | Probado en lab. Tanto SMTP DATA como getHeadersString muestran una nueva línea Bcc:. Testigo X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
Misma inyección a través de MailTransport | Mismo callback en MailTransport::send | Probado en lab sobre getHeadersString con la lista de inclusión y el callback de strip de MailTransport. Este lab no llama a PHP mail() |
| CR aislado además de LF aislado | ok\rBcc: ... | Probado en lab. El strip solo de pares deja \r; los parsers de cabeceras que dividen por CR/LF lo tratan como una nueva línea |
Reescribir Subject o colarse en el cuerpo | El valor contiene \nSubject: o \n\n | Inferido a partir de la misma concatenación. El lab inyectó Bcc / X-Oracle, no Subject |
| Destinatario de sobre adicional | Bcc inyectado dentro de DATA | Inferido. Algunos MTAs reparsean DATA. El RCPT TO de Cake sigue usando solo setTo / setCc / setBcc en el objeto Message |
Par \r\n de dos bytes | Strip de GHSA-2qh5 | Probado en lab, cerrado. El control concatena okBcc:... |
| RCE no autenticado en una app esqueleto | no este resto | 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. Los tests 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.
Caminos equivocados ya registrados: dar GHSA-2qh5 por cerrado y marcharse; llamar a PHP mail() en el lab (el oráculo es SMTP DATA más getHeadersString); inflar esto a un RCE no autenticado en una app 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. Sink SMTP en 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 nombres y valores de cabecera (igual que el sanitizador de filename= de 5.4.2). Cubrir LF aislado y CR aislado en los tests 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. Ver LICENSE. Solo lab en loopback. Sin garantía.