
CVE-2022-23093 FreeBSD overflow basato sullo stack
⚠️ Il shellcode utilizzato per impostazione predefinita è FreeBSD/x86-64 - execve - 28 bytes da Gitsnik modificalo e inserisci il tuo per avviare ⚠️
L'utilità ping, utilizzata per richiedere un ICMP ECHO_RESPONSE da un host o gateway, viene invocata con un target IPv4, sia IPv4-host che IPv4-mcast-group, attraverso il datagramma ECHO_REQUEST obbligatorio del protocollo ICMP. Il datagramma ECHO_REQUEST consiste in un header IP e ICMP, seguito da un "struct timeval" e da un numero variabile di byte "pad" per riempire il pacchetto.
Secondo l'avviso di sicurezza del FreeBSD Project, l'utilità ping recupera pacchetti IP grezzi dalla rete per elaborare le risposte all'interno della funzione pr_pack(). Nell'elaborazione delle risposte, ping ricostruisce l'header IP, l'header ICMP e, se presente, un "pacchetto quotato" che rappresenta il pacchetto che ha causato l'errore ICMP. Il pacchetto quotato include anche un header IP e un header ICMP.
La funzione pr_pack() copia gli header IP e ICMP ricevuti in buffer dello stack per ulteriori elaborazioni. Tuttavia, non tiene conto della possibilità di header di opzioni IP che seguono l'header IP sia nella risposta che nel pacchetto quotato. In presenza di opzioni IP, pr_pack() sovraccarica il buffer di destinazione fino a 40 byte.
L'utilità ping viene eseguita nello spazio utente e, invocando il comando ping, viene eseguito il binario situato in /sbin/ping. Il codice sorgente dell'utilità è disponibile pubblicamente nei sorgenti di FreeBSD. La funzione vulnerabile, pr_pack(), stampa le informazioni di risposta del pacchetto ICMP su stdout in formato stringa, come "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."
✔️ Il pacchetto ICMP, sia in richiesta che in risposta, comprende header IP con un campo Opzioni opzionale, come illustrato nel diagramma sopra. In un attacco malevolo, queste Opzioni IP vengono abilitate e riempite con byte non nulli. ✔️
Se un pacchetto ICMP è malformato o deliberatamente manomesso durante il percorso verso l'host di destinazione e le Opzioni IP sono abilitate nella richiesta echo originale, la funzione pr_pack() non riesce ad allocare spazio sufficiente nello stack per ospitare la presenza delle Opzioni IP, causando un overflow dello stack.
🤝 In questi casi di errore, la risposta dall'host di destinazione può anche includere un "pacchetto quotato" nella sezione dati, identificando il pacchetto specifico che ha causato l'errore ICMP. La funzione pr_pack() sovraccarica lo stack quando il pacchetto quotato include header ICMP. 🤝