Chi si ricorda il ping of death? Verso il 1992 Internet comincia ad uscire dalle università e dai centri di ricerca, per diffondersi prima fra le grandi aziende, e poi in modo più capillare. Allora le macchine Windows vivevano quasi esclusivamente sulle LAN, sfruttando il protocollo NetBEUI o, al più IPX (Novell). Internet era dominio Unix, o casomai Digital o IBM. Se con Windows 3.11 o 3.1 si voleva usare Internet da casa, la soluzione tipica era installare il Trumpet Winsock, che forniva uno stack TCP/IP e se non sbaglio anche SLIP e PPP. Con Windows 95, diventa normale usare lo stack TCP/IP integrato, che però ancora non veniva installato automaticamente (e pensare che c’è qualcuno che è convinto che Microsoft abbia inventato Internet 😉 ). Nello stesso periodo, più o meno, usciva Windows NT 3.51. In quel periodo, diciamo dal 1996, si discuteva molto delle prestazioni dei diversi stack TCP/IP (pensa tu…) e del fatto che gli stack Microsoft, nuovi, avessero prestazioni peggiori dei più “consolidati” sistemi unix/solaris/simili. Così in quel periodo è aumentata l’attenzione verso l’implementazione degli stack tcp/ip, e con l’attenzione sono saltati fuori i bug. Dato che lo stack è implementato nel kernel, un baco aveva ottime probabilità di piantare la macchina. I giovani stack delle macchine Windows ne sono usciti in generale peggio dei più solidi stack delle macchine *nix, ma in effetti molti dei diversi attacchi di quel periodo (bonk, boink, land, teardrop..) colpivano più architetture: neppure gli stack *nix erano mai stati testati così a fondo. Di quel periodo, durato direi tre o quattro anni, è rimasto famoso soprattutto il “ping of death“, così soprannominato perché bastava un solo pacchetto ping malformato per bloccare un sistema… per un gran numero di architetture. Per fortuna, allora i DoS erano ritenuti ancora poco interessanti, altrimenti temo che Internet avrebbe subito un duro colpo. Invece, la cosa è passata quasi inosservata, e questi attacchi sono stati usati principalmente per “fare scherzi”. Purtroppo, i tempi cambiano, adesso non dubito che l’effetto di una vulnerabilità simile sarebbe invece devastante.
Comunque sia, verso il 1998 direi, pian piano e a forza di bachi e patch, gli stack sono diventati più robusti, e di questi attacchi se ne sono scoperti sempre meno. Adesso, nel giro di pochi giorni sono saltate fuori una vulnerabilità di Cisco e una di Solaris… basate su pacchetti ICMP, e se l’istinto non mi inganna, con il ritorno di attenzione ne verranno fuori altre, magari per altre architetture. Cosa c’è da imparare? Soprattutto, che anche una cosa semplice come un pacchetto ping, utilizzato da più di vent’anni e la cui gestione sembrerebbe banale, può rivelare un baco.
La seconda è che “a volte ritornano”. Sarebbe interessante sapere se i nuovi bachi sono dovuti a vulnerabilità latenti da decenni, o se invece (più probabilmente), sono conseguenza di successivi cambiamenti al codice. Entrambi i casi sarebbero comunque interessanti.
La terza è che un singolo componente, nel momento in cui gestisce dati anche all’apparenza banali (e tutti gli apparati, le applicazioni e i sistemi in generale gestiscono dati) può essere vulnerabile. Mai basare le proprie difese su un unico componente.
Tuttavia, in questo caso c’è un ulteriore aspetto interessante: mentre la difesa in profondità è di grande aiuto contro le intrusioni, paradossalmente contro i DoS può essere un difetto: se ci sono più componenti in serie, basta che uno si blocchi perché il flusso venga bloccato. Contro i DoS, servirebbero sistemi diversi in parallelo. Non so esattamente cosa dedurne, ma mi sembra interessante ragionarci sopra.
Un link che rende l’idea della pletora di attacchi di DoS basati su pacchetti malfornati di quel periodo: