Was/is there a reason for a host to receive a packet larger than 84 byte total?
Ci sono diversi livelli coinvolti qui, e questa è la prima parte del problema. Gli 84 byte di ICMP per l'intestazione di un messaggio ping (il carico utile può essere maggiore ... puoi inserire tutto ciò che desideri nel campo del payload) significa che i pacchetti devono essere ricevuti dal sistema sul protocollo filo, riassemblati nel più grande pacchetto sul protocollo IP se c'è frammentazione, passato al livello ICMP che poi controllerà il tipo di protocollo e solo dopo tutto sarà possibile controllarlo.
Ci sono molti posti in cui scrivere codice per allocare memoria che puoi commettere errori lungo il percorso. Ad esempio, poiché non è possibile ottenere più di 64k di dati in un pacchetto IPv4 valido, è possibile allocare un buffer di memoria da 64k. Quindi quando assemblate i frammenti, potreste avere problemi se non controllate che la somma dei frammenti sia inferiore alla dimensione della memoria allocata. Un errore specifico è stato affidamento sull'intestazione della lunghezza dell'ultimo frammento possibile come sempre valido all'interno dell'intero pacchetto riassemblato anche se il pacchetto di offset massimo non poteva essere a dimensione intera senza rompere le cose.
Quindi non è possibile eliminare immediatamente la maggior parte dei pacchetti senza riassemblarli. È possibile aggiungere un controllo di corrispondenza sull'ultima dimensione del pacchetto ( if offset > x and offset * 8 + len(y) > 64k
), ma ciò richiederebbe il controllo di bit aggiuntivi nel pacchetto che è realmente adatto solo ai livelli del firewall e dell'host.