
CakePHP 5.4.2 - Élevée - À distance - Injection d'en-tête - SmtpTransport saut de ligne LF isolé résiduel de GHSA-2qh5
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-smtp-crlf
Write-up : https://abraxaslabs.tech/research/cakephp-smtp-crlf
Classe : Injection d'en-têtes de courrier Portée : Distante
CakePHP 5.4.2 (887b641) - Cake Software Foundation
GHSA-2qh5 / CVE-2026-77634 a ajouté str_replace("\r\n", '', $val) sur SmtpTransport et MailTransport. Ce callback est sans effet pour un LF ou un CR isolé. Les noms d'en-têtes sont toujours concaténés sans assainissement. La fonction PHP mail() et les données SMTP DATA que nous avons capturées traitent un LF isolé comme une nouvelle ligne d'en-tête.
Si une application copie des données utilisateur dans un en-tête personnalisé, un attaquant peut ajouter un Bcc, réécrire le Subject ou s'introduire dans le corps en envoyant un LF au lieu d'un CRLF. Le correctif annoncé ne l'empêche pas. Le squelette cakephp/app standard ne place pas de données de requête dans des en-têtes personnalisés de lui-même.
| ID | pas encore de CVE |
| Classe | Injection d'en-têtes de courrier (résidu de LF isolé de GHSA-2qh5) |
| Portée | Distante (identique à GHSA-2qh5 : l'application copie des données utilisateur dans Message::setHeaders) |
| CWE | CWE-93 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Produit | CakePHP |
| Affecté | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | identique à GHSA-2qh5 : l'application copie des données utilisateur dans Message::setHeaders / addHeaders |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Nécessite une application qui place des données de requête dans des en-têtes de courrier personnalisés.
| Privilège | Méthode / sink | Prouvé en lab ou déduit |
|---|---|---|
Injecter une ligne Bcc: (ou Cc: / To:) supplémentaire dans le bloc d'en-têtes SMTP DATA | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) puis SmtpTransport::send | Prouvé en lab. SMTP DATA et getHeadersString affichent tous deux une nouvelle ligne Bcc:. Témoin X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
Même injection via MailTransport | Même callback dans MailTransport::send | Prouvé en lab sur getHeadersString avec la liste d'inclusion et le callback de suppression de MailTransport. Ce lab n'appelle pas la fonction PHP mail() |
| CR isolé ainsi que LF isolé | ok\rBcc: ... | Prouvé en lab. La suppression par paire ne retire que \r ; les analyseurs d'en-têtes qui découpent sur CR/LF le traitent comme une nouvelle ligne |
Réécrire Subject ou s'introduire dans le corps | La valeur contient \nSubject: ou \n\n | Déduit de la même concaténation. Le lab a injecté Bcc / X-Oracle, pas Subject |
| Destinataire d'enveloppe supplémentaire | Bcc injecté dans DATA | Déduit. Certains MTA ré-analysent DATA. Le RCPT TO de Cake utilise toujours uniquement setTo / setCc / setBcc sur l'objet Message |
Paire \r\n de deux octets | Suppression GHSA-2qh5 | Prouvé en lab comme fermé. Le contrôle concatène okBcc:... |
| RCE non authentifiée sur une application squelette | pas ce résidu | Fermé |
CRLF dans filename= multipart | 5.4.2 supprime déjà "/\r/\n | Fermé |
J'ai épinglé cakephp/cakephp 5.4.2 après GHSA-2qh5, GHSA-fxf7, GHSA-vjqc et la note sur filename= de la 5.4.2. Les tests de transport envoient uniquement "line one\r\nline two" et attendent line oneline two.
SmtpTransport 5.4.2 :
$headers = $message->getHeadersString(
[...],
"\r\n",
function (string $val): string {
return str_replace("\r\n", '', $val);
},
);
MailTransport utilise le même callback. Message::getHeadersString applique le callback sur les valeurs, puis effectue $key . ': ' . $val.
Fausses pistes déjà consignées : considérer GHSA-2qh5 comme clos et passer à autre chose ; appeler mail() de PHP dans le labo (l'oracle est SMTP DATA plus getHeadersString) ; gonfler cela en RCE non authentifiée sur une application squelette. Théâtre : un reverse shell.
python3 cakephp-smtp-crlf-Abraxas-Labs.py
ou
cd lab
./run.sh
Composer cakephp/cakephp:5.4.2 en PHP 8.3. Réceptacle SMTP loopback sur 127.0.0.1:19410.
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS. Résultat : un en-tête X-Meta: okBcc: [email protected]: CAKEPHP-SMTP-CRLF-WITNESS.\n uniquement. Résultat : nouvelles lignes Bcc: et X-Oracle: dans SMTP DATA, getHeadersString de Smtp et getHeadersString de Mail.\r uniquement. Mêmes lignes supplémentaires.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
Supprimer ou rejeter tout \r ou \n dans les noms et valeurs d'en-têtes (comme le désinfectant filename= de la 5.4.2). Couvrir le LF seul et le CR seul dans les tests de transport, pas seulement la paire \r\n.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Mailer/Transport/SmtpTransport.php · src/Mailer/Transport/MailTransport.php · src/Mailer/Message.phpGNU Affero GPL v3.0. Voir LICENSE. Laboratoire en boucle locale uniquement. Aucune garantie.