# Ping of Death

Il Ping of Death (abbreviato PoD) è un tipo di attacco Denial of Service che consiste nell'invio di un pacchetto IP malformato ad un computer bersaglio per causare buffer overflow con conseguente blocco del servizio o, nei casi più gravi, crash del sistema.
L'attacco sfruttava una vulnerabilità presente nella gestione del protocollo IP su computer Windows, Unix, Mac e in altri dispositivi collegabili in rete come router e stampanti.
Tale vulnerabilità è stata risolta nella maggior parte dei sistemi tra il 1997 e il 1998.

## Informazioni dettagliate

L'attacco consisteva nell'utilizzare messaggi IP frammentati in modo maligno, veicolati tipicamente sotto forma di pacchetti di ping (interrogazione tra computer per verificare la raggiungibilità reciproca), da cui il nome, anche se il meccanismo di attacco non dipende dallo specifico protocollo utilizzato.
Generalmente un computer non è in grado di gestire un pacchetto di dimensioni superiori a quella prevista dallo standard RFC 791 che prevede l'allocazione di 16 bit nell'header per indicare la lunghezza massima del pacchetto, pari quindi a $(2^{16}-1)$ = 65535 byte. Contenuti informativi di dimensioni superiori vengono frazionati e trasmessi su più pacchetti IP.
A sua volta, il pacchetto IP viene trasmesso attraverso il livello datalink, che prevede una dimensione massima dei frame trasmessi a questo livello. Nel caso del datalink in tecnologia Ethernet tale dimensione massima è pari a 1518 byte. Anche in questo caso, contenuti informativi di dimensioni superiori vengono scomposti in frammenti compatibili con la dimensione massima trasmissibile, per venire poi ricomposti dalla macchina ricevente per ricostruire il pacchetto originale con un processo ricorsivo.
Per consentire la ricostruzione corretta, ogni frammento di un messaggio IP deve contenere l'informazione relativa alla porzione di pacchetto originale trasportata. Questa informazione è contenuta nel campo di offset del frammento, presente nell'intestazione IP. La dimensione di questo campo è di 13 bit, ciò consente di stabilire che in caso di trasmissione di un pacchetto di dimensione massima, l'ultimo pacchetto frammentato può presentare un offset massimo di $(2^{13}-1)$= 8191 (L'offset nel header ip è espresso in unità di 8 byte, quindi quello massimo è pari a 8191*8=65528 byte), a questo offset può corrispondere un frammento utile di lunghezza massima pari a 65535-65528=7 byte.
Il pacchetto malintenzionato viene costruito generando proprio un frammento IP con valore di offset massimo ma con una quantità di dati associata pari o superiore ad otto byte: questo, in fase di ricostruzione del pacchetto IP, porta ad ottenere una trama di dimensione superiore a quella consentita dal livello di rete ossia superiore a 65535 byte. Ciò potrebbe causare il sovraccarico del buffer utilizzato dal nodo ricevente per contenere il pacchetto (buffer overflow), causando il blocco del servizio. La vulnerabilità è legata quindi al meccanismo di riassemblaggio dei frammenti IP maliziosi, che potrebbero in teoria contenere qualunque tipo di protocollo (TCP, UDP, IGMP, ecc) e non solo messaggi di ping.
La soluzione al problema consiste nell'aggiunta di controlli durante il processo di riassemblaggio. Il controllo di ogni singolo frammento in entrata assicura che la somma dei campi offset e lunghezza totale non superi 65535 byte. Se la somma risulta più grande, il pacchetto viene riconosciuto come illegale e viene scartato.
Nei computer nei quali tale vulnerabilità non è stata risolta, questo controllo viene effettuato da un firewall.
Una soluzione alternativa al problema consiste nell'estendere il buffer per il riassemblaggio del pacchetto, in modo tale che la ricezione di un pacchetto malevolo o malformato di dimensione superiore a 65535 byte non provochi l'overflow del buffer ed evitando quindi il blocco del servizio. Questa soluzione non viola lo standard, in quanto pacchetti di dimensione superiore al massimo consentito, se ricevuti, vengono comunque scartati.