Il 31 marzo 2008 il progetto Wireshark ha rilasciato la versione 1.0, dieci anni dopo il primo 0.2.0 di Ethereal del luglio 1998. Il salto a 1.0 è la prima release dichiarata feature-complete. Sul piano della sicurezza pesa altro: un analizzatore di protocolli è anche, di fatto, un’enorme collezione di parser che leggono input controllato da terzi.

Contesto

Wireshark nasce come Ethereal, scritto da Gerald Combs dal 1997 per il troubleshooting di rete. Nel 2006 il progetto cambia nome: il marchio Ethereal era registrato dal precedente datore di lavoro di Combs e restava a loro, così la base di codice è ripartita sotto il nome Wireshark (mailing list ethereal-dev, annuncio del giugno 2006). Licenza GPL v2.

Funziona in due tempi: cattura e disseziona. Prende i pacchetti tramite libpcap (Linux, macOS, BSD) o WinPcap (Windows) e li scompone secondo le specifiche dei protocolli, in una vista gerarchica — Ethernet, poi IP, poi TCP o UDP, poi il protocollo applicativo. Alla 1.0 i protocolli riconosciuti sono nell’ordine del migliaio: dai fondamentali (IP, TCP/UDP, DNS, DHCP, HTTP) a SMB, SMTP/POP/IMAP, SIP e RTP per il VoIP, fino ai protocolli industriali e al wireless 802.11.

Il problema

A ogni protocollo riconosciuto corrisponde un dissector: codice che prende una sequenza di byte qualsiasi e ne ricostruisce la struttura. È lo schema da cui nascono le vulnerabilità di memoria. I byte arrivano dalla rete o da un file di cattura: non sono fidati, e il dissector deve dare per scontato che possano essere malformati apposta.

Non è teoria. Nei due anni prima della 1.0 il progetto ha pubblicato una sequenza continua di advisory su singoli dissector. Restando ai casi con CVE: un buffer overflow nel dissector PPP (CVE-2007-6112, versione 0.99.6), uno nel dissector ANSI MAP (CVE-2007-6115, dalla 0.99.5 alla 0.99.6), problemi nel dissector SSL e nel parser delle trace iSeries/OS400 (CVE-2007-6114). Lo schema si ripete sempre uguale: pacchetto o file di cattura confezionato ad arte, dissector che legge oltre i limiti, denial of service e in qualche caso esecuzione di codice.

La causa è strutturale: la superficie d’attacco cresce con la copertura. Più protocolli Wireshark capisce, più codice di parsing serve, più punti dove un controllo di lunghezza può saltare. E ogni dissector vede input ostile per definizione: chi analizza traffico sospetto sta deliberatamente dando in pasto al programma byte prodotti da un attaccante.

Architettura

La risposta strutturale è la separazione di privilegio, ed è il motivo per cui l’architettura di Wireshark al 2008 merita più attenzione del changelog.

Catturare traffico grezzo richiede privilegi elevati: mettere un’interfaccia in modo promiscuo è un’operazione che il sistema operativo riserva a root (o a un account con capability equivalenti). La via ingenua è far girare l’intero programma come root. Sarebbe la scelta peggiore, perché vorrebbe dire eseguire come root anche le centinaia di migliaia di righe di dissector — proprio il codice che legge input ostile e che storicamente ha avuto i bug.

Wireshark divide i due ruoli in processi distinti:

  • dumpcap è un programma piccolo e isolato che fa una cosa sola: apre l’interfaccia e legge i pacchetti. È l’unico componente che ha bisogno di privilegi.
  • L’interfaccia grafica (wireshark, GUI in GTK+) e la versione a riga di comando (tshark) ricevono i pacchetti da dumpcap e li dissezionano con privilegi di utente normale.

Il punto è questo: tutto il codice di dissezione — il codice grande, complicato, che lavora su byte ostili — non gira mai con privilegi elevati. Un overflow in un dissector resta confinato in un processo non privilegiato. Il dumpcap privilegiato è abbastanza piccolo da poterlo verificare a mano: cattura e basta, non interpreta i contenuti.

