¿Qué medidas deben tomarse para autenticar de forma segura el tráfico web a una conexión WebSocket?

3

Obviamente, TLS es una necesidad para cualquier autenticación segura. Por favor, cambia tu configuración de paranoia hasta 11 para esto.

Antecedentes : (En caso de que las personas no estén familiarizadas con el protocolo WebSocket (WS) y sus idiosincrasias) La conexión WebSocket TLS (WSS) es una conexión diferente de la conexión HTTP TLS. Esto significa que uno no puede autenticar automáticamente al otro. Debido a los proxies, especialmente a uno malicioso que realiza un ataque MitM, el simple hecho de tener la misma dirección IP remota (o incluso la misma ID de sesión) no garantiza que las dos conexiones sean del mismo navegador.

WS es una conexión TCP persistente con una API muy limitada en el lado del cliente que no permite inspeccionar los detalles de TLS para una conexión WSS. Está diseñado para funcionar bien con firewalls y proxies (no maliciosos) que restringen el tráfico a solo el tráfico HTTP, y es deseable debido a su ubicuidad en los navegadores web modernos.

En PHP, WS (típicamente) se implementa utilizando un script de línea de comandos (CLI), que ejecuta su propio servidor aceptando y administrando las conexiones de socket directamente, en lugar de estar mediado a través de un servidor HTTP. (Si hay un servidor HTTP involucrado, solo es para reenviar el tráfico después de la actualización exitosa, y se convierte en un proxy transparente para todos los propósitos después del protocolo de enlace). Por lo tanto, las superglobales típicas de PHP no tienen sentido en la CLI de PHP.

Es posible pasar cookies durante el protocolo de enlace de WS, incluido un ID de sesión. En PHP CLI, es posible (pero sin ganas) acceder a los datos de la sesión actual, incluso después de un cambio de estado provocado por el lado HTTP de las cosas, si conoce el ID de la sesión. Sin embargo, debido a que las cookies se pasan solo durante el protocolo de enlace de WS, el servidor WS no recibe notificaciones de cambios en las cookies, como el ID de sesión.

AJAX permanece autenticado a través de la conexión HTTPS, por supuesto, y estoy seguro de que hay una manera de aprovechar las solicitudes de AJAX para autenticar las conexiones WSS con el mismo navegador.

Ejemplo de secuestro de sesión : Alice inicia sesión en bob.com a través de medios HTTPS normales, pero tiene un proxy malicioso entre ellos, propiedad de Mallory, que ejecuta un ataque de espionaje de MitM que ha comprometido la sesión ID.

Mallory luego usa el ID de sesión en su propia cookie de sesión para conectarse al servidor WSS, que es donde me encuentro con mis problemas, porque no sé a quién diferenciar entre el navegador abierto y totalmente autenticado de Alice y el de Mallory. Navegador completamente diferente en una computadora completamente diferente.

Entonces, sabiendo que el ID de sesión es potencialmente inseguro, es un objetivo primordial y es inmutable una vez que se inicia la conexión WS, ¿cómo puedo autenticar que una conexión WSS determinada se está ejecutando en la misma instancia del navegador en la misma computadora que una conexión HTTPS dada?

Editar : una vez que se inicia la conexión HTTPS, Mallory no intenta interferir para evitar que se detecte. Por lo tanto, una vez que se establezca la TLS, la conexión HTTPS estará protegida de Mallory a partir de este punto en adelante, pero Mallory aún tendría el ID de sesión.

Justificación para este requisito de caso límite : estoy escribiendo software de código abierto WebSocket, por lo tanto no puedo hacer cumplir la protección de la ID de sesión a través de medios tales como asegurar que la cookie de sesión tenga el indicador de seguridad establecido. que el ID de sesión se regenera, etc., pero puede exigir que el implementador incluya un script de cliente que ayude a garantizar la autenticación en ambos medios.

    
pregunta Ghedipunk 30.07.2015 - 19:58
fuente

2 respuestas

2
  

La conexión WebSocket TLS (WSS) es una conexión diferente de la conexión HTTP TLS.

Se crea una conexión WebSocket enviando una solicitud HTTP que contiene el deseo de actualizar la conexión a WebSocket y al recibir una respuesta HTTP que otorga este deseo. A partir de ese momento, el protocolo WebSocket se habla dentro de la conexión HTTP actualizada.

Esto significa que las propiedades de seguridad comunes de HTTP todavía se pueden usar con WS, es decir, cosas como la autenticación básica o la verificación de la identidad del par contra una cookie de sesión dada por un inicio de sesión anterior.

También significa que las propiedades de seguridad de TLS se pueden usar como con las conexiones HTTPS normales. Al igual que HTTPS, que se habla HTTP dentro de una conexión TLS, WSS es WS dentro de una conexión TLS. Esto también significa que la prevención de ataques de intermediarios mediante la validación de los certificados se realiza exactamente de la misma manera que con HTTPS, ya que cada conexión WSS comienza como una conexión HTTPS.

Si te entiendo bien, consideras que Mallory maneja un ataque de hombre en el medio contra la conexión al menos una vez. Si Mallory puede hacer esto, debe ser capaz de administrar la conexión TLS en el medio y, en este caso, el juego termina de todos modos, sin importar si se usa WebSockets o no. Si, en cambio, Mallory obtiene la información de una conexión que no es TLS (es decir, HTTP no HTTPS), tiene un error de diseño en su aplicación si utiliza datos de autorización no protegidos para la autorización dentro de conexiones seguras, sin importar si es HTTPS o WSS. Y ningún TLS u otros métodos pueden hacer que la información de autorización comprometida sea mágicamente segura de usar nuevamente.

    
respondido por el Steffen Ullrich 30.07.2015 - 21:19
fuente
1

Creo que su premisa es errónea. Alice no inicia sesión en bob.com a través de los medios HTTPS normales, porque Alice ve el error de certificado no válido y decide inteligentemente no ingresar sus credenciales. Si Alice decide ignorar la advertencia y proceder de todas formas, ahora tiene el mismo problema que tendría en cualquier sitio de seguridad o de finanzas. Sus credenciales pueden haber sido comprometidas junto con todos los datos a los que tiene acceso.

Si un ataque MITM está falsificando la conexión del navegador para comenzar, no hay forma de que su servidor note la diferencia. El spoofer puede hacer que la solicitud parezca lo que quiera.

Para asegurarse de que la ID de sesión sea segura, lo mejor que puede hacer al final es asegurarse de que la conexión esté encriptada, luego permitir el inicio de sesión y luego, después de autenticar al usuario, generar la ID de sesión. Pero todavía tendrá que esperar que un usuario con un error de certificado debido a un ataque MitM no inicie sesión.

    
respondido por el TTT 30.07.2015 - 20:36
fuente

Lea otras preguntas en las etiquetas