next up previous contents
Successivo: Le nuove frontiere Su: Tecniche avanzate usate dai Precedente: Stealth Viruses

UNIX è immune dai virus?

Una fonte di notizie sui computer virus e sulla Computer Security è la Usenet [1] [2] [4]. Da una lettura assidua di tali aree si vede che molto raramente si parla di virus per UNIX o di informazioni collegate al mondo UNIX, e nessuna volta si parla di infezioni avvenute nel mondo UNIX. Ma ciò non vuol dire che il problema ``virus'' non esista per UNIX, vuol dire solo che sotto UNIX tale problema è leggermente diverso: vediamo come e perché dando un'idea generale di come UNIX resiste agli attacchi virali.

Ci sono diversi modi di creare programmi che (con i dovuti privilegi) possono agganciarsi ad altri programmi: in particolar modo è relativamente semplice scriverne qualcuno in shell script, in AWK, in M4, additittura in macro di troff, o macro Postscript [Bey90]. Noi ci concentreremo su di un tipo di file eseguibili: i programmi binari.

Il problema principale nella creazione di un virus (in generale) è quello di aggiungere un pezzo di codice eseguibile ``autonomo'' ad un file eseguibile esistente. Bisogna creare un meccanismo tale che il virus possa autoreplicarsi, senza del quale non può propagarsi. L'autonomia del codice di un virus è dovuta all'utilizzo diretto dell'assembler per le library calls open, read, write, etc. Il virus deve essere capace di girare in ogni parte della memoria (codice rilocabile). Quindi, non è possibile usare da parte di un codice virale le sezioni DATA e BSS, che sono tutti dati locali che devono essere mantenuti sullo stack [BSD88]. Le chiamate alle routine di libreria in assembler devono essere fatte utilizzando un tabella di indirezione che deve essere tenuta aggiornata e copiata nel file target. Il virus per essere eseguito deve essere caricato in memoria. Può essere contenuto nel file eseguibile dopo la DATA section originale. La grandezza di questa sezione è contenuta nell'header del file eseguibile, e deve essere aggiustata nel file target per permettere che venga caricato il codice del virus. Il codice del virus, ora caricato verrà eseguito quando il programma comincerà a girare. Quindi il virus dovrà conoscere bene la struttura del tipo di file eseguibile che vorrà infettare, nel caso di UNIX il formato COFFgif. Si vede chiaramente che per scrivere un tale codice bisogna conoscere il C, la struttura dei file eseguibili (COFF), ed il sistema operativo che si sta utilizzando. Quindi una tale ``opera'' non è qualcosa che un utente medio di UNIX possa realizzare.

Per evitare l'esecuzione di un virus quando si lancia un programma, dobbiamo controllare che tale file non sia stato modificato, cioè che la sua integrità sia intatta. Con programmi che manipolano dati importanti, è possibile aggiungere un sequenza iniziale di protezione nel modo seguente:

main(argc, argv)
/* Controlla l'integrita' di questo programma.   */
if (make_checksum(argv[0]) != CHECKSUM)   
    /* make_checksum potrebbe essere una funzione Hash */
{
    printf(" Attenzione ! Il programma e' stato modificato.");
    /* sarebbe meglio aggiungere    unlink(argv[0]);   */
    exit(2);
}

Esistono altri metodi che permettono al software di preservare la loro integrità. L'introduzione relativamente recente delle smart cards fornisce una procedura non falsificabile per controllare l'origine e l'integrità del software. Questo è un mezzo intelligente per ``sigillare'' e controllare le informazioni: la smart card contiene un piccolo micro-chip dal quale prelevare delle chiavi per decrittare e ``verificare'' i programmi.

Anche per UNIX, come per il mondo PC, il meccanismo della propagazione, attraverso la replicazione, è una delle componenti essenziali del virus. Ma forse non è poi tanto conosciuto. Una volta che il virus è stato identificato è normalmente impossibile dire da dove il virus ha avuto origine. Per esempio, quello si può dire è che un certo programma per X-Windows è stato infettato. Se poi il virus si rivela solo al verificarsi di certe condizioni, allora è impossibile predeterminare l'estensione dell'infezione. La propagazione è difficile da predeterminare. La trasmissione da un sistema ad un altro è equamente probabile. Ci sono essenzialmente due modi per diffondere la contaminazione da un sistema all'altro: lo scambio di media contenente programmi infetti, e l'utilizzo di reti. In entrambi i casi l'utente di un sistema è ignaro del fatto che il programma che vuole usare contiene un virus. Non ci sono metodi generali per diagnosticare la presenza di un virus: esaminare un file binario non è molto utile; perfino guardare i sorgenti di un programma può non essere efficace a causa della loro complessità. Per esempio se consideriamo un virus scritto in 200-300 linee di codice C, messe all'interno di un programma di circa 5000 linee di codice come il Kermit, risulta praticamente impossibile distinguere un eventuale codice virale. L'unica cosa che possiamo fare è utilizzare programmi per la ``detection'' di un virus, ma visto che spesso (ogni giorno nel mondo PC) compaiono nuovi virus, tale tecnica non è totalmente soddisfacente.

La propagazione può essere rallentata utilizzando dei meccanismi di sicurezza per quel sistema. Per questo motivo i PC sono un obiettivo primario: vista la totale assenza di un meccanismo di protezione da parte del sistema operativo ogni programma può scrivere nelle system tables o nei vettori di interruzione,

Uno dei principi fondamentali di UNIX, è che per un utente normale (per esempio un programma virus) è impossibile diventare super-user. Ciò diminuisce di molto il rischio di diffusione. Ma come molti ben sanno, alcuni sistemi non sono correttamente amministrati o configurati e quindi i virus possono trarre vantaggi da tali ``buchi''.

Il fattore umano è di grande importanza. Per esempio, si può mandare un programma infetto via e-mail con una nota di inizio: ``Questo benchmark misurerà le performance del vostro sistema NFS o X-Window''. Normalmente per utilizzare un benchmark in modo corretto bisogna farlo in super-user mode. A questo punto il gioco è fatto! Quanti amministratori di sistema si insospettiranno di tale e-mail?

Teoricamente, possiamo dire che la propagazione di un virus in ambiente UNIX si appoggia più a fattori umani che non a ``buchi'' veri e propri di UNIX.

In futuro la presenza di virus in ambiente UNIX dipenderà da tre fatti principali:


next up previous contents
Successivo: Le nuove frontiere Su: Tecniche avanzate usate dai Precedente: Stealth Viruses

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