Gli 8 Errori più Pericolosi Commessi dai Web Developers

Una cosa che sorprende i profani è la presenza di errori banali all’interno di software anche famosi e popolari. Difficile spiegare a chi non si occupa di sviluppo software che un programma che funziona non è necessariamente un programma sicuro; così com’è difficile spiegare ai clienti la necessità di impiegare tempo (e quindi denaro) per implementare lo strato di sicurezza, cosa di cui non capiscono l’utilità (se non quando iniziano a strillare e sbraitare dopo l’attacco subito).

Ma se i clienti hanno il diritto di essere dei somari (anzi, forse addirittura il dovere, quasi un attributo antropologico), è incredibile che ancora oggi ci siano developers che non conoscono affatto i principi di programmazione sicura, non conoscono se non in modo superficiale (o per sentito dire) le vulnerabilità più comuni e gli effetti devastanti che esse generano.

Il risultato è che ancora oggi gli attacchi più clamorosi vengono portati a causa di un parametro passato alla query SQL senza essere stato prima bonificato, o di un dato sensibile memorizzato in chiaro, magari in un campo “nascosto” di una pagina html!

Il Mitre, in collaborazione con Sans Institute, ha pubblicato la lista dei 25 errori più comuni e pericolosi che commettono i programmatori, errori che aprono le porte agli attacchi più clamorosi, riportati ormai ampiamente dalla stampa non specializzata e pubblicati nelle prime pagine e nei notiziari più importanti.

Di questa lista ho estrapolato gli 8 errori più comuni commessi dagli sviluppatori nell’ambito dello sviluppo web, presentadoli con alcune note descrittive:

1. SQL-Injection: probabilmente la vulnerabilità più pericolosa degli ultimi anni (e del momento), causa pricipale dei clamorosi hacking degli ultimi tempi. Si tratta della possibilità del pirata di introdurre codice SQL per sovvertire la logica dell’accesso ai dati del database con risultati devastanti.

2. Command Injection: altro problema legato all’insufficiente validazione dell’input utente, che permette al pirata di introdurre comandi che saranno eseguiti direttamente dal sistema operativo.

3. Buffer Overflow: in questo caso ad essere prese alla leggera sono le dimensioni dell’input; se il pirata riesce a sfruttare un buffer-overflow può (fornendo un payload appositamente creato) iniettare codice macchina nel computer colpito, costringedolo a eseguire le istruzioni da lui inserite. Per approfondimenti rimando all’articolo sul buffer overflow che scrissi alcuni anni fa.

4. Cross-site Scripting: questa volta la validazione dell’input porta all’inserimento da parte del pirata di codice (per esempio Javascript) che verrà eseguito nel browser dell’utente al momento della visualizzazione della pagina web, azione che potrebbe per esempio finalizzarsi con il furto di un cookie di autenticazione, cosa che permetterebbe al pirata di accedere ad un servizio web (come una webmail per esempio) senza conoscere la password della vittima.

5. Mancanza di autenticazione: gli ingressi principali di un’azienda o di un edificio pubblico sono presidiati da agenti, da dispositivi biometrici o tornelli; altri accessi secondari invece vengono lasciati sguarniti (“chi vuoi che ci passi qui?”). In una web application spesso i programmatori adottano le corrette misure di autenticazione sulle pagine di front-end, ma dimenticano di adottarle su altri canali, cosa assai gradita ai pirati.

6. Mancanza di autorizzazione: non basta autenticare un utente, bisogna anche assicurarsi che abbia le necessarie autorizzazioni per compiere particolari azioni. Il fatto che abbia effettuato il login correttamente non gli conferisce il diritto di accedere anche ad aree riservate, di amministrazione e di sistema.

7. Informazioni sensibili non cifrate: altro grave errore che viene ancora commesso dai programmatori è quello di non proteggere con la crittografia informazioni sensibili. Tutto ciò che è dato sensibili che viaggi attraverso la rete o venga memorizzato da qualche parte, deve essere cifrato. Per esempio, le password devono essere memorizzate nel database in formato cifrato, tramite un algoritmo di hash non reversibile e possibilmente salted.

8. Errori nella gestione dell’upload: uno degli incubi più grandi per i programmatori di web-applications è quello di gestire gli upload di file da parte degli utenti, cercando di evitare che l’utente invii al server documenti non autorizzati, per esempio script che potrebbero contenere backdoor sfruttabili dal pirata per accedere al sistema.

A questi errori si aggiungono le ingenuità, di chi per esempio pretende di proteggeere i propri dati sviluppando da zero un algoritmo crittografico, o di chi testardamente decide di reinventare la ruota, ignorando che probabilmente la ruota è già stata inventata, e ottenendo spesso risultati poco efficienti (tipo ruota quadrata…).

Come si vede, gran parte degli errori di programmazione elencati qui sopra possono essere riassunti in 3 categorie: validazione degli input, autenticazione/autorizzazione, crittografia.

Considerando che la rete, le applicazioni web e mobili sono sempre più al centro dello sviluppo della civiltà globale, sarebbe opportuno accrescere il livello di sicurezza dei software partendo dalla base, ovvero lo sviluppo, sensibilizzando gli sviluppatori e includendo le tematiche di programmazione sicura nei percorsi formativi dei programmatori di domani.

1 Commento

  1. all’uni abbiamo studiato sia il C che il Java ma di sicurezza contro il buffer overflow ad esempio, non ne abbiamo mai parlato

1 Trackback / Pingback

  1. Raccolta di articoli della settimana 17/7/2011 | Saverio Gravagnola

I commenti sono bloccati.