# Vulnerabilità informatica

Una vulnerabilità informatica è un difetto o una debolezza nel progetto, nella realizzazione o nel funzionamento e nella gestione di un sistema informatico, che potrebbe essere sfruttato per violare la politica di sicurezza del sistema.
La parola "vulnerabilità", che può anche essere riferita a persone, individui singoli o gruppi di individui (gruppi o comunità di vulnerabili), nel campo informatico indica una debolezza che può consentire ad un attacco informatico di compromettere un sistema, cioè di ridurre il livello di protezione fornito da tale sistema, fino al caso limite di inficiarne il funzionamento.
Particolarmente importanti sono le vulnerabilità dei sistemi informatici nei confronti di hacker o cracker.

## Minaccia

Il concetto di vulnerabilità non va confuso con la minaccia, che è l'elemento attivo di potenziale innesco di un rischio. La minaccia è cioè l'agente che, sfruttando una vulnerabilità, potrebbe arrecare un disturbo, un attacco, un danno al sistema. Le minacce informatiche sono di vario tipo (ovviamente ci sono anche quelle di natura non informatica).
In pratica, la minaccia è la causa scatenante (spesso non controllabile direttamente), la vulnerabilità è la con-causa (questa sì controllabile) che consente l'azione della minaccia e quindi il manifestarsi del rischio e del relativo effetto (impatto, conseguenza).

## Tipologie

Le vulnerabilità si possono presentare a qualsiasi livello di un sistema informatico, ne esistono principalmente di due tipi:
* Vulnerabilità software (bug software): Si presenta ovunque ci sia un difetto di progettazione, codifica, installazione e configurazione del software. Le vulnerabilità software dovute a difetti di progettazione e codifica sono causate principalmente dalla mediazione incompleta dei dati forniti in input direttamente dall'utente e mancanza di controlli di sistema; un esempio classico è il buffer overflow, che permette ad un attaccante di inserire un volume di dati superiore alla dimensione prestabilita e riversare i dati in eccesso nello stack, sovrascrivendo l'instruction pointer che potrebbe puntare ad un programma (tipicamente uno Shellcode) opportunamente creato per compiere effetti indesiderati.
* Vulnerabilità dei protocolli: si manifestano quando i protocolli di comunicazione non considerano i problemi legati alla sicurezza; l'esempio classico di vulnerabilità consiste nel permettere una connessione in chiaro (non crittografata) consentendo a possibili malintenzionati di intercettare le informazioni scambiate (eavesdropping) (es. Telnet). Il fatto che la documentazione (RFC) che descrive come questi protocolli debbano essere implementati sia pubblicamente disponibile permette ai possibili attaccanti e alle possibili vittime di conoscerne le debolezze. Tuttavia è altresì semplice scoprire le vulnerabilità di un protocollo, le cui specifiche non sono pubbliche, tramite procedure di reverse engineering del protocollo stesso. In tal caso, però, la vittima non è a conoscenza delle debolezze del protocollo e non ha strumenti per difendersi.
Le vulnerabilità quindi non compromettono un sistema, ma se utilizzate da quella che viene definita una minaccia (azione indesiderata) possono trasformarsi in un evento indesiderato.
Si possono trovare vulnerabilità anche in ambito hardware. La presenza di umidità, polvere, sporco e supporti di memorizzazione non protetti, possono causare perdita di informazioni.
In ambito umano e sociale la vulnerabilità può essere definita come segue (definizione del IFRC): "la vulnerabilità è un concetto dinamico e relativo, in stretta relazione con la capacità di un individuo o di una comunità di far fronte in un determinato momento a particolari minacce. La vulnerabilità può essere associata a certi elementi specifici della povertà, ma è anche propria di individui isolati, in situazioni di insicurezza ed indifesi da rischi, da shock e stress".
Con questa accezione, in ambito sociale, possono essere definiti i "gruppi vulnerabili" come: "persone o gruppi di persone esposte a situazioni che minacciano la loro sopravvivenza o la loro attitudine a vivere con un minimo di sicurezza sociale ed economica e di dignità umana", come ad esempio in caso di anziani, disabili, immigrati, minori, donne in difficoltà, carcerati, tossicodipendenti, pazienti ospedalizzati, etc.

## Cause

