¿Hubo / hay una razón para que un host reciba un paquete de más de 84 bytes en total?
Hay varias capas involucradas aquí, y esa es la primera parte del problema. Los 84 bytes de ICMP para un encabezado de mensaje de ping (la carga útil puede ser mayor ... puede poner lo que quiera en el campo de carga útil) significa que el sistema debe recibir los paquetes en el protocolo de conexión, que debe volver a ensamblarse en el más grande paquete en el protocolo IP si hay fragmentación, se pasa a la capa ICMP que luego verificará el tipo de protocolo y solo después de todo eso se puede verificar en detalle.
Al escribir código para asignar memoria, hay muchos lugares donde puedes cometer errores en el camino. Por ejemplo, como no puede obtener más de 64k de datos en un paquete válido de IPv4, puede asignar un búfer de memoria de 64k. Luego, cuando ensambla los fragmentos, es posible que tenga problemas si no verifica que la suma de los fragmentos sea menor que el tamaño de memoria asignado. Una falla específica realizada fue confiar en el encabezado de longitud del último fragmento posible como siempre válido en todo el paquete reensamblado, aunque no se permitió que el paquete de compensación máxima fuera de tamaño completo sin romper las cosas.
Por lo tanto, no puede eliminar inmediatamente la mayoría de los paquetes sin volver a ensamblar. Podría agregar una verificación de coincidencia en el último tamaño del paquete ( if offset > x and offset * 8 + len(y) > 64k
), pero eso requeriría verificar los bits adicionales en el paquete, lo que en realidad solo es adecuado en los niveles del servidor de seguridad y del servidor.