mediumCWE-208A02:2021

Ataque Basado en Tiempo

Usar comparacion de strings estandar (=== o ==) para secretos como API keys o tokens permite a los atacantes adivinar valores caracter por caracter midiendo diferencias en el tiempo de respuesta.

Cómo Funciona

Los operadores estandar de comparacion de strings verifican caracteres secuencialmente y retornan false en el primer mismatch. Esto significa que comparar 'AAAA' contra 'ABCD' toma menos tiempo que comparar 'ABCA' contra 'ABCD' porque la primera comparacion falla en el caracter 2 mientras la segunda falla en el caracter 4. Midiendo tiempos de respuesta con precision de microsegundos, un atacante puede determinar cuantos caracteres iniciales son correctos. Hacen fuerza bruta un caracter a la vez: prueban todas las posibilidades para el primer caracter, mantienen el que tenga el tiempo de respuesta mas largo, luego pasan al segundo caracter. Un token de 32 caracteres que tomaria miles de millones de anos en fuerza bruta puede ser crackeado en minutos con ataques de timing.

Código Vulnerable
app.post('/api/webhook', (req, res) => {
  const signature = req.headers['x-webhook-signature'];
  const expected = computeHmac(req.body, SECRET);
  if (signature !== expected) {
    return res.status(401).json({ error: 'Invalid signature' });
  }
  processWebhook(req.body);
  res.json({ ok: true });
});
Código Seguro
const crypto = require('crypto');
app.post('/api/webhook', (req, res) => {
  const signature = req.headers['x-webhook-signature'];
  const expected = computeHmac(req.body, SECRET);
  const sigBuf = Buffer.from(signature, 'hex');
  const expBuf = Buffer.from(expected, 'hex');
  if (sigBuf.length !== expBuf.length ||
      !crypto.timingSafeEqual(sigBuf, expBuf)) {
    return res.status(401).json({ error: 'Invalid signature' });
  }
  processWebhook(req.body);
  res.json({ ok: true });
});

Ejemplo Real

En 2014, investigadores demostraron ataques de timing practicos contra implementaciones de OAuth HMAC en multiples frameworks web. Al enviar miles de requests y analizar estadisticamente los tiempos de respuesta, recuperaron secretos HMAC usados para verificar firmas de API, habilitando acceso completo a la API sin credenciales validas.

Cómo Prevenirlo

  • Usa crypto.timingSafeEqual() para todas las comparaciones de secretos en Node.js
  • Siempre compara buffers de igual longitud para evitar filtrar informacion de longitud
  • Usa librerias de verificacion basadas en HMAC que manejen comparacion de tiempo constante internamente
  • Agrega delays aleatorios en las respuestas de fallos de autenticacion para oscurecer aun mas el timing

Tecnologías Afectadas

Node.jsPythonJavaGoC#

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas