
CVE-2026-27621 - TypiCMS Core présente une vulnérabilité de Cross-Site Scripting (XSS) stocké via le téléversement de fichiers SVG
| Champ | Détails |
|---|---|
| Identifiant CVE | CVE-2026-27621 |
| Sévérité | Moyenne |
| Avis de sécurité | Voir l'avis |
| Découvert par | Lukasz Rybak |
Une vulnérabilité de Cross-Site Scripting (XSS) stocké existe dans le module de téléchargement de fichiers de TypiCMS. L'application permet aux utilisateurs disposant des permissions de téléchargement de fichiers de téléverser des fichiers SVG. Bien qu'une validation du type MIME soit effectuée, le contenu du fichier SVG n'est pas assaini. Un attaquant peut téléverser un fichier SVG spécialement conçu contenant du code JavaScript malveillant. Lorsqu'un autre utilisateur (tel qu'un administrateur) consulte ou accède à ce fichier via l'application, le script s'exécute dans son navigateur, conduisant à la compromission de la session de cet utilisateur.
Le problème est aggravé par un bug dans la logique d'analyse SVG, qui peut provoquer une erreur 500 si le SVG téléversé ne contient pas d'attribut viewBox. Cependant, cela n'atténue pas la vulnérabilité XSS, car un attaquant peut facilement inclure un attribut viewBox valide dans sa charge utile malveillante.
TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php et TypiCMS\Modules\Core\Services\FileUploader.php.La vulnérabilité provient de deux points principaux :
FileFormRequest autorise explicitement svg comme type MIME autorisé pour les téléversements.FileUploader enregistre le fichier SVG sur le serveur sans analyser ni assainir son contenu afin de supprimer les éléments potentiellement malveillants tels que les balises <script> ou les gestionnaires d'événements on*.Lorsque le disque du système de fichiers par défaut est défini sur public, le fichier SVG téléversé est stocké dans un répertoire accessible publiquement, ce qui permet de l'atteindre facilement via une URL directe et de déclencher la charge utile XSS.
Créer un fichier SVG malveillant :
Créez un fichier nommé malicious.svg avec le contenu suivant. L'attribut viewBox est inclus pour contourner le bug d'analyse de l'application.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<script>
// A simple PoC to demonstrate the vulnerability
alert('XSS in TypiCMS! Your session cookie is: ' + document.cookie);
</script>
<text x="10" y="50">If you see this, the script has run.</text>
</svg>
Téléverser le fichier malveillant :
/admin/files).malicious.svg. L'application acceptera le fichier et le stockera.
http://<your-site>/storage/files/malicious.svg.L'exploitation réussie de cette vulnérabilité permet à un attaquant d'exécuter du JavaScript arbitraire dans le contexte du navigateur de la victime. Bien que l'utilisation du drapeau HttpOnly sur les cookies de session empêche le vol direct de l'ID de session via document.cookie, l'attaquant peut néanmoins parvenir à une compromission totale du compte de la victime en effectuant des actions en son nom.
L'impact comprend :
Prise de contrôle du compte par falsification d'actions : Le script de l'attaquant peut effectuer des requêtes authentifiées vers l'API de l'application depuis le navigateur de la victime. Cela permet à l'attaquant d'effectuer toute action que la victime est autorisée à faire, comme :
Divulgation d'informations sensibles : Le script peut lire le contenu de toute page consultée par la victime dans le panneau d'administration. Cela inclut les listes d'utilisateurs (avec noms et e-mails), les paramètres privés de l'application et d'autres données sensibles, qui peuvent ensuite être exfiltrées vers un serveur contrôlé par l'attaquant.
Hameçonnage et ingénierie sociale : Le script peut manipuler l'interface du panneau d'administration pour afficher de faux formulaires de connexion afin d'inciter l'utilisateur à ressaisir ses identifiants, ou le rediriger vers un site Web malveillant.
Enregistrement des frappes clavier : Le script peut capturer toute information que la victime saisit dans les formulaires de la page compromise.
Parce que l'attaquant peut effectuer toute action en tant qu'administrateur authentifié, cette vulnérabilité mène effectivement à une compromission totale de l'application, même sans accès direct au cookie de session. Le risque est élevé.
Il est recommandé d'appliquer une approche de défense en profondeur pour atténuer cette vulnérabilité.
Correctif principal : assainir le contenu SVG :
La solution la plus robuste consiste à assainir les fichiers SVG lors du téléversement. Avant d'enregistrer le fichier, il doit être analysé pour supprimer tous les éléments potentiellement dangereux, notamment les balises <script>, <style>, <foreignObject> et tous les attributs d'événement on*. Cela peut être réalisé à l'aide d'une bibliothèque dédiée à l'assainissement des SVG.
Correctif secondaire : désactiver les téléversements SVG :
Si les téléversements SVG ne sont pas une fonctionnalité critique pour l'application, la solution la plus simple et la plus sûre consiste à les désactiver complètement. Cela peut être fait en supprimant 'svg' de la liste des types MIME autorisés dans TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php.
// In FileFormRequest.php
// BEFORE:
$fileRule = 'mimes:jpeg,gif,png,...,svg,...|max:...';
// AFTER:
$fileRule = 'mimes:jpeg,gif,png,...,pdf,...|max:...'; // Removed 'svg'
Durcissement - Content-Security-Policy (CSP) : Implémentez un en-tête Content-Security-Policy (CSP) strict pour l'application. Un CSP bien configuré peut empêcher l'exécution de scripts en ligne, ce qui atténuerait l'impact de cette vulnérabilité XSS.
Durcissement - servir le contenu utilisateur depuis un domaine séparé : Servez tous les fichiers téléversés par les utilisateurs depuis un domaine séparé, sans cookies. Il s'agit d'une mesure de sécurité très efficace qui isole le contenu généré par les utilisateurs de l'application principale, empêchant les scripts d'accéder aux cookies de session ou d'interagir avec le DOM de l'application.
Cette CVE a été divulguée de manière responsable, conformément aux pratiques de divulgation coordonnée des vulnérabilités. Les informations fournies ici sont uniquement à des fins éducatives et défensives.