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.
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 });
});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
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Condicion de Carrera en Pagos
highOperaciones de lectura-modificacion-escritura en pagos sin transacciones de base de datos permiten a los atacantes explotar ventanas de tiempo y gastar el mismo saldo multiples veces.
Manipulacion de Precios
criticalAceptar precios del cliente en vez de buscarlos del lado del servidor permite a los atacantes modificar requests de checkout y comprar productos al precio que elijan.
Feature Flags Expuestos
lowFeature flags incluidos en el bundle de JavaScript del frontend revelan funciones no lanzadas, configuraciones internas de testing y superficies de ataque potenciales a cualquiera que inspeccione el codigo.
Rutas de Debug en Produccion
mediumRutas de desarrollo y testing como /debug, /test, /seed o /api/dev dejadas activas en produccion exponen datos internos, bypassean autenticacion o permiten manipulacion de estado.