
Il buffer overflow ICMP di FreeBSD, poc del buffer overflow di freebsd
Lo shellcode utilizzato di default è FreeBSD/x86-64 - execve - 28 bytes from Gitsnik; sostituiscilo con uno tuo per iniziare.
Il comando ping, utilizzato per richiedere un ICMP ECHO_RESPONSE da un host o gateway, viene invocato con un target IPv4, sia esso host IPv4 o gruppo multicast IPv4, tramite il datagramma ECHO_REQUEST del protocollo ICMP. Il datagramma ECHO_REQUEST è composto da un header IP e ICMP, seguito da una "struct timeval" e da un numero variabile di byte "pad" per riempire il pacchetto.
Come da advisory di sicurezza del FreeBSD Project, il comando ping recupera i pacchetti IP grezzi dalla rete per elaborare le risposte all'interno della funzione pr_pack(). Durante l'elaborazione della risposta, ping ricostruisce l'header IP, l'header ICMP e, se presente, un "quoted packet" che rappresenta il pacchetto che ha causato l'errore ICMP. Il "quoted packet" include anche un header IP e un header ICMP.
La funzione pr_pack() copia gli header IP e ICMP ricevuti nei buffer dello stack per un'ulteriore elaborazione. Tuttavia, non tiene conto della possibilità che header di opzioni IP seguano l'header IP, sia nella risposta che nel "quoted packet". In presenza di opzioni IP, pr_pack() fa overflow del buffer di destinazione fino a 40 byte.
Il comando ping gira in userspace e, quando viene invocato il comando ping, viene eseguito il binario situato in /sbin/ping. Il codice sorgente dell'utility è disponibile pubblicamente nel sorgente di FreeBSD. La funzione vulnerabile, pr_pack(), stampa le informazioni di risposta del pacchetto ICMP su stdout in un formato stringa, ad esempio "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."

Il pacchetto ICMP, sia nella richiesta che nella risposta, comprende header IP con un campo Options opzionale, come illustrato nel diagramma sopra. In un attacco malevolo, queste opzioni IP sono abilitate e riempite con byte non nulli.
Se un pacchetto ICMP è malformato o viene deliberatamente manomesso durante il percorso verso l'host di destinazione, e se le opzioni IP sono abilitate nella richiesta echo originale, la funzione pr_pack() non riesce ad allocare spazio sufficiente sullo stack per ospitare la presenza delle opzioni IP, causando un overflow dello stack.
In questi casi di errore, la risposta dell'host di destinazione può includere anche un "quoted packet" nella sezione dati, che identifica il pacchetto specifico che ha causato l'errore ICMP. La funzione pr_pack() fa overflow dello stack quando il "quoted packet" include header ICMP.