⚠️ Alerte sécurité : injection de headers dans le composant Mime de Symfony
Une vulnérabilité de sécurité critique a été découverte et publiée le 20 mai 2026 par Fabien Potencier dans le composant Mime de Symfony. Référencée sous l'identifiant CVE-2026-45070, elle expose les applications à des attaques par injection de headers email, une faille pouvant avoir des conséquences sérieuses sur vos infrastructures de messagerie.
Si votre application utilise le composant Mime de Symfony pour générer ou envoyer des emails, lisez cet article attentivement et planifiez votre mise à jour sans délai.
Versions affectées
Les versions suivantes du composant symfony/mime sont vulnérables :
< 5.4.52>= 6.0,< 6.4.40>= 7.0,< 7.4.12>= 8.0,< 8.0.12
Les correctifs ont été intégrés dans les versions 5.4.52, 6.4.40, 7.4.12 et 8.0.12.
Comprendre la vulnérabilité
Le contexte technique
Le composant symfony/mime expose la classe ParameterizedHeader (accessible via Symfony\Component\Mime\Header\Headers), responsable de la sérialisation des headers structurés tels que Content-Type et Content-Disposition. Ces headers transportent des paramètres sous forme de paires clé/valeur, par exemple :
Content-Disposition: attachment; filename="document.pdf"
Selon les standards RFC 2045 et RFC 5322, les noms de paramètres doivent être des tokens : un sous-ensemble ASCII restreint excluant les espaces, les retours chariot (\r), les sauts de ligne (\n) et les caractères spéciaux définis dans la spécification (tspecials).
Le problème
Si Symfony valide et encode correctement les valeurs des paramètres, il ne valide en revanche pas les noms de ces paramètres. Le nom fourni est émis tel quel dans le header sérialisé.
Concrètement, si une application laisse un utilisateur influencer le nom d'un paramètre dans un header Content-Disposition, un attaquant peut y injecter des séquences \r\n ou d'autres caractères non autorisés. Cela lui permet de manipuler la structure du header email, voire d'injecter des headers supplémentaires dans le message.
Exemple d'exploitation
Imaginez une application qui construit dynamiquement un header à partir d'une donnée utilisateur :
$header = new ParameterizedHeader('Content-Disposition', 'attachment');
$header->setParameter($userInput, 'valeur');
Si $userInput contient "filename\r\nBcc: attaquant@example.com", le header sérialisé pourrait devenir :
Content-Disposition: attachment; filename
Bcc: attaquant@example.com=valeur
Ce type d'attaque, connu sous le nom d'Email Header Injection, peut être utilisé pour envoyer des copies cachées d'emails à des destinataires non prévus, contourner des filtres antispam, ou falsifier des informations de routage.
Quel est le risque réel ?
La criticité de cette faille dépend directement du contexte d'utilisation. Elle n'est exploitable que si votre application dérive un nom de paramètre MIME à partir d'une entrée utilisateur non filtrée. Ce scénario est moins courant qu'une injection sur les valeurs, mais il existe dans des cas comme :
- Des formulaires permettant à l'utilisateur de choisir le type de pièce jointe ou ses métadonnées.
- Des API acceptant des paramètres de headers personnalisés.
- Des systèmes de templating d'emails avec des champs dynamiques mal maîtrisés.
Même si votre application ne semble pas exposée directement, mettre à jour reste la bonne pratique. Une dépendance tierce ou une évolution future du code pourrait introduire ce vecteur sans que vous vous en rendiez compte.
Comment corriger la faille ?
Mettre à jour Symfony
La solution officielle est simple : mettez à jour votre version de Symfony vers un correctif publié.
Avec Composer :
# Pour Symfony 6.4
composer update symfony/mime --with-all-dependencies
# Vérifiez la version installée
composer show symfony/mime
Assurez-vous d'atteindre au minimum :
| Branche | Version corrigée |
|---|---|
| 5.4.x | 5.4.52 |
| 6.4.x | 6.4.40 |
| 7.4.x | 7.4.12 |
| 8.0.x | 8.0.12 |
Vérifier votre code applicatif
En complément de la mise à jour, auditez votre code pour identifier tout endroit où un nom de paramètre MIME est construit à partir d'une entrée extérieure. Appliquez une validation stricte : un nom de paramètre valide ne doit contenir que des caractères alphanumériques et certains symboles définis par la RFC (tiret, underscore, etc.).
// Exemple de validation basique
if (!preg_match('/^[a-zA-Z0-9!#$%&\'*+\-.^_`|~]+$/', $paramName)) {
throw new \InvalidArgumentException('Nom de paramètre MIME invalide.');
}
Conclusion
La CVE-2026-45070 rappelle qu'une validation incomplète des entrées, même dans un composant éprouvé comme symfony/mime, peut ouvrir la porte à des attaques ciblées. La bonne nouvelle : le correctif est disponible immédiatement et l'application de la mise à jour suffit à éliminer le risque au niveau du framework.
Chez MulerTech, nous recommandons d'intégrer la gestion des CVE Symfony dans votre veille de maintenance régulière. Abonnez-vous au blog officiel Symfony et aux flux de sécurité pour être alerté dès la publication d'un correctif.
Source originale : Symfony Blog — CVE-2026-45070, publié par Fabien Potencier le 20 mai 2026.