Ping della morte! FreeBSD risolve un bug crashtastic nello strumento di rete PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Ping di morte! FreeBSD corregge bug crashtastic nello strumento di rete

Uno dei primi strumenti di rete di basso livello di cui viene a conoscenza qualsiasi utente di computer è il venerabile ping utilità.

Prende il nome dall'omonimo effetto sonoro di qualsiasi scena di film di guerra della vecchia scuola che coinvolge sottomarini, il comando è un'eco metaforica (vedi cosa abbiamo fatto lì?) Della versione subacquea di RADAR nota come SONAR.

Invii un ping (più simile a un rumore doinnnng, in la realtà) nelle profondità salmastre, e misurando quanto tempo impiega la sua inquietante eco a tornare da te, e stimando la velocità del suono nell'oceano circostante, puoi calcolare la distanza dall'oggetto che ha prodotto l'eco.

Curiosamente, dato che probabilmente hai sentito l'abbreviazione TCP/IP usata come descrizione generica del collante del protocollo che alimenta Internet, ping tecnicamente non utilizza affatto TCP/IP.

Infatti, TCP/IP è l'abbreviazione di protocollo di controllo della trasmissione sul protocollo Internete si riferisce a un meccanismo di livello piuttosto elevato per l'invio di dati su Internet in modo tale che la rete stessa inserisca molti dei "ha funzionato davvero correttamente?" fatica per te.

Ad esempio, nelle connessioni TCP, tutti i blocchi di dati che invii sono garantiti per arrivare intatti all'altra estremità o per causare un errore in modo da sapere che non ce l'hanno fatta.

Inoltre, anche se diversi blocchi di dati finiscono per prendere percorsi diversi su Internet (ad esempio a causa del bilanciamento del carico, interruzioni temporanee o altri errori recuperabili) e anche se alcuni blocchi impiegano più tempo ad arrivare rispetto ad altri, i dati TCP verranno correttamente bufferizzati e presentato nell'ordine giusto all'altra estremità.

Il ping è diverso

Il ping Il comando, tuttavia, viene in genere utilizzato per verificare se un computer che ti interessa è online, soprattutto se non accetta il tipo di connessioni TCP di alto livello che ti aspetteresti, come ricevere e-mail o consentire accessi SSH.

Questo ti aiuta rapidamente a determinare se è probabile che un'interruzione sia dovuta alla rete o al server stesso che non funziona o se i singoli servizi in esecuzione su quel server non si avviano correttamente.

Come risultato, ping utilizza un protocollo di livello molto inferiore rispetto a TCP.

Anzi, ping non usa nemmeno il cugino più casual di TCP UDP, abbreviazione di protocollo datagramma utente, che è un modo per trasmettere blocchi di dati che è veloce e facile, ma è comunemente chiamato send-and-hope (o, se sei un tipo cinico, come spray-and-pray).

Lo stesso UDP non ti informa se i tuoi dati sono arrivati ​​dall'altra parte o meno, e anche se arrivano intatti, UDP non tiene traccia dell'ordine in cui i tuoi pacchetti sono stati originariamente inviati, quindi non può riorganizzarli a dall'altra parte se arrivano fuori sequenza.

Ping, per quello che vale, utilizza un protocollo di livello molto basso, appositamente progettato per la risoluzione dei problemi e la riconfigurazione della rete, noto come ICMP, o protocollo di messaggio di controllo Internet.

Tipicamente gestito direttamente nel kernel del sistema operativo, in modo che i pacchetti ICMP/IP siano quasi certi di passare anche se nessun software di rete di livello superiore è stato installato correttamente, ICMP include in particolare due tipi di messaggi speciali:

  • Digitare 0x08. Chiamato ufficialmente ICMP Echo, Questo sorta di pacchetto di solito è chiamato Echo Request. È quello che il ping programma invia per sondare i computer attivi sulla rete.
  • Digitare 0x00. Chiamato ufficialmente ICMP Echo Reply, questo tipo di pacchetto è esattamente quello che dice. Un computer attivo, online e non configurato per bloccare il traffico ICMP Echo dovrebbe inviare questo tipo di pacchetto direttamente al computer che lo ha richiesto.

Mi Piace

