¿Deben las aplicaciones web que usan websockets (...) incluir nonces verificados por el servidor en cada transmisión para evitar el CSRF?
TL; DR: Esto es deseable, aunque no necesariamente en cada transmisión (una vez por conexión debería ser suficiente) y no para prevenir CSRF, sino XSS. Sin embargo, esto es más una garantía que una necesidad estricta. Detalles a continuación.
Para responder si WebSockets es o no vulnerable a CSRF, primero debemos entender las condiciones que permiten tales ataques a tener lugar:
- El usuario se autentica en un dominio, generalmente mediante una cookie de sesión;
- Existe uno o más tipos de solicitud HTTP que, cuando es realizada por un usuario autorizado, tendrá algún tipo de efecto secundario;
- Debido a las excepciones a la la misma política de origen , un sitio que generalmente no debería ser se le permite hacer una solicitud determinada, y el agente de usuario incluye cookies de autenticación / autorización en esa solicitud.
Por ejemplo, cuando el sitio A incluye una etiqueta img
con src
apuntando al dominio B, el agente de usuario respeta la solicitud, pasando cualquier cookie que esté configurada para el dominio B. ¿Cuál es el uso de un token CSRF secreto? El objetivo es que parte de los datos de autenticación se incluyen en la propia URL , por lo que un atacante que no conoce el token no puede falsificar una URL que será aceptada por el servidor (ya que esta parte de la autenticación fallará).
AFAIK WebSockets puede abrir conexiones a cualquier servidor y puerto (descargo de responsabilidad: la referencia utilizada en la publicación vinculada puede estar desactualizada ). Pueden tener sus propias cookies (aunque no las mismas que usan las páginas HTTP, ya que el esquema es diferente) y, si mi interpretación de RFC6455 es correcto: estas cookies se enviarán junto con la solicitud de conexión independientemente del sitio que inició la solicitud (aunque el servidor puede rechazar las solicitudes provenientes de un origen diferente) ). Si estas cookies proporcionan todas la autenticación necesaria para cumplir con la solicitud, entonces el servidor cumplirá con la solicitud.
Entonces, para determinar si se puede realizar un ataque CSRF basado en WebSocket, estas preguntas deben ser consideradas (aunque me temo que no puedo darles una respuesta definitiva):
- ¿Su servidor está configurado correctamente para aceptar solo solicitudes de orígenes de confianza? ¿Se puede falsificar el origen (en este contexto)?
- ¿Puede suceder una conexión WebSocket fuera del contexto de una llamada de JavaScript, por ejemplo, creando una URL con
ws
o wss
como esquema y usándola como src
o href
de un elemento de marcado? ¿Tendría eso algún efecto secundario indeseable? Sé que es una tontería, pero como no tengo una respuesta a esta pregunta, no obstante, debo plantear la posibilidad ...
- ¿Cómo se realiza su autenticación y autorización? Según esta publicación (que también destaca otros posibles problemas, no está directamente relacionado con CSRF) no hay nada integrado, por lo que debe implementarlo usted mismo. Dependiendo de cómo lo hagas y de las suposiciones que hagas sobre el comportamiento del agente de usuario, esto te abrirá para los ataques XSS (lo que, aunque es estrictamente diferente al CSRF, está relacionado en el sentido de que el navegador sería utilice su autoridad para establecer cookies de autenticación en contextos que sean diferentes de los que usted esperaba (de forma correcta o incorrecta).