Cómo manejar un cierre SSL / TLS malicioso

3

El protocolo TLS especifica que se debe enviar un mensaje de cierre de nofify cada vez que uno de los interlocutores quiera cerrar la conexión. Esto evita un ataque de truncamiento que enviaría un mensaje TCP FIN como si el par lo hubiera enviado él mismo.

Por lo tanto, si la conexión se cierra sin recibir el mensaje de notificación de cierre, significa que un tercero malintencionado está enredado con nuestra conexión (ignoremos el hecho de que un interlocutor legítimo no realizaría el cierre correctamente)

Mi pregunta es: ¿qué debemos hacer en una situación así? ¿Significa que el último mensaje recibido está dañado y debe descartarse? ¿Es necesario revertir toda la sesión?

Tenga en cuenta que estoy pensando en una situación en la que estamos seguros de que la falta de notificación inmediata es malintencionada en lugar de una mala implementación de igual a igual. Tampoco estoy asumiendo un protocolo de aplicación específico.

    
pregunta Jacques 11.06.2015 - 20:05
fuente

1 respuesta

3

En la práctica, muchos servidores HTTPS ampliamente implementados cierran las conexiones de forma abrupta, sin previo aviso, y en particular sin el close_notify . Lo hacen porque quieren eliminar las conexiones que han estado inactivas durante mucho tiempo (por ejemplo, más de 30 segundos), y quieren hacerlo incluso si la conexión estaba inactiva porque el cliente se ha ido (por ejemplo, se ha caído o se ha retirado de ella). alcance del punto de acceso WiFi, o cualquier otra situación similar) y no reconocerá el close_notify .

Sería tecnológicamente factible que un servidor envíe un close_notify incluso a un cliente muerto, y aún así limpie los recursos correctamente, pero a muchos diseñadores de servidores les resulta más fácil simplemente no enviar el close_notify (esto permite mantener el Motor SSL y la gestión de socket por separado). Esto está en contradicción con el estándar TLS , pero sabemos que los desarrolladores del mundo real tienen una incógnita Habilidad para "recortar esquinas" cuando lo vean conveniente. Tenga en cuenta que TLS 1.1 y 1.2 reconocen la práctica generalizada de no enviar un close_notify , considerando que dicha falla no invalida la sesión de TLS en su totalidad (la sesión puede reanudarse con otras conexiones) ):

   close_notify
      This message notifies the recipient that the sender will not send
      any more messages on this connection.  Note that as of TLS 1.1,
      failure to properly close a connection no longer requires that a
      session not be resumed.  This is a change from TLS 1.0 to conform
      with widespread implementation practice.

Consecuencias no son necesariamente malas. El close_notify es necesario para la seguridad cuando el protocolo de la aplicación no es auto-terminado. Por ejemplo, con HTTP-0.9, el cliente sabe que se llegó al final del documento solicitado porque la conexión está cerrada; la falta de un close_notify significa que es posible un ataque de truncamiento (el atacante fuerza maliciosamente a que la conexión TCP se cierre "temprano"). Sin embargo, con HTTP-1.0 y versiones posteriores, los cuerpos de solicitud y respuesta tienen una Longitud de contenido explícita, o utilizan codificación de transferencia "fragmentada", que identifican inequívocamente el final del cuerpo. Para un protocolo de terminación automática como HTTP-1.0, el close_notify no es necesario para la seguridad.

Una situación en la que close_notify es absolutamente necesario es para protocolos que intercambian datos antes y después de la sesión SSL / TLS, en la misma conexión (la STARTTLS método). En ese caso, el cliente y el servidor no pueden enviarse datos de forma confiable a través de la conexión después del cierre de SSL si no marcaron el cierre con los mensajes close_notify .

Para resumir , puede formalmente reaccionar ante la falta de close_notify como un ataque continuo o un fallo de la red, pero si su protocolo de comunicación es auto-terminado , entonces simplemente puedes ignorar la falta de close_notify .

    
respondido por el Thomas Pornin 11.06.2015 - 21:13
fuente

Lea otras preguntas en las etiquetas