$ ping -c 3 -p 4E414B45445345435552495459 baresecurity.sophos.com PATTERN: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) byte di dati. 64 byte da 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 tempo=84.0 ms 64 byte da 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 tempo=85.1 ms 64 byte da 192.0.66.227. 192.0.66.227 (3): icmp_seq=53 ttl=84.8 time=3 ms --- statistiche ping news-sophos.go-vip.net --- 3 pacchetti trasmessi, 0 ricevuti, 2004% perdita di pacchetti, tempo 84.025ms rtt min/ medio/max/mdev = 84.644/85.062/0.446/XNUMX ms

Per vedere un ping in azione a un livello leggermente inferiore, useremo il codice Lua che puoi trovare alla fine dell'articolo per costruire un nostro pacchetto ICMP Echo e per leggere l'eventuale risposta che arriva:

$ sudo luax ping.lua baresecurity.sophos.com Invio richiesta ICMP ECHO a 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |.....Zo.PingRequ| 00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estMessaggio BB5A6| 00000020 46 31 44 |F1D | Sono tornato --> 00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |.........Zo.Ping| 00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |MessaggioRichiesta B| 00000030 42 35 41 36 46 31 44 |B5A6F1D |

A proposito, dovevamo usare sudo sopra per eseguire il nostro script con privilegi di superutente, perché abbiamo creato quello che è noto come a presa IP grezza - uno che può essere realizzato in qualsiasi formato sottostante che ci piace, inclusi TCP, UDP e, se necessario qui, ICMP.

Su molti sistemi Linux/Unix, il ping Il comando fornito dalla tua distribuzione funziona senza che vengano assegnati esplicitamente i privilegi di root, di solito perché è installato con speciali funzionalità di sicurezza o con il suo setuid flag impostato, il che significa che inizia con l'esecuzione con un account utente diverso rispetto all'utente che lo ha eseguito.

Ben progettato ping i programmi, ovviamente, scarteranno automaticamente i loro privilegi extra una volta che avranno aperto il raw socket di cui hanno bisogno.

Abbiamo omesso questo codice di eliminazione dei privilegi dal nostro script di esempio per motivi di brevità. Puoi usare il posix.unistd.setpid() funzione per passare a un account non privilegiato dopo aver creato il socket, ma prima di inviare o ricevere dati.

Esame della risposta

Come potresti riconoscere nel dump dei dati dal nostro script sopra, la funzione socket di rete che stiamo usando per rileggere i dati dal server che risponde include non solo i dati ICMP Echo Reply, ma anche l'IP di basso livello (intestazioni del protocollo Internet) nel pacchetto sottostante.

Non abbiamo provato ad analizzare o elaborare in altro modo questi dati, ma FreeBSD ping il programma deve farlo per dare un senso alla risposta, incluso dare un senso a eventuali messaggi di errore che ritornano.

Se l' ping viene rifiutato in qualche modo, Echo Reply includerà in genere non solo le proprie intestazioni IP (come visto sopra) ma anche una copia di riferimento delle intestazioni IP e dei dati ICMP che apparivano nella richiesta in uscita originale.

Le intestazioni dei pacchetti IPv4 di solito assomigliano molto a quelle che vedi sopra, dove iniziano le intestazioni IP 45 00 00 37... e continua per 20 byte in totale, fino a includere i byte mostrati come ...XX XX XX XX, che è l'indirizzo IP del mio laptop.

Mi Piace

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX |.... | Versione IP e lunghezza dell'intestazione: 0x45 (4 = IPv4, 5 = cinque parole da 32 bit, ovvero 20 byte Tipo di servizio e dati di congestione: 0x00 Lunghezza totale del pacchetto: 0x0037 (decimale 55) Informazioni sulla sequenza: F6 AF 00 00 Time-to -live (hop a sinistra): 0x35 (decimale 53) Tipo di protocollo: 0x01 (ICMP) Checksum: 0x947F (decimale 38015) Numero IP del computer che invia: C0 00 42 E3 (192.0.66.227 = baresecurity.sophos.com) IP del destinatario (mio laptop): XX XX XX XX (REDATTO = il mio numero IP)

FreeBSD ping i programmatori, a quanto pare, presumevano che le intestazioni di questo tipo sarebbero, in effetti, sempre lunghe esattamente 20 byte, in base a quel valore di lunghezza dell'intestazione nel primo byte di 0x45, che indica IPv4 (0x4?) con 5 DWORD (0x?5) o 20 byte, intestazione.

