Come già detto in precedenza, un computer virus è un programma che può infettare
altri programmi, modificandoli ed includendo, eventualmente, una copia evoluta del proprio codice.
Le proprietà d'infezione lo diffondono attraverso PC o
reti sfruttando le autorizzazioni dei singoli utenti. Ciascun programma che abbia subito l'infezione può
comportarsi come un computer virus e così può propagare l'infezione [Coh84].
Esempio di un semplice computer virus V scritto in pseudo linguaggio C:
main() /* 1234567 la firma del computer virus */
{
/* sceglie a caso un file EXE ed inserisce il codice del computer virus all'inizio del file se non è
presente la firma del virus "1234567" */
void infect_executable()
{
do {
file = get_random_executable_file;
} while (1234567 not in first_line);
prepend virus to file
}
/* effettua il danno */
void do_damage()
{
.../* linee di codice per causare danni */
}
/* restituisce zero se si verifica una particolare condizione d'innesco */
void trigger_pulled()
{
....
}
infect_executable();
if (trigger_pulled()) then do_damage();
.....
}
Lo scopo del precedente computer virus V consiste nel cercare un eseguibile E che non contenga nell'header una particolare stringa (firma del virus, che nell'esempio è 1234567). In caso affermativo, inserisce il suo codice all'inizio di E ottenendo il file infetto I. Quando l'utente esegue E, inavvertivamente eseguirà il file infetto I che a sua volta cercherà un file E' da infettare, producendo un nuovo file I'. La proprietà chiave di un computer virus è la capacità di infettare altri programmi, questo è realizzato attraverso la chiusura transitiva.
Un esempio di chiusura transitiva è il seguente:
Se V infetta uno dei file E dell'utente A e l'utente B esegue il file E
(ricevuto da A), V si diffonde tra i file di B.
Appartengono a questo gruppo quei computer virus [4] che usano il file system del sistema operativo per propagarsi. Questi computer virus infettano tutti i tipi di file eseguibili del DOS, quali BAT (file batch), SYS (file di sistema), EXE (file eseguibili), COM (file di comando) ed inoltre quelli caratteristici di altre piattaforme come Macintosh, Unix e Windows9x.
In accordo alle modalità di infezione, i file virus si dividono in:
Gli overwriting virus sono più facili da realizzare in quanto sovrascrivono il file in modo che, dopo l'infezione, la parte iniziale del programma è sovrascritta dal virus con ovvi problemi d'esecuzione.
L'algoritmo di lavoro di un overwriting virus ha di solito un codice poco elegante che gli consente di compiere alcune semplici operazioni:
A questo gruppo appartengono tutti quei file virus che cambiano il contenuto dei file da infettare durante
il trasferimento delle loro copie, ma i file stessi restano completamente o parzialmente utilizzabili.
Lo scopo fondamentale di questi parasitic virus è di inserire, a seconda del tipo di infezione, il proprio codice:
all'inizio (virus prepending): salvano il loro codice al top del file alla fine (virus appending): salvano il loro codice alla fine del file nel mezzo (virus inserting): salvano il loro codice nel mezzo del file
virus prepending:
I virus che inseriscono il proprio codice all'inizio del file sono i più comuni.
Essi possono usare due metodi d'infezione :
il primo consiste nel copiare l'inizio del file da infettare
alla fine e
successivamente copiare il corpo del virus nello spazio liberato, come illustrato in figura 2.
figura 2: prepending - primo metodo
Nel secondo metodo il virus crea una sua immagine in memoria, accoda il file da infettare e poi salva il risultato della concatenazione sul disco, come in figura 3.
figura 3: prepending - secondo motodo
In questo processo d'infezione, individuato il file da infettare, il virus, spesso, ne fa una copia. Infetta il file aggiungendovi il proprio codice, riloca i necessari indirizzi nel corpo del programma, e lo testa, attendendo la sua completa esecuzione. Nel caso in cui l'esecuzione è avvenuta senza errori, il virus, cancella la copia e salva il file così infettato, altrimenti la ripristina.
virus appending: è la modalità più utilizzata dai parasitic virus. Esso modifica il top del file in modo tale che il codice del virus viene eseguito per primo. In un file COM (vedi figura 4a), i primi tre (o più) byte servono per rappresentare il jump ad un parte nel corpo del file oppure l'indirizzo della routine che passa il controllo al corpo del virus.
L'algoritmo di lavoro prevede le seguenti operazioni:aggiunge il corpo del virus al file
salva il jump originale nel corpo del virus
sovrascrive il jump originale con quello del virus
figura 4a: Inoculazione di un virus alla fine del file
In un file EXE (vedi figura 4b), l'algoritmo di lavoro modifica la struttura dell'header (c.f.r. tabella 1).
figura 4b: Inoculazione di un virus alla fine del file
L'header del file EXE, formato da 32 byte, è esplicitato nella seguente tabella nella quale i byte alterati, sono quelli marcati con un asterisco:
Offset | Nome | Dimensione | Commento |
00h | Tipologia del file | 2 byte | Contiene il valore 4Dh5Ah (MZ o ZM) che indica il formato del file |
*02h | Dimensione dell'ultima pagina | 2 byte | Indica la dimensione, in byte, dell'ultima pagina |
*04h | Numero di pagine | 2 byte | Indica il numero di pagine, da 512 byte, contenute nel file |
06h | Numero di entry | 2 byte | Indica il numero di entrate nella tabella di rilocazione |
08h | Paragrafi | 2 byte | Indica la dimensione dell'intero header, in numero di paragrafi (16byte) |
0Ah | Minima allocazione | 2 byte | Indica, il minimo spazio di memoria, in paragrafi |
0Ch | Massima allocazione | 2 byte | Indica il massimo spazio di memoria, in paragrafi |
*0Eh | PreReloc SS | 2 byte | Indica il valore dello Stack Segment (SS) prima della rilocazione |
*10h | Stack Pointer(SP) iniziale | 2 byte | Valore iniziale del registro SP |
12h | Negative checksum | 2 byte | Sempre Ignorato |
*14h | PreReloc IP | 2 byte | Valore iniziale del registro Instruction Pointer (IP) |
*16h | PreReloc CS | 2 byte | Valore Code Segment (CS) prima della rilocazione |
18h | Offset della tabella di rilocazione | 2 byte | Indica la posizione relativa (OFFSET) della tabella di rilocazione, all'interno dell'header. |
1Ah | Numero di Overlay | 2 byte | Ignorato |
1Ch | Riservato | 4 byte | Informazioni sul linker |
tabella 1: parte formattata dell'header
In particolare l'algoritmo di lavoro esegue le seguenti modifiche:
salva nel corpo del virus, il valore CS:IP (indirizzo completo della prima istruzione del file EXE originale) e SS (necessario per le chiamate a procedure del file EXE), per consentire al computer virus di eseguire il codice del programma portatore
modifica i valori CS, IP e SS (offset 16h,14h e 0Eh rispettivamente) in modo da far puntare l'indirizzo completo (CS:IP) all'inizio del codice virale e salvare eventuali chiamate a procedure nello stack segment (SS)
modifica la lunghezza del file infetto (offset 02h e 04h) aggiungendovi la dimensione del codice virale
Per i file SYS (vedi figura 5a) tali virus possono essere estremamente pericolosi ed hanno una grossa
vitalità, perché si installano in memoria prima del caricamento di un programma anti-virus.
Essi aggiungono il loro codice al corpo del file e modificano l'header in modo da cambiare
gli indirizzi delle routine Interrupts e
strategy del
driver da infettare.
Al caricamento di un
driver infetto, il virus lo intercetta, lo inizializza e rimane in memoria insieme al codice del driver,
diventando di fatto una parte del sistema operativo.
figura 5a: Infezione di un device driver
virus inserting: vi sono diversi modi per incorporare il virus nel mezzo dei file. Il metodo più usato dai virus inserting, è quello di spostare porzione di codice alla fine del file oppure di espandere il file, inserendo il prorpio codice nello spazio liberato. Alcuni virus comprimono le porzioni di codice in modo che la grandezza del file resti inalterata, come il virus Mutant.
Sono particolari file virus il cui algoritmo di lavoro crea un clone di un file che ha lo stesso nome ma diversa estensione in
modo da non modificare la dimensione del file da infettare. Il file companion conterrà,
oltre al corpo del virus, anche il link al file originale.
Questa tipologia di file virus trova terreno fertile nell'ambiente DOS/WINDOWS, causa la caratteristica
di eseguire, in ordine di priorità, prima il file COM e poi gli
EXE [Wil93].
Un esempio chiarificatore è il seguente:
supposto che il file attaccato sia XCOPY.EXE, per esso viene creato un file companion XCOPY.COM (contenente il virus). Per la caratteristica precedente, nell'istante in cui l'ignaro utente esegue il comando XCOPY, il DOS, eseguirà XCOPY.COM che oltre al virus contiene la chiamata al file XCOPY.EXE.
I link virus, come i companion virus, non cambiano il contenuto fisico del file ma forzano il sistema operativo ad eseguire il proprio codice. Quando questi tipi di virus diventano residenti in memoria, ogni floppy non protetto in scrittura viene infettato inserendo il proprio codice nell'ultimo cluster del dischetto. Mentre per gli hard disk il virus si allocherà nel cluster non utilizzato di recente. Il virus ottiene i puntatori originali dei file eseguibili dal disco e li copia in un'area non utilizzata della root directory del disco. I puntatori originali sono modificati in modo da puntare al codice del virus nell'hard disk. Controllando la directory dei dischi infettati, non risulterà nulla di alterato, quindi tutti i programmi avranno la loro data e dimensione originale. Ciò succede perchè i programmi originali non vengono alterati. Se l'utente esegue uno di questi programmi, allora il virus eseguirà prima il suo codice ed in seguito, utilizzando gl'indirizzi dei file memorizzati nell'ultimo cluster della root directory, eseguirà il file richiesto. I link virus, (vedi figura 6) generalmente, si aggiornano, ad ogni riavvio, sulle eventuali modifiche fatte alla struttura dei file dall'utente.
Se, ad esempio, un file viene spostato in un altra directory durante una normale sessione di lavoro, il link virus ne perde il controllo. Al succesivo riavvio del sistema, il virus, riattivandosi otterrà il nuovo indirizzo del file con il metodo precedentemente descritto. Tra i link virus più conosciuti si evidenzia la famiglia dei virus Dir_II.
figura 6: Link virus
Sotto alcuni aspetti sono simili ai companion virus, ma a differenza di quest'ultimi, non contengono puntatori ad alcun file eseguibile. Quando questi si propagano, creano delle copie sui dischi o directory locali, con la speranza che un giorno l'utente li esegua.
Questi virus associano alle loro copie nomi speciali, come Install.exe o Winstart.bat, in modo da mettere in condizione l'utente di eseguirle. I file worm, usano tecniche piuttosto inusuali, per esempio inseriscono le loro copie nei file archivio (ARJ, ZIP ed altri), come i virus ARJ e WINSTART.
I Boot virus infettano il Boot sector di un floppy disk e il Boot sector o l'MBR dell'hard disk [5]. L'infezione avviene nel seguente modo:
il Boot sector (MBR) originale è copiato in un altro settore del disco (come il primo settore libero)
se la dimensione del virus è minore di 512 byte (dimensione del boot sector), allora il virus sovrascrive il vecchio settore di avvio, altrimenti inserisce la parte iniziale nel Boot sector, mentre il restante codice del virus è scritto in altri settori del disco (vedi figura 7). Questi settori, in genere, sono marcati come BAD sector per evitare che il codice del virus venga sovrascritto da altri dati.
figura 7: struttura del Boot virus
Ci sono vari modi per installare sul disco il Boot sector infetto e la continuazione del
virus: si può inserire il virus nei settori dei cluster liberi di un disco logico, oppure
nei settori non usati del disco fisico, cioè quelli non appartenenti ad una partizione.
Nel primo caso, il virus deve gestire la File Allocation Table (FAT)
ed in particolare deve
marcare BAD i cluster corrispondenti ai settori occupati dal virus. Questo metodo, per
esempio, è quello usato dai virus Brain e Ping Pong
[Hof97].
Nel secondo caso, il virus utilizza dei settori del
disco che non vengono usati o sono raramente usati. Su un hard disk questi settori sono
quelli che si trovano tra il Master Boot Record e il Boot sector, mentre sui dischetti
sono quelli finali della root directory.
Ci sono anche altri metodi per
installare un virus su un disco, per esempio, formattare una traccia addizionale (solo per
i floppy) o sfruttare i settori non utilizzati alla fine di una partizione.
Algoritmo di lavoro:
la maggior parte dei boot virus conosciuti è di tipo residente in memoria. Essi diventano
TSR quando si fa un reboot da un disco infetto. In quel momento il
bootstrap loader del sistema legge il contenuto
del primo settore del disco usato per fare il boot, copia in memoria le informazioni
lette e trasferisce il controllo al virus.
Il virus in genere esegue le seguenti operazioni:
si riserva una certa quantità di memoria libera
carica dal disco, se è presente, la seconda parte
copia il codice virale nello spazio di memoria ottenuto al punto 1
setta i vettori d'interrupt necessari
esegue operazioni addizionali che variano in base al tipo di virus
carica in memoria il Boot sector originale e gli trasferisce il controllo
I boot virus si comportano in modo analogo ai file virus residenti in memoria, agganciano gli interrupt di I/O per infettare i dischi, ed inoltre, al verificarsi di una condizione di innesco, eseguono delle operazioni distruttive o degli effetti audio/video.
I macro virus [3] sono creati con
metalinguaggi di solito inglobati in alcuni programmi come
Word, Excel e 123 Lotus, e non infettano i normali eseguibili ma s'inseriscono come macro
in normali documenti.
E' importante conoscere i formati dei documenti Word, dei fogli elettronici di Excel e specialmente
quelli di Office per comprendere come i macro virus sfruttano le loro caratteristiche.
Algoritmo di lavoro dei macro virus:
Inoltre, esistono macro/funzioni associate a tasti oppure ad una particolare data, che vengono eseguite
automaticamente (senza l'aiuto dell'utente). Questo significa che Word/Excel chiamano la macro/funzione dopo
che è stata premuta una determinata combinazione di tasti o in un certo intervallo di tempo.
I network virus, fanno largo uso dei protocolli e delle capacità delle reti per
propagarsi [6]. La caratteristica principale di un network virus
consiste nel trasferire ed eseguire il suo codice da un server remoto ad un altro.
Questo tipo di virus divenne popolare agli inizi degli anni ottanta. Tra i più conosciuti
troviamo troviamo Christmas Tree, Wank Worm virus e worm di
Morris. Questi facevano uso delle funzioni non documentate ed errate dell'accesso alla rete
per accedervi e propagarsi.
I network virus si diffondevano tramite le reti ed
in modo simile ai companion virus, non modificavano i file originali ed i settori dei dischi.
Essi si infiltravano nella memoria dei computer della rete, calcolavano gli indirizzi delle
vittime ed inviavano loro delle copie virali. Dopo migliaia di epidemie, vennero corretti gli
errori dei protocolli di rete e chiuse le back
door. Nel 1997 riapparve un'evoluzione dei network virus, tra i primi troviamo
Macro.Word.ShareFun, che infettava i messaggi di posta elettronica creando nuovi messaggi
contenti documenti infetti da spedire ai primi 3 utenti della rubrica, ed Win.Homer che
sfruttava il protocollo FTP.
Le macro sono combinazioni di dati e di codice eseguibile e necessitano d'essere interpretate
dall'interprete VBA (Visual Basic for Application).
Solitamente i macro virus si trasmettono attraverso documenti con estensione
DOC e DOT. Un documento infetto contiene una serie di macro che permettono al macro virus
di replicarsi autonomamente e causare un certo tipo d'azione o di danno. Le macro possono
infettare tutte le piattaforme come OS/2, MAC ed altre, purché supportino i programmi precedentemente
descritti.
Informazioni generali
La locazione fisica del macro virus all'interno del file dipende dal formato, che nel caso dei prodotti
Microsoft è estremamente complicato (ogni documento Word, foglio elettronico Excel, consiste di una
seguenza di blocchi di dati, collegati insieme ad un enorme quantità di dati ausiliari).
Questo formato è chiamato OLE.
La struttura dei file assomiglia al file system del Dos, ma è più complicata in quanto
la root directory del file punta alle directory dei vari blocchi di dati, quindi esistono diverse
FAT che contengono informazioni circa la posizione dei blocchi di
dati contenuti nel file.
Dato il complicato formato dei file di Word, Excel ed Office97, il meccanismo di diffusione dei macro virus
in un file può essere rappresentato approssimativamente come in figura 8.
figura 8: infezione da macro virus
I documenti hanno le seguenti caratteristiche: in essi ci sono blocchi di dati
ridondanti, ossia dati non collegati al testo in alcun modo,
oppure copie di dati che vengono salvati accidentalmente (cfr. Altri dati in figura 8).
Spesso quando viene digitato un carattere, insieme ad esso, vengono salvati uno o più blocchi
di dati dedicati.
Inoltre nei cluster dei documenti, spesso, vi sono alcuni junk (pezzi di codice
spurio) aggiunti al resto dei dati.
Questo significa che la dimensione dei file non è legata direttamente al numero di caratteri contenuti
nel testo, bensì alla presenza di codice ausiliario. In altre parole, la dimensione dei file può diminuire
dopo la fusione con altri file, oppure aumentare in seguito alla cancellazione di parte del testo.
Lo stessa cosa succede per i macro virus: dopo che il file è stato infettato, la sua dimensione può
crescere, decrescere oppure restare inalterata.
Quindi, sfruttando i bug presenti nella libreria
OLE, il codice dei macro virus può essere inserito
all'interno di qualsiasi documento Office, senza che le sue tracce vengano riconosciute da qualsiasi antivirus
o visualizzate da un qualsiasi text editor.
Il pacchetto Office è basato su un sistema di esecuzione automatico di macro predefinite.
In altre parole, quando viene selezionato un comando dal menu File, come ad esempio File Save, questo sistema
cerca e, nel caso esiste, esegue l'omonima macro che svolgerà
le funzioni per cui è stata progettata.
Dalla successiva tabella è possibile conoscere le macro/funzioni predefinite dai singoli pacchetti contenuti in Office.
WORD
EXCEL
OFFICE97
AutoOpen
Auto_Open
Document_Open
AutoClose
Auto_Close
Document_Close
Auto_Exec
AutoExit
AutoNew
Document_New
Auto_Active
Auto_Deactive
Tabella 2: Esempio di alcune macro/funzioni automatiche
I macro virus, utilizzano entrambe queste tecniche.
Ad esempio, se un documento infetto viene aperto, Word chiama automaticamente la macro infetta AutoOpen
che esegue il codice del virus.
Se, invece, il macro virus ridefinisce i tasti di scelta rapida, come ad esempio MAIUSC+F12 (Salva), si
attiva non appena vengono premuti i tasti corrispondenti.
3.4 Network virus
I TSR virus, sono quei virus che risiedono in memoria in seguito alla loro esecuzione. La maggior parte di essi, per mascherare la loro presenza in memoria, manipolano le aree di sistema che controllano l'allocazione della memoria, in modo da riservarsi dello spazio libero, marcandolo come occupato e scrivendovi dentro la loro copia. Alcuni virus inseriscono il loro codice nelle aree del vettore d'interrupt libere (UMB) e nella memoria XMS o EMS. Il TRS virus, quando si installa in memoria, crea un nuovo interupt, scrive una routine specifica e la inserisce nei vettori d'interupt.
Algoritmo di lavoro:
il virus controlla se una sua copia è già residente in memoria mediante un interrupt, che restituisce un valore che segnala la sua presenza
Se il TSR virus non è già residente in memoria, allora si riserva uno spazio di memoria in cui collocasi ed attende il verificarsi di alcune condizioni, come ad esempio l'apertura di un file, per effettuare la sua opera di diffusione e danneggiamento.
Ogni TSR virus intercetta un particolare tipo di interrupt, ma quasi sempre l'INT 21h, che è responsabile delle operazioni di Input/Output della macchina.
Gli anni novanta sono stati caratterizzati dalla proliferazione di tecniche particolari come quelle che:
adottavano tecniche in grado di generare codice virale diverso ma funzionalmente equivalente
cercavano di evitare il rilevamento di un computer virus confondendosi con le istruzioni del programma da infettare
manipolavano gli interrupt del DOS e del Bios in modo da richiamare direttamente le routine necessarie alle infezioni, bypassando qualsiasi attività del DOS
sfruttavano tecniche particolari per bloccare il sistema
I virus polimorfi sono particolari virus che generano copie
differenti ad ogni infezione attraverso i motori polimorfi.
I motori polimorfi (polymorphic engine) non sono virus di per se, ma sono routine che sono unite
al codice del virus, in modo tale da richiamare la routine di cifratura contenuta nel motore stesso. Un
virus polimorfo è formato da due parti, un codice cifrato ed un codice in chiaro.
Il codice cifrato contiene il motore polimorfo ed il codice del virus in forma cifrata,
mentre il codice in chiaro contiene la funzione di decifratura.
In linea di massima, la seguente struttura:
dove la funzione di decifratura è lasciata in chiaro (non cifrata) per accedere al parte cifrata
del codice del virus.
L'infezione avviene nel seguente modo:
il virus decifra il codice cifrato mediante la funzione di decifratura
viene eseguito il risultato della decifratura
cerca un nuovo file da infettare
se lo trova chiama il motore polimorfo il quale genera una nuova coppia di funzioni cifratura/decifratura
cifra il motore polimorfo ed in seguito il codice del virus
salva il risultato di tale cifratura
aggiunge la funzione di decifratura nella nuova istanza del virus polimorfo.
Per poter scrivere tali motori, sono necessari alcuni concetti quali:
conoscenza approfondita dell'insieme delle istruzioni del microprocessore
manipolare gli opcode a livello di bit in modo che con delle opportune operazioni, si trasformi un valore senza significato in uno valido per il processore.
Tra i motori polimorfi più diffusi troviamo l'MtE (Mutation Engine) di
2.4 Kbyte ed il TPE (Triden Polimorphic Engine) di 1.5 Kbyte.
I virus polimorfi sono tanto più potenti quanto più capaci di generare nuove funzioni di decifratura e allo stesso tempo differenti.
Alcuni antivirus, per fronteggiare i virus polimorfi, effettuano una routine di rilevamento
euristico che provoca, talvolta solo dei falsi allarmi.
Come in natura, l'obiettivo del virus è la sopravvivenza, così l'approccio più
banale tratta la procedura di decifratura come una semplice sequenza di byte, mentre una procedura
più avanzata, considera un algoritmo astratto che esegue i seguenti passi:
setup pointer register
Viene inizializzato il registro che contiene un puntatore alla zona di memoria da decifrare.setup count register
Inizializza il registro contenente la lunghezza del codice da decifrare.usa il pointer register per decifrare una word
aggiornamento del pointer register
decremento del count register
se il count register è maggiore di zero allora ritorna al passo 3
Per informazioni sulle istruzioni assembler onsultare il seguente libro :
[Pet90].
Alcuni esempi di realizzazione dell'algoritmo in codice assembly sono i seguenti
startenc:
mov
bx, OFFSET startenc
; carica nel registro bx l'indirizzo relativo, nel
; segmento, della label startenc
mov
cx, viruslength / 2
; carica nel registro cx il risultato della divisione
dec_loop:
xor
word ptr [bx],12h
; decifra una word alla volta
inc
bx
; aggiorna il pointer register
; per puntare alla prossima word
dec
cx
; decrementa il count register
jnz
dec_loop
; cicla finché è maggiore di zero
start:
mov
bp, OFFSET start
; carica nel registro bp l'indirizzo relativo, nel segmento,
; della label start
mov
bx, viruslength
; carica nel registro bx il valore contenuto nella variabile
; locale viruslength
dec_loop:
add
ptr [bp+0Ch], 33h
; decifra un byte alla volta
inc
bp
; incrementa il pointer register
dec
bx
; decrementa il count register
jnz
dec_loop
; e cicla finché è maggiore di zero
I motori possono creare, per ogni istanza del virus, una procedura di decifratura differente nel codice ma uguale nell'algoritmo (cfr. Esempio1 ed Esempio2). Per renderle difficili da essere individuate da un'analisi, viene inserito al loro interno del codice fittizio noto come do-nothing (non fare nulla), il quale non altera l'algoritmo di decifratura, come mostrato nell'Esempio 3:
Esempio 3
Supponiamo di voler inizializzare il count register (registro ax) con il valore 0808h.
Invece di scrivere questa istruzione mov ax,0808h, il motore
sostituisce questa sequenza:
mov
ax, 0303h
; carica in ax il valore 0303h
mov
bx, 0101h
; carica in bx il valore 0101h
add
ax, bx
; aggiunge ad ax il valore di bx
mov
cl, 1
; carica in cl il valore 01h
shl
ax, cl
; esegue uno shift ciclo a sinistra su ax
Uno stealth virus è un boot virus avanzato che oltre ad infettare il
Boot sector dei floppy e
l'MBR degli hard disk, reindirizza la chiamata al gestore degli interrupt
di I/O dei dischi (interrupt INT 21h) verso uno proprio, in modo da nascondersi a qualsiasi programma
antivirus.
a seconda del supporto fisico, il virus scrive la seconda parte del suo codice (lunga cinque settori)
ed il contenuto del Boot sector originale
lo stealth virus, sovrascrive il Boot sector originale con la parte iniziale del codice virale.
Un esempio è il Brain [Hof97], un virus che si avvia dal
Boot sector dei dischi, copia il contenuto del settore originale in una nuova locazione del disco,
marca questi tre cluster (sei settori) come BAD nella FAT e scrive il
codice del virus nel Boot sector del disco.
La caratterisitica fondamentale di questa tecnica è quella di manipolare gli
interrupt originali del DOS e del
BIOS, in questo modo si richiama
direttamente le routine
necessarie alle infezioni, scavalcando qualsiasi attività del DOS. I virus che usano questa
tecnica, chiamati tunnelling virus, infettano e si propagano indifferentemente sia per mezzo
di file con estensione EXE e COM che attraverso l'MBR degli hard disk,
ed in alcune varianti, anche il Boot sector del floppy.
Da un file infetto
Quando l'infezione avviene per mezzo di un file infetto, il virus innanzi tutto va
alla ricerca della propria presenza in memoria: chiama l'interrupt 21h che restituisce un valore
e lo confronta con quello posto precedentemente in un registro interno (installation check).
Se tali valori sono uguali, il virus si riconosce
come già presente in memoria ed evita di procedere con un ulteriore installazione, eseguendo
il programma già infetto. In caso contrario si installa in memoria,
riservandosi una discreta quantità di memoria ed aggiornando un proprio contatore che tiene conto del
numero di sistemi infettati. Dopo di ciò il virus va alla ricerca dell'indirizzo originale delle
routine di gestione dell'interrupt 13h. 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.
Esistono vari modi per fare questo 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 questo modo 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.
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 l'MBR 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 un certo numero di settori, che vengono impiegati per celare l'MBR originale ed
il codice virale, dopo di che viene creato un nuovo MBR con le informazioni sulla nuova partizione così
modificata.
Dall'MBR di un disco fisso
Quando il virus è caricato ed eseguito dal Boot sector di un
disco, riserva per se una certa quantità di memoria convenzionale,
dove viene installata una propria routine di gestione dell'interrupt INT 1Ch, che ha la funzione di
installare, a sua volta, quella dell'interrupt INT 21h
[Wil93].
Successivamente, il virus, prende nota, dalla tavola dei vettori di
interrupt, gli indirizzi originali delle routine di gestione degli interrupt INT 21h e
INT 13h e le sostituisce con due proprie routine di gestione.
Per il virus, è relativamente facile conoscere l'indirizzo di ciascuna routine di gestione,
in quanto ha libero accesso alla tavola dei vettori di interrupt.
si installa in memoria prima che venga eseguito un qualunque altro programma
ha libero accesso agli indirizzi originali degli interrupt che possono essere utilizzati per una
successiva azione
risulta difficile individuarlo se si infiltra attraverso il Boot sector di un disco infetto
Verrà illustrato con un esempio quello che fa realmente
il tunnelling virus quando viene eseguito dal Boot di un disco infetto.
Supposto che durante una trasmissione radiofonica, il conduttore interrompa momentaneamente lo
svolgimento del programma per rispondere alle richieste di un radioascoltatore. In questo caso, il
conduttore rappresenta il processore, la richiesta di un brano la chiamata ad un'interrupt ed il
contenuto del disco la relativa routine.
Il tunnelling virus controlla, attraverso un contatore interno, se sono state eseguite un certo numero
predefinito di infezioni, per mostrarsi.
Questa tecnica virale, utilizzata da Invisible Man, [Hof97]
permette al virus di visualizzare un messaggio al raggiungimento di 20 infezioni. Infatti raggiunta tale cifra, se viene
eseguito un programma che ha una data di creazione anteriore di oltre un anno rispetto a quella del sistema,
sovrascrive il programma con un altro che fa apparire sullo schermo una poesia dedicata ad Ester e
contemporaneamente suona la melodia di Invisible Man dei Queen. Il file infettato, risulta essere
inutilizzabile.
Lo scopo principale di un hacker è quello di creare un computer virus che sia difficile da essere
individuato. Il polimorfismo, le tecniche di stealth, quelle di tunnelling sono tra le
migliori da usare ma non sufficienti a garantire la sopravvivenza del virus.
Per realizzare un computer virus difficile da eliminare, se ne dovrebbe creare uno, dalla cui vita, dipende
quella del file o sistema ospite.
In parole povere, se il computer virus non funziona allora neanche il sistema lo farà.
Normalmente quello che succede è il contrario. Quest'idea è stata già adottata per alcuni
virus, tra i quali: One-Half, LZR, AIDS e KOHN_6 [Hof97].
Attacco crittografico ibrido
Definizione 3.1
Le fasi dell'attacco crittovirologo si possono delineare in questa sequenza :
il crittovirus F cifra un dato critico D (ottenendo D') su un sistema S che contiene diverse
risorse (software e hardware) utilizzate da un utente U
F si manifesta all'utente U e gli chiede di contattare il suo autore
l'autore del crittovirus, una volta contattato, richiede un riscatto in cambio della chiave
privata
ottenuta la chiave privata, l'utente U può decifrare D' per ottenere D
Dal punto di vista dell'hacker, questo metodo ha lo svantaggio che liberando una
sola vittima, potenzialmente, libera anche tutte le altre, visto che ha usato un crittosistema
a chiave privata, quest'ultima è unica.
Questi virus hanno un codice che non occupa più di sei settori.
Algoritmo di lavoro:
Esso, si installa in memoria riservando per sè tra i 3 Kbyte ed i 7 Kbyte di RAM.
Si nasconde al rilevamento, intercettando qualsiasi interrupt (come
ad esempio l'INT 21h) che possa interrogare il Boot sector in modo da reindirizzare la lettura del boot alla
locazione dove ha provveduto a salvare il Boot sector originale.
3.6.3 Tunnelling
Le modalità d'infezione, cambiano a seconda che l'infezione si propaghi:
Il nuovo MBR è polimorfo e cifrato. Ciò significa che, a parte le nuove
informazioni sulla nuova partizione, il resto dell'MBR è diverso da qualunque altro 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 nell'MBR. Fatto
ciò, il virus, 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 infetto, 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 sull'MBR dei dischi fissi.
I file con estensione COM sono incrementati di 2846 byte e
quelli EXE di 2926 byte.
L'unico limite per i file con estensione COM è dovuto al fatto che non possono superare i 64 Kbyte,
perciò se loro lunghezza è superiore a 62690 byte, l'infezione da parte del virus non avviene.
L'allungamento dei file tuttavia può essere
diverso a seconda della variante del virus che impieghi altri tipi di checksum per il riconoscimento.
Quindi il virus, non modifica la tavola dei vettori di interrupt e per questo
motivo, sfugge a quei programmi antivirus che rilevano la presenza di un virus proprio quando il
vettore di interrupt viene modificato.
In questo modo il virus ottiene tre importanti risultati:
Ogni mattina, degli addetti (il BIOS ed il DOS), pongono i
dischi da ascoltare (le routine degli interrupt) in una particolare posizione negli scaffali (area
particolare della RAM) e preparano una tabella (tavola dei vettori) in cui i dischi sono disposti sempre
nello stesso ordine alfabetico (ordinamento costante dei vettori d'interrupt nell'omonima tabella). Ogni
coppia d'inservienti prepara la tabella indicando, a fianco di ciascun titolo, la posizione del disco
sullo scaffale. Se un sabotatore (il virus), vuole danneggiare un programma, può
scambiare, di nascosto, gli indirizzi dei dischi scritti sulla tabella (soluzione naive facilmente riconoscibile
da un adetto al controllo della tabella) oppure nota l'esatta posizione
dei dischi, sostituisce un disco con un altro negli scaffali, quando gli inservienti si accingono a
predisporre lo studio per la trasmissione radiofonica.
E' proprio questo che accade quando il virus si pone residente in RAM attraverso un
riavvio da disco precedentemente infettato. 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. Agendo così il virus ha il pieno controllo sulle richieste di tali interrupt che giungono
dal sistema operativo.
Il messaggio contenuto all'interno dei file infetti è il seguente :
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.
3.6.4 Altre tecniche
One-Half cifra il disco fisso usando un sistema di cifratura simmetrico e
memorizza la chiave segreta
nel corpo del proprio codice. Per liberare la macchina dall'ospite sgradito, basta ottenere
la chiave dal corpo del computer virus.
Le considerazioni effettuate fino ad ora ci portano alla definizione del concetto d'attacco
critto-virologo che può essere effettuato da un crittovirus, definito nel seguente modo:
Un crittovirus [YY96] è un computer virus
(cavallo di Troia)
che usa una chiave pubblica generata dall'autore per
cifrare un dato (o risorsa) D che risiede sul sistema ospite, in modo tale che D può essere
ripristinato (utilizzando la chiave privata) solo dall'autore del virus (supponendo che non
esistano dei backup recenti).
Un ulteriore svantaggio è dovuto al fatto che cifrare
un file direttamente con la chiave pubblica è un processo lento e facilmente rilevabile.
La soluzione a questi problemi è l'impiego di un crittosistema ibrido, nel quale la chiave di
sessione (chiave generata a caso dal virus) è usata per cifrare il dato critico. Se il crittovirus
genera una chiave di sessione abbastanza grande e cifra quest'ultima con la chiave pubblica
per ogni macchina attaccata, allora molto probabilmente, ciascuna vittima avrà bisogno di
una chiave differente per riottenere le proprie informazioni. A questo punto, l'autore non
sarà costretto a rilevare la chiave privata alle vittime, infatti, chiede che gli venga mandato
un messaggio cifrato contenente la chiave di sessione ed eventuali informazioni aggiuntive, preparato
dal virus stesso. Chiaramente, l'autore una volta ricevuto il messaggio, ed estorto quello che voleva
(informazioni e/o soldi), lo decifra con la chiave privata ed invia la chiave di sessione alla vittima
insieme alle informazioni necessarie al ripristino del dato D.
In particolare un crittovirus è equipaggiato con un buon generatore di numeri casuali in modo da
generare una chiave di
sessione casuale Ks ed un vettore casuale di inizializzazione IV.
Notazione usata:
U
utente o vittima del virus
F
virus
w
autore
Ks
chiave di sessione
Kf
chiave pubblica
IV
vettore di inizializzazione casuale
Kw
chiave privata
D
dato originale
Il virus forma il messaggio m = { IV, Ks } (plaintext) utilizzando il vettore IV e la chiave Ks, lo
cifra con la chiave pubblica Kf ottenendo il messaggio cifrato m' = { IV, Ks, Kf } (ciphertext).
Il virus poi cifra i dati critici del sistema usando Ks, IV e l'algoritmo di cifratura
simmetrico scelto. Ovviamente D (il dato originale) è distrutto.
A questo punto il virus rileva la propria presenza all'utente
U visualizzando un messaggio contenente m', con le informazioni per contattare w. Una volta
che U ha contattato l'autore w, deve inviargli m' insieme al riscatto. Quindi w decifra m' usando
la chiave privata Kw e invia la chiave di sessione Ks e IV alla vittima U. Poiché
quest'ultima non viene a conoscenza di Kw, è incapace di aiutare le altre vittime del
crittovirus.
Questo attacco è del tipo denial of service reversibile poiché, comunicando con le
vittime, l'autore w riesce a restituire il dato che era bloccato (denied). Questo contrasta con la
definizione tradizionale di attacco denial of service nel quale, il dato è bloccato per sempre
(cancellato).
Attacco per estorcere informazioni
Nell'attacco per estorcere informazioni, l'autore W del virus costringe la vittima U a fornire informazioni
in cambio della chiave di sessione Ks e del vettore d'inizializzazione IV, ed in più fornisce un
meccanismo per verificare l'autenticità del dato che viene estorto. Questo attacco può
avere successo solo se il virus riesce a cifrare delle informazioni critiche che non
possono essere rimpiazzate dalla vittima. Questo attacco utilizza l'attacco
crittografico ibrido con alcune modifiche.
Infatti, può estorcere delle risorse, ma viene anche usato come strumento per lo spionaggio e
raccolta illegale di informazioni industriali e/o commerciali.
L'attacco permette ad un autore di virus W di richiedere un
file di grandezza arbitraria includendo il checksum ChkSum di tale
file nel messaggio m. In questo attacco, w richiede il file desiderato insieme al testo cifrato del
messaggio m (ciphertext).
La notazione usata è illustrata di seguito:
m = {ChkSum, IV, Ks} m' = {ChkSum, IV, Ks} Kf = chiave pubblica di w nel virus F Kw = chiave privata di w ChkSum = ChkSum del file richiesto da w IV = vettore di inizializzazione (casuale) Ks = chiave di sessione (casuale )
L'unico valore che non é strettamente casuale é ChkSum, che é funzione della chiave di
sessione Ks, IV e del file richiesto.
L'attacco procede in questo modo:
il virus F, scritto da w, è programmato per cercare il dato critico D e il dato desiderato H
una volta giunto sul giusto sistema ospite S, il virus inizia un attacco crittografico ibrido
F genera IV e Ks, usando il generatore di numeri casuali contenuto nel proprio codice
F usa un algoritmo di cifratura simmetrica per cifrare D, e distrugge il dato originale D lasciando al suo posto il cifrato D'
il virus cerca il dato H da estorcere, se lo trova ne ricava il checksum ChkSum, ottenuto utilizzando H, IV, Ks, ed un algoritmo di cifratura simmetrica, come ad esempio MAC in modalità CFB.
il virus F compone il messaggio m e lo cifra con Kf ottenendo m', distruggendo l'immagine di m presente nella RAM
il virus mostra m' all'utente e gli dice di mandare m' ed H all'autore del virus secondo una certa modalità
la vittima seguendo le istruzioni fornite da F spedisce a W, il testo cifrato m' ed il dato H
l'autore del virus decifra m' con Kw ed estrae IV, Ks e ChkSum
w poi esegue un checksum su H usando IV e Ks e confronta il risultato con ChkSum. Se CheckSum corrisponde, w capisce che H è autentico ed invia Ks ed IV alla vittima. Altrimenti w capisce che la vittima ha alterato H e non gli invia nulla.
Supponendo che la vittima voglia ingannare w, e se la vittima non vuole conoscere Ks allora può
spedire a w un H di sua scelta e il corrispondente m', ricavati scegliendo un H a caso ed
eseguendo le stesse operazioni fatte dal virus su H. La vittima può fare questo solo se
possiede una copia di backup di D.
Supponendo che la vittima vuole Ks ed IV ma non vuole
dare H a w: potrebbe fare ciò o modificando H e lasciando m' inalterato o modificandoli
entrambi. Se la vittima invia m' con un H alterato, l'autore se ne accorgerà quando computa
il checksum di H. Se la vittima gli manda entrambi alterati, poiché non conosce Kw,
l'alterazione di m' non sarà corretta e con molta probabilità sarà rilevata quando w
computa il checksum di H.
Supponendo per assurdo che il checksum corrisponda, la vittima riceverà sicuramente un Ks
non buono. L'unica speranza della vittima é quella di catturare Ks ed IV durante il breve
periodo di permanenza di questi valori nella RAM.
Conclusioni
Mandare le informazioni all'autore di un virus che effettua tali tipi di attacchi, non
comporta assolutamente la scoperta dell'autore: infatti, le informazioni (cifrate con la
chiave pubblica dell'autore del virus) possono essere depositate in una bacheca elettronica
pubblica oppure postate in un newsgroup.
L'autore allora può prelevarle facendo perdere le sue tracce. Si potrebbe utilizzare un crittovirus per rubare delle informazioni da un sito remoto e sfruttare la diffusione virale come mezzo di comunicazione. Anziché annunciare la propria presenza dopo aver cifrato il dato D, il crittovirus protrebbe inglobare il dato cifrato D' nel suo corpo e continuare a diffondersi. Se il virus con le informazioni al suo interno incontra un suo antenato o fratello duplica il suo fardello e lo cede al suo clone. In questo modo sperando che la diffusione virale non sia rilevata, l'autore può essere tanto fortunato da incontrare il virus con le informazioni incorporate. A questo punto, utilizzando la sua chiave privata Kw decifra D' ed ottiene, senza correre alcun rischio, le informazioni cercate. Il virus é un ottimo mezzo di comunicazione poiché solo l'autore ha l'abilitá di decifrare D' e nessun altro può recuperare il lavoro svolto dal virus.
Lo scenario fin qui delineato potrebbe sembrare solo teorico, ma non lo è affatto, Adam Young e Moti Yung [YY96] hanno effettivamente descritto ed implementato (vedi appendice) un crittovirus per APPLE Macintosh utilizzando RSA per la cifratura a chiave pubblica, TEA (acronimo di Tiny Encryption Algoritm) per la cifratura del dato critico, truerand.c di D. P. Mitchell e Matt Blaze per la generazione dei numeri casuali (chiave di sessione e vettore di inizializzazione).
![]() |
![]() |