flawopen.com/XSS/Téléversement SVG
Un téléversement SVG présente-t-il un risque XSS ?
Un SVG téléversé est un document, pas seulement des pixels : il peut contenir des éléments actifs comme des scripts et des gestionnaires d’événements. L’exécution dépend du contexte navigateur. Un SVG utilisé dans <img> est restreint ; en ligne, ouvert directement ou intégré comme document, il peut être actif.
Ce qui distingue SVG des autres formats image
Contrairement au PNG ou au JPEG, SVG est du XML et peut contenir du contenu actif. Les navigateurs désactivent les scripts dans des contextes d’image restreints comme <img>, mais pas lorsque le SVG est ouvert directement, intégré comme document via <object>, <iframe> ou <embed>, ou inséré en ligne. Une image de profil téléversée peut devenir une stored XSS si l’application la sert dans un contexte actif sous sa propre origine. Le comportement dépend du contexte ; extension et MIME ne signifient pas assainissement.
Sécuriser les téléversements
- ✓Utilisez un assainisseur SVG maintenu avec une liste d’autorisation explicite avant stockage ou affichage. Retirez les éléments actifs, gestionnaires d’événements, références externes et
foreignObjects’ils ne sont pas nécessaires ; n’assainissez pas XML avec des expressions régulières. - ✓Si l’utilisateur n’a besoin que de l’image, pixellisez le SVG dans un processus isolé avec des limites de ressources, puis servez le raster. Gardez l’original hors de la racine web s’il n’est pas requis.
- ✓Servez les fichiers téléversés depuis un domaine enregistrable distinct qui ne reçoit aucun cookie de l’application. Un sous-domaine frère peut quand même recevoir les cookies définis sur le domaine parent.
- ✓Pour un SVG non fiable conservé comme document, forcez le téléchargement avec Content-Disposition: attachment et
X-Content-Type-Options: nosniff, ou utilisez uniquement un contexte d’image restreint comme <img>. Évitez l’insertion inline, <object>, <iframe> et le service de document sur la même origine.
Questions fréquentes
['Vérifier l’extension ou le type MIME suffit-il ?', 'Non. L’extension et le MIME déclaré sont des métadonnées, pas une validation du contenu actif. Vérifiez le format réel puis appliquez une liste d’autorisation adaptée à SVG ou convertissez en raster si ses fonctionnalités ne sont pas nécessaires.']
Références
- OWASP XML Security Cheat Sheet
- flawopen.com — Cross-Site Scripting
- OWASP — File Upload Cheat Sheet
- OWASP ASVS — sanitizing or sandboxing SVG scriptable content