2. Internet
In questo paragrafo vengono brevemente descritti i servizi Internet di maggiore interesse, il loro funzionamento e alcuni problemi di sicurezza connessi.
I servizi Internet sono gestiti con meccanismi di tipo
client/server: nella maggior parte dei casi un sistema rende disponibile un
determinato servizio mandando in esecuzione il processo server corrispondente,
cioè un demone che si pone in ascolto di richieste sulla porta logica assegnata
a quel particolare servizio; un sistema che vuole richiedere un servizio remoto
utilizza un’applicazione client, a cui viene assegnata una porta non utilizzata
da altri processi, che invia la richiesta di servizio verificando la
disponibilità del demone sul sistema remoto.
Per convenzione i numeri di porta utilizzati dai processi
client sono quelli maggiori di 1024, mentre quelli minori o uguali a 1024 sono
riservati ai processi server o a processi privilegiati.
Se, ad esempio, una macchina con indirizzo 193.22.204.16
vuole trasferire file mediante il servizio FTP
(File Transfer Protocol) dalla macchina con indirizzo 142.220.70.8,
attiverà un client FTP che per prima cosa farà richiesta di un numero di porta
non utilizzato (ad esempio 4092), ed invierà un messaggio contenente, oltre
agli indirizzi sorgente e destinazione, il numero di porta assegnato e il
numero di porta convenzionalmente stabilito per il server FTP, in questo caso
21 (Figura 1).
Figura 1: Scambio di pacchetti FTP
I processi che realizzano servizi Internet possono essere
gestiti in due modi diversi: possono essere lanciati all’avvio del sistema e
rimanere sempre in esecuzione oppure essere eseguiti al momento della richiesta
del servizio.
Il primo tipo di gestitone è indicato per i server che
devono eseguire piccole transazioni velocemente e hanno necessità di mantenere
informazioni in memoria di lavoro; normalmente tra questi ci sono i server NFS (Network File System), SMTP (Simple Mail Transfer Protocol) e DNS (Domain Name Service). Questi server nei sistemi
UNIX vengono avviati da comandi di
shell eseguiti all’avvio della macchina e specificati nei
file /etc/rc. Il secondo tipo di gestione è generalmente utilizzato per
categorie di servizi che non vengono richiesti frequentemente, che non
risentono del ritardo dovuto all’avvio del processo, che richiedono nuove copie
del processo per trattare più richieste contemporaneamente (ad esempio per
sessioni telnet o FTP). Questi processi vengono chiamati dal demone inetd, un
processo che
viene eseguito all’avvio del sistema e si pone in ascolto di
richieste su tutte le porte dei servizi specificati nel suo file di
configurazione /etc/inetd.conf.
Nel momento in cui si presenta una richiesta ad una porta
specifica, inetd manda in esecuzione il processo corrispondente e questo si
disattiva dopo avere fornito il servizio.
Vengono ora descritti alcuni dei servizi di rete più
utilizzati.
L’insieme dei protocolli TCP/IP (Transmission Control
Protocol / Internet Protocol) è stato sviluppato per creare una rete di reti
(Internet). Le singole macchine sono connesse in reti locali, le quali si
affacciano sul resto del mondo, costituito da un’unione di analoghe reti
locali, tramite opportuni dispositivi di connessione e instradamento.
L’insieme dei protocolli TCP/IP è suddiviso in strati, in
base alle funzioni svolte dal singolo protocollo. Gli strati del protocollo
TCP/IP sono:
strato di Applicazione (include protocolli applicativi che
forniscono servizi direttamente agli utenti o fanno da supporto ad alcune
funzioni di sistema);
strato di Trasporto (fornisce servizi di consegna alle
applicazioni dello strato superiore);
strato di Rete (organizza i dati in datagrammi e ne
gestisce l’instradamento).
L’ultimo strato si appoggia sempre su un protocollo di basso
livello, come ad esempio Ethernet,
Token Ring, X25, ecc. (Figura 2).
Figura 2: I protocolli della famiglia TCP/IP
I dati viaggiano sulla rete sotto forma di pacchetti. Quando
un’entità di rete invia dati, questi attraversano la pila degli strati TCP/IP
dall’alto verso il basso. Ogni strato nella pila aggiunge informazioni di
controllo allo scopo di assicurare una corretta consegna del pacchetto. Queste
informazioni di controllo sono chiamate intestazioni, poiché vengono poste
all’inizio dei dati che devono essere trasmessi. Ogni strato tratta tutte le
informazioni che riceve dallo strato superiore come dati e aggiunge la sua
intestazione all’inizio di tali informazioni. L’aggiunta di informazioni di
controllo viene chiamato incapsulamento.
Quando un’entità riceve dati il processo si inverte: man
mano che il pacchetto attraversa la pila degli strati dal basso verso l’alto,
ogni strato rimuove l’intestazione relativa e passa il pacchetto ad uno dei
protocolli del livello superiore in base alle informazioni di controllo
contenute nell’intestazione (Figura 3).
Al livello applicativo il pacchetto consiste semplicemente
dei dati che devono essere trasferiti (ad esempio una parte di una sessione
telnet); scendendo, gli strati intermedi di trasporto e di rete preservano i
dati aggiungendo le rispettive intestazioni, e lo strato inferiore aggiunge
l’intestazione del particolare canale utilizzato (ad esempio Ethernet). I
protocolli di questo strato forniscono il mezzo per spedire dati da una
macchina ad un’altra fisicamente collegata alla stessa rete e, a differenza dei
protocolli degli strati superiori, devono conoscere tutti i dettagli della rete
sottostante per una corretta trasmissione dei dati.
Se i pacchetti sono trasportati su una rete Ethernet,
l’intestazione Ethernet contiene l’indirizzo a 8 byte della macchina che ha
introdotto il messaggio sulla rete, l’indirizzo destinazione (un router sulla
stessa rete se la destinazione non appartiene alla rete locale) e un numero che
identifica il protocollo dello strato superiore (in questo caso IP). [2]
Strato Applicativo (FTP)
DATI
Intestazione
Strato di Trasporto (TCP)
DATI
Intestazione
Intestazione
Strato di Rete (IP)
DATI
Intestazione Intestazione
Checksum
Intestazione
Strati Inferiori
DATI
(Ethernet)
Figura 3: Esempio di incapsulamento dei dati
Questo servizio, probabilmente il più conosciuto, è impiegato
per scambiare messaggi attraverso la rete utilizzando come protocollo SMTP. Il
numero di porta stabilito per i server SMTP è il 25 e il server SMTP più
diffuso tra i sistemi UNIX è il programma Sendmail.
I server di posta elettronica sono particolarmente
vulnerabili, poiché accettano qualunque tipo di dati da tutti i sistemi
presenti sulla rete. Inoltre, essendo programmi piuttosto complessi, sono
soggetti a errori software che possono essere sfruttati per attaccare il
sistema su cui girano.
E’ un protocollo che permette il trasferimento di file da e
verso una macchina remota. A differenza della posta elettronica, mediante la
quale è possibile trasferire solo file ASCII (American Standard Code for
Information Interchange), FTP consente di trasferire ogni tipo di file binario.
I server FTP utilizzano due porte prestabilite, la porta 21 per pacchetti che
contengono comandi, la porta 20 per lo scambio dei dati.
Per accedere ai file messi a disposizione da un nodo della rete l’utente deve fornire un nome di login. In molti sistemi il server FTP è configurato in maniera tale da accettare richieste da un utente "anonymous", che è obbligato ad inserire una qualsiasi stringa come password, ma di solito è invitato ad inserire il proprio indirizzo di posta elettronica.
I principali problemi connessi alla gestione di un server
FTP che preveda collegamenti di tipo anonymous sono:
la possibilità che gli utenti possano accedere ad altre
aree del sistema oltre a quella contenente i file pubblici;
la possibilità che gli utenti esterni possano introdurre
file nell’area pubblica,
compromettendo la sicurezza dell’intero sistema. Accesso
tramite terminale remoto.
Fornisce accesso tramite terminale virtuale a sistemi remoti.
La porta assegnata al server telnet è la numero 23. Nel momento in cui ci si
collega ad un sistema remoto viene richiesto all’utente di identificarsi e di
autenticarsi inserendo il proprio nome di login e la propria password. Questo
meccanismo di identificazione e autenticazione presenta una vulnerabilità nota:
tutte le informazioni scambiate, e quindi anche le password, viaggiano in
chiaro sulla rete.
Telnet, inoltre, è parte integrante di un gran numero di
tecniche di attacco: viene utilizzato sia per eseguire comandi di sistema, nel
caso si riesca a ottenere l’accesso al sistema obiettivo, sia per interagire
direttamente con i server, nel caso si usi il client telnet per connettersi ad
altre porte.
Telnet quindi dovrebbe essere utilizzato solo all’interno di
una rete che si possa considerare fidata.
Il World Wide Web (WWW) è un servizio informativo costituito
da una collezione di server HTTP
(Hyper Text Transfer Protocol). La porta assegnata al server HTTP è la numero
80.
Questo servizio non prevede in generale meccanismi di
identificazione e autenticazione e utilizza una tecnologia ipertestuale per
collegare tra loro i documenti della rete WWW.
Il World Wide Web è la maniera più semplice, per un utente
che possa utilizzare un browser (un client HTTP), per accedere alle
informazioni in rete. Offrire questo servizio può sottoporre il sistema ad
alcune minacce alla sicurezza:
un attaccante può sfruttare eventuali errori software del
server HTTP o degli script CGI
(Common Gateway Interface) per ottenere accesso non autorizzato ad altri file
presenti sul file system del server o anche per ottenere il controllo della
macchina server;
un server mal configurato può involontariamente mettere a
disposizione informazioni confidenziali.
D’altra parte anche il lato client può essere minacciato: un
server può nascondere dei cavalli di Troia all’interno dei dati che trasferisce
(ad esempio sotto forma di file compressi) o inserire dei comandi maliziosi
all’interno di programmi Java.
Il servizio finger (porta 79) permette di ricavare
informazioni sugli utenti che hanno un account su un sistema. Se si interroga
un server finger su una macchina remota si ottiene come risposta l’elenco degli
utenti collegati al momento. Specificando il nome di un utente del sistema,
finger fornisce alcune informazioni sull’utente ricavate dall’archivio degli
account del sistema, la data e l’ora dell’ultimo collegamento, lo stato della
posta elettronica e, se presente, un messaggio personalizzato dall’utente.
Questo genere di informazioni è molto prezioso per gli attaccanti i quali
possono, ad esempio, individuare facilmente degli account raramente utilizzati.
Anche dal lato client il servizio può essere pericoloso: il
messaggio dell’utente può contenere dei caratteri di controllo che possono
provocare dei danni al sistema.
NFS è un protocollo che permette ai sistemi in rete di
importare file system remoti. Un server NFS mette a disposizione alcune
directory per l’esportazione e queste vengono aggiunte al file system dei
client in maniera trasparente. NFS fornisce dei metodi per controllare quali
macchine possano accedere ai file esportabili.
Nei sistemi UNIX il file /etc/exports specifica quali file
system possano essere esportati e quali macchine siano autorizzate a farlo.
Il servizio è particolarmente pericoloso soprattutto perché
non richiede autenticazione di utente, ma soltanto l’identificazione del nodo.
Di conseguenza è facile per un attaccante indurre il server NFS a credere che
una richiesta di esportazione file parta da un client autorizzato, anche se
questo non è vero.
DNS non è un servizio utilizzato a livello utente, ma viene
richiesto dai principali servizi di rete, quali telnet, FTP, SMTP, per
effettuare la traduzione da indirizzi simbolici a indirizzi numerici. Fornire
ed utilizzare questo servizio è quindi indispensabile per potere essere
effettivamente collegati ad Internet. DNS utilizza la porta 53.
Oltre che per la traduzione di indirizzi, DNS può essere
anche interrogato sulla composizione di tutta la rete che serve. Queste
informazioni, che non sono necessarie al funzionamento degli altri servizi,
forniscono ad un attaccante l’elenco dettagliato delle macchine e quindi di
tutti i possibili punti di attacco.