
CVE-2026-27621 - TypiCMS Core tiene Cross-Site Scripting (XSS) Almacenado mediante la carga de archivos SVG
| Campo | Detalles |
|---|
| ID de CVE | CVE-2026-27621 |
| Gravedad | MEDIA |
| Aviso | Ver Aviso |
| Descubierto por | Lukasz Rybak |
Existe una vulnerabilidad de Cross-Site Scripting (XSS) Almacenado en el módulo de carga de archivos de TypiCMS. La aplicación permite a los usuarios con permisos de carga de archivos subir archivos SVG. Aunque existe una validación del tipo MIME, el contenido del archivo SVG no se sanitiza. Un atacante puede cargar un archivo SVG especialmente diseñado que contenga código JavaScript malicioso. Cuando otro usuario (como un administrador) ve o accede a este archivo a través de la aplicación, el script se ejecuta en su navegador, lo que conduce a un compromiso de la sesión de dicho usuario.
El problema se ve agravado por un error en la lógica de análisis del SVG, que puede provocar un error 500 si el SVG cargado no contiene un atributo viewBox. Sin embargo, esto no mitiga la vulnerabilidad XSS, ya que un atacante puede incluir fácilmente un atributo viewBox válido en su carga maliciosa.
TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php y TypiCMS\Modules\Core\Services\FileUploader.php.La vulnerabilidad se origina en dos puntos principales:
FileFormRequest incluye explícitamente svg en la lista blanca de tipos MIME permitidos para la carga.FileUploader guarda el archivo SVG en el servidor sin analizar ni sanitizar su contenido para eliminar elementos potencialmente maliciosos, como etiquetas <script> o manejadores de eventos on*.Cuando el disco del sistema de archivos predeterminado está configurado como public, el archivo SVG cargado se almacena en un directorio de acceso público, lo que hace que sea trivial acceder al archivo mediante una URL directa y activar la carga útil XSS.
Crear un archivo SVG malicioso:
Cree un archivo llamado malicious.svg con el siguiente contenido. El atributo viewBox se incluye para evitar el error de análisis de la aplicación.
<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>
Cargar el archivo malicioso:
/admin/files).malicious.svg. La aplicación aceptará el archivo y lo almacenará.
http://<your-site>/storage/files/malicious.svg.La explotación exitosa de esta vulnerabilidad permite a un atacante ejecutar JavaScript arbitrario en el contexto del navegador de la víctima. Aunque el uso de la bandera HttpOnly en las cookies de sesión impide el robo directo del ID de sesión mediante document.cookie, el atacante puede lograr igualmente un compromiso total de la cuenta de la víctima realizando acciones en su nombre.
El impacto incluye:
Toma de control de la cuenta mediante falsificación de acciones: El script del atacante puede realizar solicitudes autenticadas a la API de la aplicación desde el navegador de la víctima. Esto permite al atacante realizar cualquier acción para la que la víctima esté autorizada, como:
Divulgación de información sensible: El script puede leer el contenido de cualquier página que la víctima vea dentro del panel de administración. Esto incluye listas de usuarios (con nombres y correos electrónicos), ajustes privados de la aplicación y otros datos sensibles, que pueden ser exfiltrados a un servidor controlado por el atacante.
Phishing e ingeniería social: El script puede manipular la interfaz del panel de administración para mostrar formularios de inicio de sesión falsos que engañen al usuario para que vuelva a introducir sus credenciales, o redirigirlo a un sitio web malicioso.
Registro de pulsaciones de teclas: El script puede capturar cualquier información que la víctima escriba en los formularios de la página comprometida.
Debido a que el atacante puede realizar cualquier acción como administrador autenticado, esta vulnerabilidad conduce efectivamente a un compromiso total de la aplicación, incluso sin acceso directo a la cookie de sesión. El riesgo es Alto.
Se recomienda aplicar un enfoque de defensa en profundidad para mitigar esta vulnerabilidad.
Corrección principal: Sanitizar el contenido SVG:
La solución más robusta es sanitizar los archivos SVG en el momento de la carga. Antes de guardar el archivo, debe analizarse para eliminar todos los elementos potencialmente peligrosos, incluidas las etiquetas <script>, <style>, <foreignObject> y todos los atributos de eventos on*. Esto puede lograrse utilizando una biblioteca dedicada de sanitización de SVG.
Corrección secundaria: Deshabilitar las cargas SVG:
Si la carga de SVG no es una funcionalidad crítica para la aplicación, la solución más simple y segura es deshabilitarla por completo. Esto puede hacerse eliminando 'svg' de la lista de tipos MIME permitidos en 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'
Endurecimiento - Política de Seguridad de Contenido (CSP): Implemente un encabezado estricto de Política de Seguridad de Contenido (CSP) para la aplicación. Una CSP bien configurada puede evitar la ejecución de scripts en línea, lo que mitigaría el impacto de esta vulnerabilidad XSS.
Endurecimiento - Servir el contenido de usuario desde un dominio separado: Sirva todos los archivos subidos por los usuarios desde un dominio separado, sin cookies. Esta es una medida de seguridad altamente eficaz que aísla el contenido generado por el usuario de la aplicación principal, impidiendo que los scripts accedan a las cookies de sesión o interactúen con el DOM de la aplicación.
Este CVE fue divulgado de manera responsable siguiendo las prácticas de divulgación coordinada de vulnerabilidades. La información aquí proporcionada tiene fines educativos y defensivos únicamente.