¿Los websockets son seguros o no?

wikipedia parece infir que los websockets son seguros:

Para compatibilidad con navegadores web, se implementa una versión segura del protocolo WebSocket en Firefox 6 (llamado MozWebSocket), [2] Google Chrome 14 [3] e Internet Explorer 10 preview. … Aunque no se conocen exploits, se deshabilitó en Firefox 4 y 5 …

pero w3 dice que son inseguros:

Seguir los procedimientos HTTP aquí podría presentar serios problemas de seguridad en el contexto de un navegador web. Por ejemplo, considere un host con un servidor WebSocket en una ruta y un redirector HTTP abierto en otra. De repente, cualquier script que se le pueda asignar a un URL de WebSocket en particular puede engañarse para que se comunique (y potencialmente compartir secretos) con cualquier host en Internet, incluso si el script verifica que el URL tenga el nombre de host correcto.

  1. son http websockets (ws 🙂 seguras o no?

  2. son https websockets (wss 🙂 seguras o no?

  3. si no es el # 2, ¿existen medidas profilácticas documentadas?

Hay muchos aspectos diferentes a la seguridad de WebSocket.

El snippit de la wikipedia que citó hace referencia al enmascaramiento del cliente WebSocket a los datos del servidor. Esto es para proteger a los intermediarios que se portan mal (por ejemplo, proxies y cachés) de interpretar accidentalmente el tráfico WebSocket como tráfico HTTP normal. El peligro aquí es que el protocolo WebSockets podría usarse para envenenar el intermediario de almacenamiento en caché. Sin embargo, debo señalar que esto era una preocupación puramente teórica, pero era motivo de preocupación que Mozilla y Opera se mostraran reacios a enviar las versiones Hixie y HyBi tempranas del protocolo WebSocket. Entonces, el IETF decidió agregar un cliente al enmascaramiento del servidor de los datos para abordar el problema.

Como un aparte, el IETF es responsable del protocolo WebSocket (IETF 6455) mientras que el W3C es responsable de la API WebSocket de HTML5 (el objeto Javascript, métodos y eventos).

Otro aspecto de la seguridad de WebSocket es la seguridad de origen cruzado. El segundo snippit que citó de la especificación W3C WebSocket API está relacionado con la seguridad de origen cruzado. WebSockets admite conexiones de origen cruzado (a un host diferente del que se sirvió la página HTML). Esta advertencia dice que si se hubieran utilizado procedimientos HTTP de origen cruzado para WebSockets, esto abriría un gran vacío de seguridad. Sin embargo, el procedimiento de WebSocket es diferente precisamente por este motivo. Por un lado, el handshake y la respuesta de WebSocket están diseñados para que las conexiones WebSocket no puedan realizarse en un servidor HTTP que no admita conexiones WebSocket: el servidor debe firmar / manipular una clave en un WebSocket de manera específica y devolverlo en la respuesta de handshake. La segunda parte es que el navegador debe enviar un encabezado Origin como parte del handshake (esto indica de dónde se cargó originalmente el HTML / Javascript). Esto le permite al servidor elegir qué dominios permitirá originar conexiones WebSocket.

Finalmente, hay dos modos de conexión WebSocket: sin encriptar (ws: //) y encriptados (wss: //). El modo cifrado utiliza el cifrado TLS / SSL para encriptar todos los datos enviados al servidor y desde éste (incluido el saludo inicial y la respuesta). Este es el mismo mecanismo de cifrado utilizado para las conexiones HTTPS (y utiliza el mismo motor de cifrado en el navegador). Esto evita que terceros espíen los datos que se transfieren.

En realidad, solo vale la pena conocer dos versiones del protocolo WebSocket:

  • Hixie76 : esta versión del protocolo agregó seguridad de origen cruzado y hash / signing de encabezado. Sin embargo, debido a la forma en que se diseña el protocolo, es difícil agregar soporte para los servidores web existentes. Esta es la versión que actualmente admite iOS (con suerte iOS 6 finalmente se actualizará a IETF 6455)

  • IETF 6455 : Esta es la versión del protocolo WebSocket que fue estandarizada por el IETF en noviembre pasado (noviembre de 2011). Fue la culminación del trabajo del grupo de trabajo IETF HyBi (las iteraciones del protocolo previo a ello fueron etiquetadas HyBi XX). Esta es la versión admitida por las versiones actuales de Chrome y Firefox y también por IE 10 y pronto Opera.

La versión hixie-76 del protocolo WebSocket es más segura que las versiones anteriores, y la versión hybi-07 es aún más segura. En la versión hixie-76 se agrega protección contra solicitudes falsas . En la versión hybi-07 se agrega máscara de mensaje .