Intorno al nucleo c’è un corredo di strumenti a riga di comando che condividono l’engine di dissezione: editcap per filtrare e tagliare file di cattura, mergecap per unirli, capinfos per le statistiche, text2pcap per ricostruire un PCAP da un hexdump testuale. Tornano utili perché con tshark e questi accessori si può scriptare l’analisi senza GUI, su una macchina di cattura headless.

Punto critico

La separazione di privilegio non elimina i bug dei dissector: li declassa. Un buffer overflow in un parser resta un bug, e su un file di cattura malformato può ancora far crashare l’analisi o, nei casi peggiori, eseguire codice — ma nel contesto dell’utente che ha aperto il file, non di root.

Il rischio si sposta, non sparisce, e la conseguenza operativa è netta: aprire un file .pcap di provenienza ignota significa eseguire codice di parsing su dati ostili. Nell’incident response, dove i dump arrivano da sistemi compromessi e possono essere stati manipolati, la regola sensata è trattare l’analisi come un’operazione potenzialmente pericolosa — macchina dedicata, utente senza privilegi, versione aggiornata. La stessa logica che si applica all’apertura di un allegato sospetto vale per l’apertura di una cattura sospetta.

Implicazioni

Wireshark è scomodo da maneggiare per un secondo motivo, che ne spiega anche la presenza da anni nelle demo dei corsi di rete. La cattura passiva su traffico non cifrato vuol dire vedere in chiaro tutto ciò che non è cifrato. Le credenziali di POP3, IMAP e SMTP senza TLS, le sessioni HTTP, i cookie: li legge chiunque condivida il segmento di rete e sappia mettere l’interfaccia in modo promiscuo.

Mostrarlo una volta a uno studente vale più di una lezione sull’importanza del trasporto cifrato. Poter osservare il traffico è una delle ragioni storiche concrete per cui si è passati a cifrare ovunque, anche dove il contenuto sembrava innocuo. Wireshark rende quella minaccia tangibile in trenta secondi.

Lo strumento è dual-use per natura. Sul piano tecnico la cattura passiva del sysadmin che debugga la propria rete è identica a quella di chi intercetta una rete altrui. L’uso legittimo è una questione di autorizzazione, non di funzionalità: serve un mandato esplicito sulla rete analizzata, e se la cattura contiene dati personali i PCAP vanno anonimizzati prima di condividerli per supporto o didattica.

Limiti

Wireshark vede solo ciò che passa dall’interfaccia su cui cattura. Su una rete switchata moderna, senza port mirroring e senza essere sul path del traffico, vede solo il proprio traffico e il broadcast — non l’intera rete come succedeva sugli hub. Sul traffico cifrato vede i metadati (indirizzi, porte, dimensioni, tempi) ma non i contenuti, a meno di avere le chiavi. E la dissezione vale quanto il dissector: un protocollo proprietario o non supportato resta una sequenza di byte grezzi.

Resta il fatto strutturale: uno strumento che capisce mille protocolli contiene mille parser, e ogni parser è la promessa di leggere correttamente input che qualcuno ha tutto l’interesse a rendere scorretto. La separazione di privilegio del 2008 è la presa d’atto di questo, scritta nell’architettura.


https://www.wireshark.org/docs/wsug_html_chunked/ChIntroHistory.html https://wiki.wireshark.org/CaptureSetup/CapturePrivileges https://lists.wireshark.org/archives/ethereal-users/200606/msg00131.html https://nvd.nist.gov/vuln/detail/CVE-2007-6112 https://lwn.net/Articles/189356/ https://www.noze.it/insights/wireshark-1-0/

Immagine di copertina: Diagramma della pila di protocolli TCP/IP con i livelli Applicazione, Trasporto, Internet e Collegamento; una lente d’ingrandimento… — diagramma di Dave Braunschweig, CC BY-SA 3.0 — https://commons.wikimedia.org/wiki/File:Internet_Protocol_Analysis_-_Application_Layer.png