flawopen.com/XSS/Carga de SVG
¿La carga de SVG implica riesgo de XSS?
Un SVG subido es un documento, no solo píxeles: puede incluir contenido activo como scripts y manejadores de eventos. La ejecución depende de cómo lo recibe el navegador. En <img> se usa un contexto de imagen restringido; SVG inline, navegación directa o incrustación como documento pueden ser activos.
Qué diferencia SVG de otros formatos de imagen
A diferencia de PNG o JPEG, SVG es XML y puede contener contenido activo. Los navegadores desactivan los scripts en contextos de imagen restringidos como <img>, pero no cuando el SVG se abre directamente, se incrusta como documento mediante <object>, <iframe> o <embed>, o se inserta inline. Una imagen de perfil subida puede convertirse en stored XSS si la aplicación la sirve en un contexto activo bajo su propio origen. El comportamiento depende del contexto; la extensión y el MIME no sanea el contenido.
Cómo proteger las cargas
- ✓Usa un saneador SVG mantenido y con una lista de permitidos explícita antes de almacenar o mostrar. Elimina elementos ejecutables, event handlers, referencias externas y
foreignObjectsi no son necesarios; no sanees XML con expresiones regulares. - ✓Si el usuario solo necesita una imagen, rasteriza el SVG en un proceso aislado con límites de recursos y sirve el resultado rasterizado. Mantén el original fuera de la raíz web si no hace falta.
- ✓Sirve las cargas desde un dominio registrable independiente que no reciba cookies de la aplicación. Un subdominio hermano aún podría recibir cookies definidas para el dominio padre.
- ✓Si debes conservar el SVG como documento no confiable, fuerza la descarga con Content-Disposition: attachment y
X-Content-Type-Options: nosniff, o muéstralo solo en un contexto de imagen restringido como <img>. Evita inline, <object>, <iframe> y servirlo como documento en el mismo origen.
Preguntas frecuentes
['¿Validar la extensión o el MIME del archivo lo soluciona?', 'No. La extensión y el MIME declarado son metadatos, no validan el contenido activo del documento. Comprueba el formato real y luego aplica una lista de saneamiento específica para SVG o conviértelo a raster si no necesitas funciones SVG.']
Referencias
- OWASP XML Security Cheat Sheet
- flawopen.com — Cross-Site Scripting
- OWASP — File Upload Cheat Sheet
- OWASP ASVS — sanitizing or sandboxing SVG scriptable content