mediumCWE-434A04:2021

Discrepancia de Tipo MIME

Validar el tipo de archivo solo por extension en vez de contenido permite a los atacantes subir archivos maliciosos con extensiones renombradas, bypasseando controles de seguridad.

Cómo Funciona

Muchas aplicaciones verifican tipos de archivo mirando la extension (.jpg, .pdf) o el header Content-Type enviado por el navegador. Ambos pueden ser falsificados trivialmente. Un atacante puede renombrar malware.exe a invoice.pdf o configurar el Content-Type como image/jpeg para un web shell PHP. El servidor acepta el archivo pensando que es seguro. Cuando el archivo se sirve o procesa despues, el contenido real determina el comportamiento — un archivo PHP con extension .jpg puede aun ejecutarse si el servidor esta mal configurado. La validacion correcta requiere leer los magic bytes del archivo (los primeros bytes que identifican el formato) para determinar el tipo de contenido real.

Código Vulnerable
app.post('/upload', upload.single('doc'), (req, res) => {
  const ext = path.extname(req.file.originalname).toLowerCase();
  const allowed = ['.pdf', '.docx', '.xlsx'];
  if (!allowed.includes(ext)) {
    return res.status(400).json({ error: 'Invalid file type' });
  }
  // File accepted based on extension only
  res.json({ url: `/docs/${req.file.filename}` });
});
Código Seguro
const { fileTypeFromBuffer } = require('file-type');
app.post('/upload', upload.single('doc'), async (req, res) => {
  const buffer = fs.readFileSync(req.file.path);
  const type = await fileTypeFromBuffer(buffer);
  const allowed = ['application/pdf',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
  if (!type || !allowed.includes(type.mime)) {
    fs.unlinkSync(req.file.path);
    return res.status(400).json({ error: 'Invalid file type' });
  }
  res.json({ url: `/docs/${req.file.filename}` });
});

Ejemplo Real

En 2019, WhatsApp tenia una vulnerabilidad (CVE-2019-11931) donde los atacantes enviaban archivos MP4 especialmente construidos que en realidad eran payloads de exploit. El cliente validaba la extension pero no el contenido, permitiendo ataques de buffer overflow que podian ejecutar codigo arbitrario en el dispositivo del receptor.

Cómo Prevenirlo

  • Usa la libreria file-type para detectar el tipo real del archivo desde los magic bytes
  • Nunca confies en extensiones de archivo o headers Content-Type enviados por el cliente
  • Elimina archivos inmediatamente si la validacion de contenido falla
  • Configura el header X-Content-Type-Options: nosniff para prevenir MIME sniffing del navegador

Tecnologías Afectadas

Node.jsPythonJavaPHPGo

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas