Sostanzialmente nel software sono presenti delle falle (bug) che lo fanno agire in maniera non prevista. Tali falle possono essere opportunamente sfruttate da persone che ne sono a conoscenza per accedere al sistema come se si trattasse di un utente dello stesso. Si parla in tal caso di exploit del programma. In particolare la persona esterna accede al sistema con i privilegi dell’utente con i quali viene eseguito il processo con la falla.
La sicurezza di un sistema dipende, oltre che dall’amministrazione dello stesso, anche dalla qualità del software che gira sul sistema stesso, sia quindi il sitema operativo che le applicazioni (server) che gestiscono i servizi messi a disposizione dalla macchina verso l’esterno (sulla rete). È per questo motivo che, è consigliabile avere sempre la versione stabile più recente di vari software che fanno da server per i servizi forniti all’esterno, poiché in questo modo si dovrebbero ridurre al minimo i bug che permettono delle vie di accesso al sistema (anche se non è detto che la nuova versione di un software non introduca ulteriori bug). Inoltre è altresì opportuno non permettere un accesso remoto al sistema in qualità di amministratore, per non rischiare che qualche malintenzionato riesca a carpire le credenziali di accesso e quindi a collegarsi al sistema come amministratore.
I cosiddetti cracker1 lanciano dei veri e propri attacchi ai sistemi per cercare di penetrarvi o per comprometterne comunque l’utilizzo (DoS - Denial of Service), adottando tecniche che si basano sulle falle del software dovute sia a cattiva scrittura del codice (chiamate a funzioni di sistema non controllate, ...) o addirittura codice errato (controlli errati, condizioni di funzionamento non testate, ...). È evidente che i bug possono essere di varia importanza per quanto riguarda la sicurezza: da quelli che comunque non permettono all’utente di accedere a funzionalità a lui non permesse a quelli che permettono all’utente di accedere anche ad una funzionalità a lui non permessa che seppur minima può aprire un varco nel sistema.
Una delle tecniche più utilizzate per tentare di penetrare in un sistema è il buffer overflow che permette di scrivere in una cella di memoria “casuale” un valore desiderato. A titolo di esempio, un programma scritto in C che chiama la funzione strcpy è soggetto a tale tipo di attacco (o come si dice in gergo exploit). La funzione strcpy copia il contenuto di una stringa all’interno di un’altra senza effettuare nessun controllo sulla lunghezza della stringa da copiare: quindi è possibile inserire una stringa di lunghezza superiore a quella effettivamnete contenibile all’interno della stringa di destinazione, cosicché i dati verranno memorizzati all’interno della stringa di destinazione finché questa ne può contenere ed il resto viene memorizzato nelle celle di memoria successive. In questo modo si può riuscire a sovrascrivere valori presenti in parti della memoria altrimenti inaccessibili che magari si riferiscono a variabili che controllano il funzionamento del processo. Quindi si può riuscire a far funzionare il processo in modo non previsto per l’utente in questione, peremettendo all’utente di compiere operazioni non previste. Si può addirittura arrivare a far lanciare al processo una shell con i permessi dell’utente con i quali gira il processo stesso.
[da completare ...]
I sistemi operativi attuali sono dei software generalmente ben testati e rodati che presentano ben poche falle di sicurezza (considerando soltanto le funzionalità di base). Visto che i bug dipendono dal software, ragionando anche semplicemente da un punto di vista statistico, più applicazioni sono in esecuzione in un sistema, più è probabile che vi siano bug che possono compromettere la sicurezza del sistema stesso. In genere quindi, più servizi vengono offerti da un sistema (web server, FTP server, SSH server, ...), più questo è soggetto ad avere falle di sicurezza. In riferimento ai sistemi GNU/Linux, sono i processi (demoni) relativi ai servizi come httpd, ftpd, sshd, ..., che possono presentare falle che possono compromettere la sicurezza del sistema. Per questo motivo è consigliabile offrire all’esterno il minor numero di servizi possibile, o per lo meno controllare chi è che comunica da remoto con il sistema considerato (anche se esistono comunque dei meccanismi di “falsificazione” dei pacchetti relativi alla comunicazione). A tal proposito si può decidere di non attivare determinati servizi non lanciando in esecuzione i relativi demoni o se si desidera utilizzare certi servizi su una rete che si ritiene sicura (una rete privata che si ha sotto controllo) e non renderli disponibili per chiunque (Internet) si possono definire delle politiche di accesso ai servizi offerti dal sistema tramite un firewall.
Il meccanismo di comunicazione stessa permette tra l’altro la possibilità di procurare dei malfunzionamenti a sistemi remoti a causa di un suo uso non “canonico”. Esistono quindi “attacchi” a sistemi, i più noti dei quali sono di seguito riportati, che mirano a compromettere l’utilizzo dei servizi da essi offerti.
L’attacco consiste nell’inviare un numero molto elevato di richieste di connessioni fittizie, ovvero un numero elevato di SYN segment (da cui il nome SYN flooding), in maniera tale che il server non riesca più a rispondere ad altre richieste poiché è troppo impegnato a rispondere a quelle che sta ricevendo. Si crea così un DoS. Il server, che magari non è stato pensato per gestire un numero di connessioni troppo elevato, potrebbe persino comportarsi in maniera anomala e/o contenere dei bug che l’attaccante può sfruttare per accedere al sistema.
[da completare ...]