next up previous contents
Successivo: Punti principali Su: Worm: il verme di Precedente: Descrizione ad alto livello

Analisi della struttura di controllo

Quando il Worm inizia l'esecuzione nel main(), si preoccupa di fare alcune inizializzazioni, alcune difese ed alcune pulizie. La prima cosa che fa è cambiare il suo nome in sh. Ciò riduce la finestra di tempo durante la quale il processo rimane visibile con un nome strano del tipo x9834753. A questo punto inizializza un numero casuale utilizzando l'orario di sistema corrente, disabilita il dump del core, e si prepara a morire quando la connessione remota fallisce. Una volta fatto tutto ciò processa la sua lista di parametri. Come prima cosa cerca l'opzione -p $$, dove $$ rappresenta il process ID del processo padre; questa opzione dice al Worm che in seguito si suiciderà. Procede poi a leggere in memoria gli altri file che sono passati come argomento; li rimuove dal disco non appena li ha letti. Se il Worm non trova il sorgente del programma vettore come argomento esce silenziosamente; ciò viene fatto probabilmente per frenare eventuali analisi del Worm da terze persone. Nella fase di pulizia come prima cosa chiude i suoi file descriptor, tagliandosi fuori temporaneamente dal Worm genitore sull'host remoto, e cancellando alcuni filegif. Il Worm azzera la sua lista degli argomenti, per ingannare il programma ps. Il prossimo passo è quello di inizializzare la lista interna delle interfacce di rete; tali interfacce verranno usate per testare le reti locali e trovare nomi alternativi per l'indirizzo dell'host corrente. Infine, il Worm resetta il suo process group e killa il processo che lo aveva aiutato a bootstrapare. L'ultima azione del Worm nel main è quella di chiamare una funzione di nome doit(), che contiene il loop principale del Worm stesso.

tex2html_wrap2414

doit() fà girare un piccolo prologo prima di entrare effettivamente nel ciclo principale. Inizializza (in modo ridondante) un generatore di numeri casuali con l'orario corrente, conservandosi l'orario in modo da poter testare da quanto tempo sta girando. Il Worm poi tenta la sua prima infezione. Come prima cosa attacca i gateway che aveva trovato con il programma netstat; se non può infettare nessuno di questi host, allora prova a caso degli host sulla rete locale, poi prova a caso degli host che non sono tanto lontani dall'host gateway, in ogni caso fermandosi se avrà successogif.

Dopo questo tentativo iniziale di infezione, il Worm chiama la routine checkother() per controllare la presenza di un altro Worm sulla stessa macchina locale. In questo controllo il Worm si comporta come un client verso un Worm esistente che si comporta come un server; si scambiano a questo punto un messaggio sul population control, dopo del quale, eventualmente, uno dei due Worm va in shutdown.

Appena prima di entrare nel loop principale il Worm chiama una strana routine. Abbiamo chiamato tale routine send_message(), ma in realtà non invia niente. Pare che il suo scopo fosse quello di mandare un datagram di 1 byte ogni 15 copie del Worm ad un porta ben definita dell'host ernie.berkeley.edu (come già detto in precedenza).

Il loop principale comincia con una chiamata alla funzione cracksome() per effettuare alcune operazione di password cracking. La password cracking è un'attività che il Worm svolge in modo costantemente crescente. Fa una pausa di 30 secondi alla ricerca di eventuali altre copie del Worm che stessero cercando di penetrare sull'host locale, e poi ritorna alla fase di cracking. Dopo questa parte, effetua una fork (crea un nuovo processo che gira con una copia della stessa immagine di codice eseguibile) e fà terminare il vecchio processo. A questo punto il Worm ritorna alla sua fase infettiva, tentando (in ordine di precedenza) con i gateway, gli host elencati nel file /etc/hosts.equiv, numeri di host scelti a caso dall'altro lato dei gateway e numeri di host scelti a caso sulla rete locale. Come prima, anche ora, non appena si ha successo nell'infettare un nuovo host, lo si marca come infettato nella lista interna degli host e si lascia la fase di infezione, per ritornarci in seguito. Dopo l'infezione il Worm si ferma per due minuti cercando nuovamente altre copie di se stesso sulla macchina locale; tutto ciò viene rifatto perché un host remoto protrebbe aver cercato nuovamente di infettare la macchina locale. Se sono trascorse 12 ore ed il Worm è ancora vivo, allora si suppone che la scelta degli host da infettare da parte del Worm sia stata sfortunata, e quindi si procede a ri-inizializzare la tabella degli host da infettare. Alla fine del loop principale il Worm controlla sia se lui stesso era stato schedulato a morire, e sia se avesse effettuato una quantità di lavoro sufficiente nella fase di password cracking. Se le due condizioni si verificano entrambe, allora termina l'esecuzione.


next up previous contents
Successivo: Punti principali Su: Worm: il verme di Precedente: Descrizione ad alto livello

Aniello Castiglione e Gerardo Maiorano < anicas,germai@zoo.diaedu.unisa.it >