Una vulnerabilità può essere causata da:
* Complessità: Sistemi informatici molto grandi e complessi, possono essere causa di falle e involontari punti di accesso.
* Connettività: Più sono presenti porte, protocolli, privilegi, connessioni fisiche e servizi, e più il tempo in cui queste sono accessibili, più è probabile la presenza di un attacco.
* Password: L'utente utilizza password deboli, facilmente soggette a password cracking attraverso il metodo "forza bruta", oppure utilizza troppo spesso la stessa password o la memorizza nel computer.
* Sistemi operativi basilari: Certi sistemi operativi permettono agli utenti e ai programmi un ampio accesso alle risorse, permettendo tutto ciò che non è stato esplicitamente negato. Questa politica, sebbene più funzionale, permette a virus e malware di eseguire comandi a livello amministratore.
* Navigazione in Internet: Certi siti possono contenere Spyware o Adware che vanno ad infettare il dispositivo, rubando informazioni personali.
* Bug Software: In un programma viene lasciato un bug. Questo potrebbe essere sfruttabile per un possibile attacco all'applicazione.
* Mancanza di controllo degli Input: Un programma può assumere che tutti gli input dell'utente siano sicuri, permettendo la diretta esecuzione di programmi e istruzioni SQL, causando Buffer overflow, SQL injection o vulnerabilità di formato della stringa.
* Non imparare dagli errori: Quando un programmatore ripete gli stessi errori in nuovi programmi, aumenta la possibilità che questi siano conosciuti e quindi attaccabili. Si veda, ad esempio, le vulnerabilità nei protocolli IPv4, scoperte essere ancora presenti nei nuovi IPv6.
Ricerche dimostrano che il punto più vulnerabile di un sistema informatico è il fattore umano (utente, progettista, operatore). L'ingegneria sociale è un problema in continua crescita nell'ambito della sicurezza informatica.

## Prevenzione

Generalmente è più facile intervenire (contromisure) sulle vulnerabilità piuttosto che sulle minacce, spesso da considerare "fisiologiche" in un determinato contesto (il malware, un ladro, un incendio, l'azione dolosa, l'errore umano sono esempi di minacce che possono sfruttare vulnerabilità: assenza o non aggiornamento di un sistema antimalware, assenza o scarsezza di un impianto antintrusione, sistema antincendio non manutenuto, inadeguatezza addestramento, insufficienza di metodo/procedura/regolamento/contratto). In pratica le minacce, attraverso le vulnerabilità del sistema, generano rischi, i quali comportano effetti (potenziali). Tutta la catena è espressa in termini di: impatto (gravità, severità), probabilità, rilevabilità.

## Ricerca

La ricerca delle vulnerabilità di sistema può essere svolta sia da aziende specializzate sia da eventi appositamente organizzati, con o senza premi in denaro per le vulnerabilità scovate. Dal primo decennio degli anni 2000 queste ricerche hanno compreso sempre di più i dispositivi mobili quali gli smartphone, in modo del tutto analogo all'ambito PC, in alcuni casi queste ricerche hanno permesso d'individuare una vulnerabilità comune su più piattaforme, anche se non sempre hanno gli stessi potenziali riscontri.
Con l'analisi delle vulnerabilità e l'evoluzione dei tempi si è anche notato che i sistemi che una volta erano più vulnerabili sono diventati meno esposti (meno vulnerabilità) e sistemi che avevano poche vulnerabilità siano diventati molto esposti, infatti prendendo in esempio Apple nel 2012 questa è l'azienda con il più alto numero di vulnerabilità, mentre la controparte Microsoft in passato molta esposta al cybercrimine, sia diventata più virtuosa con meno della metà delle vulnerabilità di Apple.
In ambito sociale le vulnerabilità di individui e comunità devono essere affrontate da strutture specializzate e da operatori esperti nel campo dell'assistenza sociale, operanti sia nel settore pubblico che nel privato (servizi sociali, fondazioni, onlus, cooperative, società del terzo settore).

### Divulgazione di una vulnerabilità

La divulgazione di una vulnerabilità (vulnerability disclosure) è la segnalazione di una falla in un computer a livello software o hardware. Solitamente, gli sviluppatori aspettano una patch che risolva il problema prima di rendere la vulnerabilità pubblica.
Possibili tipi di divulgazione sono:
* Self-disclosure: Quando lo sviluppatore stesso scopre la vulnerabilità e la rende pubblica assieme alla patch.
* Third-party disclosure: Una figura terza all'azienda e agli acquirenti (solitamente un ricercatore nel campo della sicurezza) denuncia la vulnerabilità scoperta, solitamente ad un'organizzazione come il CERT.
* Vendor disclosure: Quando la falla viene riportata dai ricercatori solamente agli sviluppatori.
* Full disclosure: La vulnerabilità viene esposta pubblicamente al momento della scoperta.
Una vulnerabilità potrebbe anche essere scoperta, ma mai segnalata: questa diventa una vulnerabilità definita 0-day. Questa tipologia ha creato un vero e proprio mercato. Le 0-day sono infatti facilmente vendibili in anonimato e senza bisogno di intermediari.

### Processo di segnalazione

Generalmente, il processo è composto dai seguenti passi:
* Scoperta della vulnerabilità e attestazione tramite codice o screenshot;
* Denuncia della scoperta agli sviluppatori tramite una relazione contenente valide prove che attestino la falla;
* Investigazione e costruzione di una patch per risolvere il problema;
* A patch ultimata (oppure al raggiungimento del tempo limite stabilito, a seconda della policy dell'azienda), il ricercatore pubblica una full-disclosure.