highCWE-22A01:2021

Zip Slip

Extraer archivos ZIP sin validar las rutas permite a los atacantes crear archivos que escriben fuera del directorio destino, sobrescribiendo archivos criticos de la aplicacion.

Cómo Funciona

Zip Slip es una vulnerabilidad de travesia de ruta especifica de la extraccion de archivos. Un atacante crea un archivo ZIP donde las entradas tienen rutas como ../../etc/cron.d/backdoor o ../../../app/server.js. Cuando la aplicacion extrae el archivo sin verificar la ruta destino de cada entrada, los archivos se escriben fuera del directorio de extraccion esperado. Esto puede sobrescribir configuracion del servidor, inyectar codigo malicioso en la aplicacion o colocar web shells en directorios publicamente accesibles. La vulnerabilidad afecta formatos ZIP, TAR, JAR, WAR y otros formatos de archivo. Es especialmente peligrosa en pipelines CI/CD donde los archivos subidos se extraen automaticamente.

Código Vulnerable
const AdmZip = require('adm-zip');
app.post('/upload-zip', upload.single('archive'), (req, res) => {
  const zip = new AdmZip(req.file.path);
  zip.extractAllTo('uploads/extracted/', true);
  res.json({ message: 'Extracted successfully' });
});
Código Seguro
const AdmZip = require('adm-zip');
const path = require('path');
app.post('/upload-zip', upload.single('archive'), (req, res) => {
  const zip = new AdmZip(req.file.path);
  const targetDir = path.resolve('uploads/extracted/');
  for (const entry of zip.getEntries()) {
    const dest = path.resolve(targetDir, entry.entryName);
    if (!dest.startsWith(targetDir)) {
      return res.status(400).json({ error: 'Invalid archive path' });
    }
  }
  zip.extractAllTo(targetDir, true);
  res.json({ message: 'Extracted successfully' });
});

Ejemplo Real

Snyk descubrio la vulnerabilidad Zip Slip en 2018, afectando miles de proyectos en multiples ecosistemas. Proyectos importantes incluyendo Apache Spark, Spring Framework y Pinot de LinkedIn eran vulnerables. La vulnerabilidad permitia sobrescritura arbitraria de archivos en servidores que procesaban archivos subidos.

Cómo Prevenirlo

  • Valida que la ruta resuelta de cada entrada comience con el directorio de extraccion destino
  • Rechaza archivos que contengan entradas con secuencias ../ en sus rutas
  • Usa librerias que tengan proteccion contra Zip Slip integrada o que hayan sido parcheadas
  • Extrae archivos en contenedores aislados o entornos con sandbox

Tecnologías Afectadas

Node.jsPythonJavaPHPGo

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas