
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
Classe : Injection d'en-tête 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 seul. Les noms d'en-tête sont toujours concaténés sans assainissement. PHP mail() et le SMTP DATA que nous avons capturé traitent un LF seul 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 cakephp/app standard ne place pas les 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ête de courrier (résidu de LF seul 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 |
| Labo | 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 labo ou déduit |
|---|---|---|
Injecter une ligne Bcc: supplémentaire (ou Cc: / To:) dans le bloc d'en-tête SMTP DATA | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) puis SmtpTransport::send | Prouvé en labo. SMTP DATA et getHeadersString montrent 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 labo sur getHeadersString avec la liste d'inclusion et le callback de suppression de MailTransport. Ce labo n'appelle pas PHP mail() |
| CR seul ainsi que LF seul | ok\rBcc: ... | Prouvé en labo. La suppression de la paire seule laisse \r ; les analyseurs d'en-tête 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 labo 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 labo, 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 fait $key . ': ' . $val.
Fausses pistes déjà consignées : considérer GHSA-2qh5 comme fermé et passer à autre chose ; appeler PHP mail() 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 sous PHP 8.3. Récepteur SMTP en boucle locale sur 127.0.0.1:19410.
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS. Résultat : un seul 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, Smtp getHeadersString, et Mail getHeadersString.\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ête (comme l'assainisseur 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. Labo en boucle locale uniquement. Aucune garantie.