highCWE-306A01:2021

WebSocket Sin Autenticación

Los endpoints WebSocket que aceptan conexiones sin verificar autenticación permiten que usuarios no autenticados reciban flujos de datos en tiempo real destinados a usuarios autenticados.

Cómo Funciona

Las requests HTTP se autentican por request mediante cookies o headers Authorization. Las actualizaciones WebSocket ocurren una sola vez — si no verificas la identidad del usuario durante el handshake de actualización, cualquier cliente que puede alcanzar el endpoint obtiene una conexión persistente. Una vez conectado sin auth, recibe cada mensaje broadcast enviado a ese canal.

Código Vulnerable
// MAL: servidor WebSocket sin verificación de autenticación en la conexión
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => {
  // sin verificación de auth — cualquier cliente obtiene un stream en tiempo real
  ws.send(JSON.stringify(await getPrivateFeed()));
});
Código Seguro
// BIEN: verifica el token de auth durante la actualización WebSocket
const wss = new WebSocketServer({ noServer: true });

httpServer.on('upgrade', async (req, socket, head) => {
  const token = new URL(req.url, 'ws://base').searchParams.get('token');
  const user = await verifyToken(token);
  if (!user) { socket.destroy(); return; } // rechaza actualizaciones no autenticadas
  wss.handleUpgrade(req, socket, head, (ws) => {
    wss.emit('connection', ws, req, user);
  });
});

Ejemplo Real

Varias plataformas de chat y trading en tiempo real han tenido vulnerabilidades WebSocket donde conectarse sin autenticación otorgaba acceso a los canales privados de otros usuarios. Las plataformas de trading son especialmente atacadas porque los datos de flujo de órdenes en tiempo real tienen valor financiero directo.

Cómo Prevenirlo

  • Autentica la conexión WebSocket durante el handshake de actualización HTTP — antes de que se establezca la conexión
  • Pasa un token de auth como parámetro de query o header sub-protocol durante la actualización ws://
  • Valida el token del lado del servidor y rechaza la actualización si es inválido (socket.destroy())
  • Asocia cada conexión WebSocket con un ID de usuario y filtra los mensajes broadcast para que los usuarios solo reciban sus propios datos

Tecnologías Afectadas

Node.jsjavascript

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas