Sé que esta pregunta parece muy tonta, pero me ha estado molestando por un tiempo y no puedo dar una respuesta por mi cuenta. Así que, aquí va ...
Los paquetes en el protocolo TLS consisten en un encabezado de 5 bytes seguido de datos que se cifran una vez que se realiza el protocolo de enlace. El encabezado de 5 bytes siempre se transmite en claro y también contiene un campo de longitud de 2 bytes.
Ahora, el atacante MiTM solo puede modificar el campo de longitud solo en el encabezado, por lo que la parte receptora termina esperando una gran cantidad de datos, incluso después de recibir la cantidad real de bytes enviados originalmente por el interlocutor. Por ejemplo: digamos que el lado igual ha enviado un paquete de 20 bytes, y el atacante MiTM simplemente modifica el campo de longitud del encabezado para que sea de 65535 bytes. Ahora, si el interlocutor no envía otros datos, la parte receptora esperará indefinidamente para recibir los 65515 bytes (65535-20) que nunca se enviaron en primer lugar.
El TLS incluye el encabezado en el cálculo de MAC, por lo que cualquier manipulación del encabezado dará lugar a un fallo y al cierre efectivo de la conexión. Pero, ¿cómo se resuelve el caso de bloqueo en socket para recibir datos?
El receptor puede evitarlo mediante el uso de sockets no bloqueadores con select (nuevamente, la selección debería tener un tiempo de espera) o el uso del timeout con sockets. Pero, ¿qué tal el caso de bloqueo de sockets? ¿Hay alguna forma de evitar el bloqueo del lado receptor en el zócalo?