Con soli 20 byte di cui preoccuparsi, i programmatori hanno allocato buffer di dimensioni fisse sullo stack in cui potevano conservare una copia delle intestazioni IP nella risposta, più eventuali intestazioni IP incorporate dalla richiesta originale, se c'era una condizione di errore da gestire .

Puoi indovinare dove sta andando.

Quel primo byte nell'intestazione IPv4 può avere legalmente qualsiasi valore da 0x45 (la dimensione minima dell'intestazione di 5 DWORD o 20 byte, come mostrato) fino a 0x4F (che denota 15 DWORD, perché 0xF è decimale 15 o 60 byte di dati di intestazione in totale), consentendo così ordinatamente 40 byte extra opzionali di dati di intestazione.

Quei rari, ma legali, byte di intestazione extra possono essere usati per varie "caratteristiche" funky e insolite con nomi curiosi come Trasmissione diretta selettiva, Controllo di flusso sperimentale ed Pacchetto multicast a monte – cose di cui abbiamo sentito parlare ma che non abbiamo mai usato consapevolmente, né visto.

Fai attenzione ai criminali informatici che ti mettono alla prova

Come puoi immaginare, dato che quei campi extra non vengono quasi mai utilizzati, potresti non vedere mai un pacchetto IPv4 con qualcosa di diverso da 0x45 all'inizio e con 20 byte di dati di intestazione in totale, a meno che non ti imbatti in un gruppo di criminali informatici pronti a metterti alla prova.

Purtroppo, non c'è molto che possa impedire a un utente malintenzionato di truccare un server che indovina se stai usando FreeBSD e genera deliberatamente pacchetti ICMP/IP Echo Reply sovradimensionati per provocare un overflow del buffer dello stack dentro il tuo ping .

Se mai controlli per vedere se il loro server è attivo (cosa che potresti fare anche, o forse soprattutto, se pensi che sia sospetto!), potresti essere preso di mira da una trappola esplosiva.

Nel migliore dei casi, il tuo ping il programma andrà in crash; nel peggiore dei casi, tuttavia, come ammette generosamente l'avviso di sicurezza di FreeBSD, "potrebbe essere possibile che un host dannoso attivi l'esecuzione di codice remoto in ping."

Fortunatamente, come anche gli autori di FreeBSD indicare, "[l] il processo ping viene eseguito in una sandbox in modalità capacità su tutte le versioni interessate di FreeBSD ed è quindi molto limitato nel modo in cui può interagire con il resto del sistema nel punto in cui può verificarsi il bug."

In altre parole, devi assolutamente applicare una patch, ma i rischi possono essere considerati modesti.

In particolare, il ping il programma non solo è bloccato in una sandbox, ma non viene eseguito come root quando viene raggiunto il codice bacato, come confermato nell'avviso di sicurezza: "Quando ping viene eseguito, crea il raw socket necessario per svolgere il proprio lavoro e quindi revoca i suoi privilegi elevati.

Come descritto sopra, i poteri di superutente sono richiesti solo per acquisire un socket IP grezzo dal sistema operativo, non per utilizzare il sendto() ed recvfrom() funzioni su quel socket in seguito.

A questo bug è stato assegnato l'identificatore ufficiale CVE-2022-23093; è documentato nell'avviso di sicurezza FreeBSD-SA-22:15.ping.

Cosa fare?

  • Se sei un utente di FreeBSD, aggiorna semplicemente le versioni interessate (FreeBSD 12 e FreeBSD 13) alle loro versioni più recenti, dove questo bug è stato risolto.
  • Se sei un programmatore di rete, assicurati sempre di aver tenuto conto delle intestazioni dei pacchetti che potrebbero indicare variazioni di dimensioni insolite. Il fatto che tu non abbia mai visto alcuna variazione non ti impedisce di affrontare domani un pacchetto fuori dall'ordinario ma perfettamente legale.
  • Se sei un gestore di rete, prendere in considerazione il blocco dei pacchetti IPv4 con intestazioni IP di dimensioni inferiori a 20 byte. Se sembra davvero necessario consentire ad alcuni prodotti software di utilizzare opzioni di intestazione IPv4 insolite, prendere in considerazione la registrazione di quei pacchetti insoliti per scoprire perché.

Fai attenzione là fuori!


CODICE DI ESEMPIO PER DIMOSTRARE IL TRAFFICO PING


Timestamp:

Di più da Sicurezza nuda