In questa sezione illustreremo il concetto di ``tunnelling'' facendo uso di un esempio reale: lo studio del virus ``Invisible Man'' [Hof96] che, pare, sia stato scritto (secondo noi solo modificato) a Salerno. I motivi di tale scelta sono da ricercare nel fatto che non solo tale virus sia stato uno dei primi ad utilizzare tale tecnica, ma anche perché spesso, da parte della stampa nazionale, si è considerata l'Università di Salerno come una ``fucina'' di creazione di virus.
Si tratta innanzi tutto di un virus che infetta e si propaga ugualmente bene sia per mezzo dei file con estensione .COM e .EXE sia attraverso il Master Boot Record dei dischi fissi e, in una variante del virus, anche attraverso il boot sector dei dischetti. Tuttavia le modalità di infezione cambiano a seconda che essa avvenga quando un computer legge il boot di un disco fisso (o di un dischetto) infetto oppure se il calcolatore va ad aprire in un modo qualunque un file inquinato.
Nel primo caso viene caricato ed eseguito il Master Boot Record del disco inquinato ed il virus si riserva per sé 4096 byte di memoria convenzionale installando un suo proprio gestore dell'interrupt 1Ch con la funzione d'installare a sua volta un gestore dell'interrupt 21h quando verrà successivamente caricato il COMMAND.COM. Si deve sapere che l'interrupt 21h del DOS è particolarmente importante nel sistema operativo ed interviene nella maggior parte delle funzioni di I/O del computer. In questa maniera il virus ottiene due importanti risultati:
Il virus, infiltrandosi nel computer attraverso il boot di un disco infetto, raggiunge però un altro importante obiettivo: quello di essere più difficilmente scoperto. Infatti uno dei modi per individuare la presenza di un virus residente in memoria consiste nel verificare se vengono modificati gli indirizzi dei vettori d'interrupt impiegati; se il virus si introduce nel sistema prima che venga caricato il sistema operativo, non ha la necessità di modificare tali vettori.
Cercheremo di spiegare alla buona come vengono modificati i vettori, rinunciando un poco al rigore tecnico, con la descrizione di ciò che accade quando viene eseguito un interrupt e con un esempio quanto più possibile vicino a quanto avviene all'interno del computer in questi casi. Il computer funziona per mezzo di una unità centrale di elaborazione che esegue le istruzioni che le vengono impartite. Una di queste istruzioni è l'interrupt, che costringe il microprocessore ad interrompere la sua attività precedente e ad eseguire una serie di altre operazioni chiamate routine di gestione dell'interrupt. Si parla di routine perché si tratta per l'appunto di una sequenza fissa di operazioni proprie di quel particolare interrupt e del sistema operativo (DOS) impiegato. Ogni interrupt (ovvero ogni routine di gestione) è collocato in memoria, all'accensione del computer, quando viene caricato il BIOS ed occupa un preciso indirizzo della RAM. Tutti gli indirizzi di tutte le routine sono ordinatamente disposti in un'altra zona della RAM ed il loro insieme è chiamato tavola dei vettori di interrupt. Se un computer sta eseguendo un programma e ad un certo punto incontra l'istruzione ``INT'', per esempio ``INT 21h'' il microprocessore interrompe l'elaborazione in corso ed esegue un'intera serie di operazioni che sono specifiche della routine di gestione dell'interrupt 21h. Per fare ciò cerca nella tavola dei vettori di interrupt la collocazione del vettore 21h, legge l'indirizzo della routine di gestione di tale interrupt (che è posta in tutt'altra parte della RAM), va a tale indirizzo ed esegue la routine. Quando poi il microprocessore ha eseguito le operazioni proprie della routine, riprende l'esecuzione del programma dal punto in cui l'interrupt l'aveva fermato. A questo punto dobbiamo porre particolare attenzione su due fatti:
Tentiamo, con un esempio, di rendere chiaro il concetto a chi abbia trovato difficoltà nel districarsi fra termini necessariamente tecnici. Supponiamo che si stia svolgendo un programma radiofonico che consiste nel commento dei fatti del giorno da parte di un conduttore e nel porre in onda della musica a richiesta degli ascoltatori. Quando giunge la telefonata dell'ascoltatore, il conduttore interrompe ciò che si sta dicendo, cerca il disco richiesto, lo pone sul giradischi e fa ascoltare la musica del disco richiesto. Nel nostro esempio il conduttore è il microprocessore del computer, la telefonata con la richiesta di un preciso brano musicale è la chiamata ad un interrupt, ed il contenuto di un disco è la routine dell'interrupt. Affinché però il tutto funzioni è necessario avere a disposizione uno studio (il computer) che deve essere aperto (accensione del computer) e predisposto per questa attività (caricamento del BIOS e del DOS). Gli studi possono essere diversi, le predisposizioni anche, ma una cosa è sempre la stessa: il conduttore ha a disposizione una tabella dove sono scritte le posizioni esatte dei dischi negli scaffali che ha di fronte quando inizia il programma. Quando uno studio viene aperto, degli inservienti (il BIOS e il DOS) pongono rispettivamente i dischi da ascoltare (le routine degli interrupt) in una posizione particolare degli scaffali a disposizione (in un'area particolare della RAM) e preparano una tabella (tavola dei vettori) in cui i titoli dei dischi sono disposti sempre nello stesso ordine alfabetico (ordinamento costante dei vettori d'interrupt nell'omonima tabella). Tuttavia ogni coppia di inservienti (ogni BIOS e DOS) ordina i dischi sugli scaffali in modo diverso e prepara di conseguenza la tabella indicando, a fianco di ciascun titolo, la posizione del disco sullo scaffale. Se un sabotatore, per esempio un virus, vuole danneggiare il programma radiofonico, facendo ascoltare il contenuto di dischi diversi da quelli richiesti, può agire in due modi: o sostituisce di nascosto gli indirizzi dei dischi scritti sulla tabella, magari proprio mentre il conduttore ne sta scegliendo uno sullo scaffale, oppure prende nota dell'esatta posizione dei dischi; potrà farlo o sbirciando nella tabella, o annotando la loro posizione quando essi vengono posti sugli scaffali. Dopo di che, quando gli inservienti si accingono a predisporre lo studio per la trasmissione radiofonica, scambia un disco con un altro sugli scaffali. È proprio questo che accade quando il virus si pone residente in RAM attraverso un boot da disco già infetto. Esso prende nota degli indirizzi originali delle routine di gestione degli interrupt e, quando viene caricato il COMMAND.COM del DOS, conoscendo le posizioni esatte degli indirizzi suddetti, sostituisce, (per esempio) per gli interrupt 13h e 21h, due proprie routine di gestione al posto della prima istruzione di quelle originali. Agendo così il virus ha il pieno controllo sulle richieste di tali interrupt che giungono dal sistema operativo. Inoltre non ha bisogno di scambiare alcun indirizzo nella tavola dei vettori e quindi sfugge a quei programmi antivirus che rilevano la presenza di un virus proprio quando il vettore di interrupt viene modificato. Inoltre, al fine di non infettare alcuni file che sono di solito programmi antivirus, il gestore virale dell'interrupt 21h, una volta installato in memoria, controlla, attraverso un proprio algoritmo di calcolo, il nome di ogni programma che sta per essere infettato: se esso corrisponde ad un certo valore di riferimento, il virus non procede all'infezione. Dopo di ciò il virus controlla, attraverso un contatore interno delle infezioni dei boot, se è stato raggiunto il numero di 20 infezioni. Se ciò non è ancora accaduto, procede con le operazioni di infezione dei file che verranno illustrate di seguito. Se invece le 20 infezioni di sistema sono state raggiunte e se viene eseguito un programma che ha una data di creazione anteriore di oltre un anno rispetto a quella memorizzata nel timer del sistema, sovrascrive il programma stesso con un altro piccolo programma. Quest'ultimo fa apparire il messaggio dedicato ad Ester (che vediamo di seguito), insieme ad una poesia, mentre fa suonare al computer alcune note del brano musicale ``Invisible Man'' dei Queen. Il programma originale, così sovrascritto, diventa del tutto irrecuperabile e la sua esecuzione cessa con un ritorno al DOS, che restituisce un messaggio di errore di livello 255.
The Invisible Man - Written in Salerno (ITALY), October 1992
Dedicated to Ester: I don't know either how
or when, but I will hold you in my arms again
I'm the invisible man,
I'm the invisible man,
Incredible how you can
See right through me.
I'm the invisible man,
I'm the invisible man,
It's criminal how I can
See right through me.
Quando invece l'infezione avviene per mezzo di un file infetto, il virus innanzi tutto va alla ricerca della propria presenza in memoria, chiamando l'interrupt 21 e verificando se un particolare valore che esso pone in un registro interno produce il ritorno di un altro predeterminato valore nello stesso registro (installation check). Se ciò accade, il virus si riconosce come già presente in memoria ed evita di procedere con la propria installazione, eseguendo il programma già infetto. In caso contrario si installa in memoria e si riserva 3456 byte di RAM alterando la catena degli MCB ed aggiornando un proprio contatore che tiene conto del numero di sistemi infettati. Dopo di ciò il virus va alla ricerca dell'indirizzo originale della routine di gestione dell'interrupt 13h. Come abbiamo già detto, questa è un operazione rischiosa per il virus in quanto deve sbirciare il contenuto del relativo vettore d'interrupt senza che un eventuale antivirus residente in RAM se ne accorga. Infatti molti antivirus sono ormai predisposti per intercettare un'azione del genere ed allora il virus la compie ponendo in atto una tecnica abbastanza complessa che va sotto il nome di ``tunnelling''. Esistono vari modi per realizzare questa tecnica e, qualunque sia la procedura adottata, essa consiste, in linea generale, nel ``riagganciare'' una normale e lecita chiamata fatta ad un certo interrupt per ottenere una certa particolare risposta. In questa maniera un eventuale antivirus, che ha controllato le operazioni della chiamata iniziale, trovandole perfettamente ``normali'', considera ancora sotto il suo completo controllo l'interrupt stesso, mentre invece il virus cattura una risposta specifica, attraverso questa tecnica che crea una specie di ``tunnell'' nascosto di ritorno. Ottenuto l'indirizzo iniziale dell'interrupt 13h il virus lo utilizza per proprie operazioni sul disco e così elude il blocco da parte di programmi antivirus TSR che controllano la modifica dei vettori di interrupt. Fatto ciò il virus legge il Master Boot Record del disco fisso per vedere se esso è già infetto. Se non lo è, e se una delle partizioni del disco è di un certo tipo, essa viene ridotta di sette settori, che vengono impiegati per celare il MBR originale ed il codice virale, dopo di che viene creato un nuovo MBR con le informazioni sulla nuova partizione così modificata. Il nuovo Master Boot Record è polimorfo e cifrato. Ciò significa che, a parte le nuove informazioni sulla nuova partizione, il resto del MBR è diverso da qualunque altro MBR che sia stato o che venga successivamente infettato dal virus su un altro computer. In tal modo la ricerca del virus per stringhe di riconoscimento diventa particolarmente difficoltosa. Per contro, il virus è in grado di rilevare se si tratta di un MBR infetto, poiché crea un checksum unico per ciascun MBR e lo scrive al suo interno; dopo di che, per verificare l'avvenuta infezione, ricalcola il checksum e lo confronta con quello contenuto nel MBR. Fatto ciò, il virus con la stessa tecnica di ``tunnelling'' adottata per l'interrupt 13h, legge l'indirizzo originale della routine di gestione dell'INT 21 e, una volta ottenuto, lo impiega per tutte le successive operazioni con il sistema operativo. A questo punto, ogni file con estensione .COM o .EXE che venga successivamente aperto, letto, rinominato o eseguito e che non sia stato ancora inquinato, viene infettato dal virus che si attacca alla fine del file. Per controllare se un file è già infetto, il virus adotta la stessa tecnica di cifratura e di polimorfismo impiegata per individuare l'infezione sul Master Boot Record dei dischi fissi. Nella variante appena descritta, i file .COM si allungano, prevalentemente, di 2846 byte e quelli .EXE di 2926 byte. L'unico limite per i file .COM è costituito dalla loro lunghezza che, se superiore a 62720 byte, impedisce l'infezione da parte del virus. L'allungamento dei file tuttavia può essere diverso a seconda della variante del virus che impieghi altri tipi di checksum per il riconoscimento.