analisi e gestione della sicurezza di una complessa applicazione ...
analisi e gestione della sicurezza di una complessa applicazione ...
analisi e gestione della sicurezza di una complessa applicazione ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
UNIVERSITÀ POLITECNICA DELLE MARCHE<br />
FACOLTÀ DI INGEGNERIA<br />
Corso <strong>di</strong> Laurea in Ingegneria Informatica (LS)<br />
ANALISI E GESTIONE DELLA SICUREZZA<br />
DI UNA COMPLESSA APPLICAZIONE<br />
WEB SECONDO LE LINEE GUIDA<br />
INTERNAZIONALI OWASP 2.0.<br />
RELATORE: LAUREANDO:<br />
chiar.mo Prof. A. F. Dragoni Vocino Angelo<br />
Anno Accademico 2006/2007
A mamma e papà,<br />
alla mia sorellina Grazia<br />
e a Francesca, <strong>una</strong> ragazza unica...<br />
Angelo<br />
“Se un uomo parte con delle certezze<br />
finirà con dei dubbi; ma se si<br />
accontenta <strong>di</strong> iniziare con qualche<br />
dubbio, arriverà alla fine a<br />
qualche certezza”<br />
F. Bacone
INDICE<br />
INDICE ..................................................................................................................................................... 1<br />
ELENCO DELLE FIGURE...................................................................................................................... 3<br />
CAPITOLO I - Introduzione ................................................................................................................... 5<br />
1.1 Obiettivo del lavoro .................................................................................................................. 6<br />
1.2 Struttura <strong>della</strong> tesi ................................................................................................................... 10<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione................................................................... 11<br />
2.1 Introduzione alle tecnologie usate in Talete: il framework .NET........................................... 12<br />
2.1.1 Le applicazioni Asp.NET................................................................................................ 13<br />
2.1.2 Il linguaggio C# .............................................................................................................. 15<br />
2.2 La tecnologia AJAX................................................................................................................ 16<br />
2.2.1 Le implicazioni <strong>di</strong> <strong>sicurezza</strong> <strong>di</strong> AJAX ............................................................................ 20<br />
2.3 Talete: come si presenta.......................................................................................................... 22<br />
2.4 Progettazione <strong>della</strong> piattaforma Talete ................................................................................... 24<br />
2.4.1 Analisi dei requisiti ......................................................................................................... 25<br />
2.4.2 Diagrammi UML............................................................................................................. 28<br />
2.4.3 Diagramma dei casi d’uso............................................................................................... 28<br />
2.4.4 Diagramma delle attività................................................................................................. 30<br />
2.4.5 Diagramma delle classi ................................................................................................... 33<br />
2.4.6 Implementazione <strong>della</strong> soluzione.................................................................................... 34<br />
2.4.7 Collaudo del sistema ....................................................................................................... 37<br />
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern............................................................ 40<br />
3.1 Introduzione alla progettazione <strong>di</strong> applicazioni object-oriented............................................. 41<br />
3.2 Il significato dei design pattern............................................................................................... 43<br />
3.3 Il cluster dei pattern GoF ........................................................................................................ 44<br />
3.4 I design pattern usati in Talete ................................................................................................ 46<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications ............................................................................ 52<br />
4.1 Introduzione ............................................................................................................................ 53<br />
4.2 Evoluzione degli attacchi........................................................................................................ 54<br />
4.3 Caratteristiche e problematiche legate alla <strong>sicurezza</strong> ............................................................. 56<br />
4.3.1 La <strong>sicurezza</strong> dei dati........................................................................................................ 57<br />
4.4 Certificati ................................................................................................................................ 59<br />
4.4.1 Come lavora SSL ............................................................................................................ 63<br />
4.4.2 Obiettivi SSL................................................................................................................... 66<br />
4.4.3 Come usare male SSL..................................................................................................... 66<br />
4.5 Principi <strong>di</strong> <strong>sicurezza</strong> in Asp.NET............................................................................................ 67<br />
4.5.1 Autenticazione e autorizzazione in Asp.NET................................................................. 69<br />
4.5.2 L’utente in Asp.NET: Principal e Identity...................................................................... 71<br />
4.5.3 Web.config: il tag ................................................................................. 75<br />
4.5.4 API per la <strong>sicurezza</strong> ........................................................................................................ 78<br />
4.6 Controlli per gestire l’accesso e l’autenticazione in Asp.NET 2.0 ......................................... 83<br />
4.7 La <strong>sicurezza</strong> in Asp.NET: il ViewState .................................................................................. 88<br />
4.7.1 Il ViewState in Asp.NET 2.0 ................................................................................................ 90<br />
1
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong> ...................................................... 93<br />
5.1 Architettura a più livelli <strong>di</strong> un’<strong>applicazione</strong> web.................................................................... 94<br />
5.2 L’SDL ..................................................................................................................................... 95<br />
5.3 Il threat modeling.................................................................................................................... 99<br />
5.4 “Microsoft Threat Analysis & Modeling Tool”.................................................................... 103<br />
5.5 Considerazioni sul threat modeling....................................................................................... 109<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP............................................................................ 111<br />
6.1 Progetto OWASP .................................................................................................................. 113<br />
6.2 Unvalidated input.................................................................................................................. 114<br />
6.2.1 SQL Injection................................................................................................................ 116<br />
6.2.2 Quanti danni può fare?.................................................................................................. 118<br />
6.2.3 Quale linguaggio e quale tecnologia? ........................................................................... 120<br />
6.2.4 Proteggersi dalla SQL injection .................................................................................... 122<br />
6.2.5 I vantaggi nascosti......................................................................................................... 123<br />
6.2.6 Tentativi <strong>di</strong> SQL Injection in Talete ............................................................................. 126<br />
6.3 Broken Access Control ......................................................................................................... 128<br />
6.4 Broken Authentication e Session Management .................................................................... 130<br />
6.5 Cross Site Scripting............................................................................................................... 135<br />
6.6 Buffer Overflow.................................................................................................................... 141<br />
6.7 Injection Flaw ....................................................................................................................... 142<br />
6.8 Improper Error Handling ...................................................................................................... 143<br />
6.9 Insecure Storage.................................................................................................................... 146<br />
6.10 Denial of Service................................................................................................................... 147<br />
6.11 Insecure Configuration Management.................................................................................... 149<br />
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete.................................................................. 151<br />
7.1 Gli strumenti per la <strong>sicurezza</strong> delle web applications........................................................... 152<br />
7.1.1 Analisi del co<strong>di</strong>ce sorgente ........................................................................................... 153<br />
7.1.2 Black-box scanner......................................................................................................... 153<br />
7.1.3 Altri strumenti............................................................................................................... 154<br />
7.2 “Web Vulnerability Scanner” ............................................................................................... 155<br />
Conclusioni e sviluppi futuri................................................................................................................. 160<br />
2
ELENCO DELLE FIGURE<br />
Figura 1 Home page <strong>di</strong> Talete.................................................................................................................. 8<br />
Figura 2 Generare co<strong>di</strong>ce con compilatori .NET.................................................................................. 12<br />
Figura 3 Struttura del framework .NET ................................................................................................. 13<br />
Figura 4 La natura asincrona <strong>di</strong> AJAX .................................................................................................. 18<br />
Figura 5 Ajax in Talete: RadAjaxPanel ................................................................................................. 19<br />
Figura 6 I 3 livelli <strong>di</strong> Talete.................................................................................................................... 22<br />
Figura 7 Aree <strong>di</strong> Talete........................................................................................................................... 23<br />
Figura 8 Applicazioni dell’area CdG <strong>di</strong> Talete...................................................................................... 23<br />
Figura 9 Anagrafiche dell’<strong>applicazione</strong> ORG <strong>di</strong> Talete ........................................................................ 23<br />
Figura 10 Funzionamento del sistema ................................................................................................... 27<br />
Figura 11 Diagramma dei casi d’uso..................................................................................................... 30<br />
Figura 12 Diagramma delle attività....................................................................................................... 32<br />
Figura 13 Diagramma delle classi......................................................................................................... 33<br />
Figura 14 Pagine <strong>di</strong> amministrazione .................................................................................................... 34<br />
Figura 15 Esempio <strong>di</strong> organizzazione: “AngeloChitarre” .................................................................... 35<br />
Figura 16 La pagina “Autorizzazioni” .................................................................................................. 35<br />
Figura 17 Albero con check nella pagina “Autorizzazioni”.................................................................. 36<br />
Figura 18 Il bottone “Salva i permessi” ................................................................................................ 37<br />
Figura 19 I 23 design pattern................................................................................................................. 45<br />
Figura 20 Template Method in Talete.................................................................................................... 50<br />
Figura 21 Statistiche degli attacchi nel 2007......................................................................................... 53<br />
Figura 22 Tipi <strong>di</strong> attacco........................................................................................................................ 55<br />
Figura 23 Co<strong>di</strong>ce <strong>di</strong> verifica <strong>di</strong> trasferimento su un canale sicuro........................................................ 61<br />
Figura 24 Accesso a Talete .................................................................................................................... 62<br />
Figura 25 Pacchetto con username e password..................................................................................... 62<br />
Figura 26 Fasi dell’SSL.......................................................................................................................... 65<br />
Figura 27 Modello <strong>di</strong> <strong>sicurezza</strong> in Asp.NET .......................................................................................... 68<br />
Figura 28 Interfaccia IIdentity ............................................................................................................... 72<br />
Figura 29 Interfaccia IPrincipal ............................................................................................................ 72<br />
Figura 30 Classe “TaleteIdentity” in Talete.......................................................................................... 74<br />
Figura 31 Interfaccia “IPrincipal” in Talete......................................................................................... 75<br />
Figura 32 Esempio n°1 <strong>di</strong> nel web.config .................................................................. 76<br />
Figura 33 Esempio n°2 <strong>di</strong> nel web.config .................................................................. 76<br />
Figura 34 Web.config <strong>di</strong> Talete.............................................................................................................. 77<br />
Figura 35 Autenticazione e autorizzazione in Asp.NET......................................................................... 78<br />
Figura 36 Membership API.................................................................................................................... 80<br />
Figura 37 Roles API ............................................................................................................................... 82<br />
Figura 38 Controllo “Login”................................................................................................................. 84<br />
Figura 39 Controllo “LoginStatus”....................................................................................................... 84<br />
Figura 40 Controllo “LoginName” ....................................................................................................... 84<br />
Figura 41 Controllo “LoginView”......................................................................................................... 85<br />
Figura 42 Controllo “LoginView” in Talete: LoggedInTemplate ......................................................... 85<br />
Figura 43 Controllo “LoginView”in Talete: AnonymousTemplate....................................................... 85<br />
3
Figura 44 Controllo “CreateUserWizard”............................................................................................ 86<br />
Figura 45 Controllo “ChangePassword”.............................................................................................. 87<br />
Figura 46 Controllo “PasswordRecovery” ........................................................................................... 87<br />
Figura 47 Esempio d’uso del ViewStateEncryptionMode..................................................................... 91<br />
Figura 48 Esempio d’uso del RegisterRequiresViewStateEncryption ................................................... 91<br />
Figura 49 Architettura a tre livelli ......................................................................................................... 95<br />
Figura 50 I tre aspetti dell’SDL ............................................................................................................. 97<br />
Figura 51 Cronologia dell’SDL ............................................................................................................. 98<br />
Figura 52 Elementi del “threat modeling” ......................................................................................... 100<br />
Figura 53 Threat Modeling: panoramica dell’architettura ................................................................. 100<br />
Figura 54 Threat modeling: livelli dell’architettura............................................................................ 101<br />
Figura 55 Threat Model Wizard........................................................................................................... 104<br />
Figura 56 Report del TAM: la matrice <strong>di</strong> accesso ............................................................................... 107<br />
Figura 57 Report del TAM: gli use case generati automaticamente.................................................... 107<br />
Figura 58 Report del TAM: le contromisure........................................................................................ 108<br />
Figura 59 Report del TAM: le best practices per evitare SQL Injection .............................................. 109<br />
Figura 60 Possibili attacchi sui 4 livelli <strong>di</strong> <strong>una</strong> web application......................................................... 112<br />
Figura 61 Logo OWASP....................................................................................................................... 113<br />
Figura 62 Protocollo HTTP ................................................................................................................. 115<br />
Figura 63 Uso dei parameters in Talete .............................................................................................. 121<br />
Figura 64 Conversione del DateTime nelle query SQL ....................................................................... 124<br />
Figura 65 Uso dei parameters con le date........................................................................................... 125<br />
Figura 66 Proprietà “Organizzazioni” <strong>della</strong> classe Concessionario.................................................. 126<br />
Figura 67 Gestione dei token <strong>di</strong> sessione............................................................................................. 131<br />
Figura 68 XSS con un sito vulnerabile................................................................................................. 135<br />
Figura 69 Esempio <strong>di</strong> attacco <strong>di</strong> “ cross site scripting”...................................................................... 137<br />
Figura 70 WVS: target e tecnologia da testare.................................................................................... 156<br />
Figura 71 WVS: opzioni <strong>di</strong> scansione .................................................................................................. 157<br />
Figura 72 Risultati <strong>della</strong> scansione con WVS ...................................................................................... 158<br />
4
CAPITOLO I - Introduzione<br />
5
1.1 Obiettivo del lavoro<br />
CAPITOLO I - Introduzione<br />
Contemporaneamente all’enorme crescita <strong>di</strong> Internet, è stato possibile registrare un enorme<br />
cambiamento delle applicazioni informatiche che stanno <strong>di</strong>ventando sempre più interconnesse<br />
tra loro. Fino a qualche tempo fa, i PC erano <strong>di</strong> solito delle “isole” <strong>di</strong> funzionalità, con poca, se<br />
non nulla, interconnessione e quin<strong>di</strong> non era un grosso problema se un’<strong>applicazione</strong> era<br />
insicura, l’importante era che svolgesse la sua mansione con successo; per questo l’argomento<br />
<strong>sicurezza</strong> non era assolutamente al centro dei pensieri <strong>di</strong> uno sviluppatore.<br />
Ormai i tempi sono cambiati. Nell’era <strong>di</strong> Internet, virtualmente tutti i computer – server,<br />
desktop PC, e i più recenti <strong>di</strong>spositivi tascabili – sono interconnessi tra loro. Sebbene questo<br />
crea notevoli possibilità <strong>di</strong> sviluppo per le aziende e per gli sviluppatori software, d’altra parte<br />
fa pensare anche che queste macchine interconnesse possano essere attaccate; Internet è un<br />
ambiente “ostile” e quin<strong>di</strong> bisogna progettare tutto il co<strong>di</strong>ce per <strong>di</strong>fendersi dalle minacce. In<br />
pratica quest’apertura al mondo attraverso il web porta con sé l’inevitabile conseguenza <strong>di</strong> <strong>una</strong><br />
maggiore vulnerabilità. Infatti, oltre agli utenti previsti per le applicazioni, è naturale entrare in<br />
contatto con utenti che abusano <strong>di</strong> esse per fini <strong>di</strong>versi da quelli per cui sono state progettate. E’<br />
necessario, dunque, proteggere il patrimonio informativo <strong>di</strong> un’azienda o <strong>di</strong> un ente pubblico da<br />
tutta <strong>una</strong> serie <strong>di</strong> aggressioni ed abusi.<br />
Da anni si registra un incremento costante degli attacchi alle architetture web-based tanto da<br />
costituirne oggi la modalità privilegiata. Dagli inizi del 2003 la maggior parte degli attacchi<br />
viene messa a segno utilizzando vulnerabilità legate ad errori <strong>di</strong> configurazione delle<br />
applicazioni o a fattori intrinseci. La <strong>di</strong>versificazione e tutte le combinazioni possibili rendono<br />
questi attacchi sempre più efficaci e <strong>di</strong>ffusi; un attacco può andare a compromettere <strong>una</strong><br />
qualsiasi delle componenti <strong>di</strong> un’architettura web, firewall <strong>di</strong> protezione perimetrale,<br />
webserver, middleware, applicativi, database e inoltre coinvolge <strong>di</strong>versi attori (sistemista,<br />
programmatore), chi attivamente chi inconsapevolmente e soprattutto l’utente finale.<br />
Ma perché sviluppare pensando da subito alla <strong>sicurezza</strong>? Alla domanda si cercherà <strong>di</strong><br />
rispondere con questo lavoro in cui, oltre all’<strong>analisi</strong> delle varie problematiche che riguardano la<br />
<strong>sicurezza</strong> delle applicazioni web seguendo le linee guida owasp 2.0, sono state applicate alcune<br />
6
CAPITOLO I - Introduzione<br />
tecniche e metodologie <strong>di</strong> protezione nello sviluppo <strong>di</strong> <strong>una</strong> piattaforma <strong>di</strong> nome “Talete” per<br />
ridurre notevolmente i punti d’attacco e le falle che potrebbero causare l’insuccesso <strong>di</strong> essa.<br />
Questo lavoro è <strong>di</strong>viso in 2 parti, sostanzialmente entrambe connesse all’argomento “<strong>sicurezza</strong><br />
in <strong>una</strong> web application”: nella prima, legata più all’implementazione <strong>di</strong> alcune pagine per il<br />
funzionamento <strong>della</strong> piattaforma, è stato gestito il meccanismo <strong>di</strong> accesso all’<strong>applicazione</strong> a<br />
seconda dei permessi che si hanno. Infatti gli utenti che accedono a Talete appartengono a<br />
categorie <strong>di</strong>verse: ci sono “Concessionari”, “Proprietari”, “Consulenti”, ecc.; tutti devono<br />
essere autenticati, ma solo alcuni possono vedere determinati dati, altri possono anche<br />
mo<strong>di</strong>ficarli e cosi via. Nella seconda parte sono state analizzate tutte le vulnerabilità critiche <strong>di</strong><br />
applicazioni <strong>di</strong> questo tipo valutando il grado <strong>di</strong> protezione e <strong>di</strong> <strong>sicurezza</strong> <strong>di</strong> Talete. Esso<br />
(http://www.talete.net) è un progetto per l’erogazione <strong>di</strong> servizi <strong>di</strong> consulenza alle imprese,<br />
attraverso lo sviluppo <strong>di</strong> <strong>una</strong> piattaforma per l’immagazzinamento dei dati (con database<br />
MySQL) e la <strong>gestione</strong> delle comunicazioni; si tratta <strong>di</strong> un’<strong>applicazione</strong> Asp.NET creata usando<br />
l’ambiente Microsoft Visual Stu<strong>di</strong>o 2005 e implementata usando C# come linguaggio <strong>di</strong><br />
programmazione.<br />
La piattaforma tecnologica ha un’interfaccia web, utilizza un’unica base <strong>di</strong> dati con<strong>di</strong>visa ed è<br />
composta dalle seguenti aree:<br />
1 Sistema per il controllo economico <strong>della</strong> <strong>gestione</strong><br />
2 Sistema <strong>di</strong> <strong>gestione</strong> per la qualità<br />
3 Sistema <strong>di</strong> <strong>gestione</strong> ambientale<br />
4 Sistema <strong>di</strong> <strong>gestione</strong> per la salute e la <strong>sicurezza</strong> sui luoghi <strong>di</strong> lavoro<br />
5 Sistema <strong>di</strong> <strong>gestione</strong> per la <strong>sicurezza</strong> dei dati<br />
6 Sistema <strong>di</strong> <strong>gestione</strong> per l’igiene degli alimenti (HACCP)<br />
7
Figura 1 Home page <strong>di</strong> Talete<br />
CAPITOLO I - Introduzione<br />
Il presente lavoro è stato sviluppato in collaborazione con l’EQUIPE SRL, azienda fondata nel<br />
1990 con sede legale, amministrativa e generale situata ad Ancona, che coor<strong>di</strong>na tutta l’attività<br />
a livello strategico e <strong>di</strong>rezionale.<br />
L’Equipe offre alle Piccole e Me<strong>di</strong>e Imprese, e agli enti pubblici, consulenza strategica e<br />
<strong>di</strong>rezionale, assistenza, trasferimento <strong>di</strong> tecniche e metodologie <strong>di</strong> <strong>gestione</strong> ed organizzazione,<br />
service e temporary management, per la <strong>gestione</strong> dei principali processi aziendali, in modo<br />
sempre personalizzato alle loro esigenze e realtà oggettive, concentrando in un unico schema<br />
organizzativo le <strong>di</strong>verse applicazioni che un’Azienda/Ente richiede. Le aree in cui l’Equipe<br />
opera sono sostanzialmente 5:<br />
1 Organizzazione: l’obiettivo specifico è il miglioramento dell’efficacia, dell’efficienza<br />
sia gestionale che produttiva, attraverso la mappatura dei principali processi e il<br />
<strong>di</strong>mensionamento quantitativo e qualitativo ottimale delle risorse.<br />
8
CAPITOLO I - Introduzione<br />
2 Gestione: <strong>analisi</strong>, progettazione e attuazione del sistema <strong>di</strong> Controllo economico <strong>della</strong><br />
Gestione e contabilità industriale con la fornitura <strong>di</strong> software sviluppato dall’Equipe e<br />
personalizzato alle esigenze dell’azienda cliente<br />
3 Marketing: stu<strong>di</strong>o e sviluppo <strong>di</strong> processi <strong>di</strong> marketing strategico per l’esportazione <strong>di</strong><br />
prodotti nei settori agroalimentari e moda.<br />
4 Qualità totale: introduzione, sviluppo e mantenimento <strong>di</strong> Sistemi <strong>di</strong> <strong>gestione</strong> per la<br />
Qualità UNI EN ISO 9000 – VISION 2000 mirati e mo<strong>della</strong>ti per ogni specifica realtà.<br />
5 Gestione Ambientale: introduzione, sviluppo, e mantenimento <strong>di</strong> Sistemi <strong>di</strong> Gestione<br />
Ambientale UNI EN ISO 14000 ed EMAS mirati al monitoraggio, controllo e<br />
miglioramento dell’impatto ambientale.<br />
Nella piattaforma Talete sono integrate tutte queste aree applicative, cercando <strong>di</strong> dare ai clienti<br />
(siano essi aziende, banche, enti pubblici), tramite un’interfaccia web semplice e intuitiva, un<br />
software per gestire l’intera organizzazione in modo automatizzato e preciso.<br />
Un’altra risposta alla domanda precedente è che i sistemi sicuri sono sistemi <strong>di</strong> qualità; in<br />
particolare il co<strong>di</strong>ce progettato e implementato pensando alla <strong>sicurezza</strong> come <strong>una</strong> delle prime<br />
feature è più robusto e quin<strong>di</strong> <strong>di</strong> maggiore qualità rispetto a quello in cui l’aspetto <strong>sicurezza</strong> va<br />
considerato come secondario e magari aggiunto alla fine o in corso <strong>di</strong> svolgimento.<br />
9
1.2 Struttura <strong>della</strong> tesi<br />
CAPITOLO I - Introduzione<br />
La tesi è articolata in sette capitoli: il secondo introduce il framework .NET, il linguaggio C# e<br />
la tecnologia AJAX con le sue implicazioni sulla <strong>sicurezza</strong>. Viene introdotta la piattaforma<br />
Talete e il meccanismo <strong>di</strong> autenticazione e autorizzazione partendo dalla fase <strong>di</strong> <strong>analisi</strong> dei<br />
requisiti e seguendo tutte le fasi previste dall’Ingegneria del software, ovvero la progettazione<br />
l’implementazione e il collaudo; ci si avvale del linguaggio UML per le notazioni grafiche<br />
relative agli schemi progettuali.<br />
Il terzo capitolo è de<strong>di</strong>cato ai design pattern, che permettono <strong>di</strong> rendere riusabili ed esten<strong>di</strong>bili<br />
le applicazioni object-oriented; vengono presentati i pattern classici e quelli usati in Talete.<br />
Nel quarto capitolo s’inizia a parlare <strong>di</strong> “<strong>sicurezza</strong> <strong>di</strong> <strong>una</strong> web application”, partendo da<br />
un’<strong>analisi</strong> dell’evoluzione degli attacchi, introducendo la <strong>sicurezza</strong> sui dati e i certificati<br />
(tecnologia SSL), e concludendo con la descrizione e l’<strong>applicazione</strong> delle tecniche <strong>di</strong> <strong>sicurezza</strong><br />
<strong>di</strong> Asp.NET 2.0.<br />
Il quinto capitolo sottolinea l’importanza <strong>della</strong> <strong>sicurezza</strong> applicata sin dalla fase <strong>di</strong><br />
progettazione e quin<strong>di</strong> all’architettura <strong>di</strong> <strong>una</strong> web application; viene usato un tool <strong>di</strong> Microsoft<br />
“Threat Analysis & Modeling ” per la mo<strong>della</strong>zione delle minacce.<br />
Nel sesto capitolo viene passata in rassegna la Top Ten dell’OWASP, la classifica delle <strong>di</strong>eci<br />
minacce più pericolose per le applicazioni web, e vengono descritte le contromisure applicate a<br />
Talete per respingere questi attacchi.<br />
Il settimo ed ultimo capitolo contiene un test effettuato tramite un software che ricerca<br />
vulnerabilità nelle web applications, il “Web Vulnerability Scanner”, secondo il quale il grado<br />
<strong>di</strong> <strong>sicurezza</strong> <strong>di</strong> Talete è abbastanza elevato.<br />
10
CAPITOLO II - Talete: Autenticazione ed<br />
Autorizzazione<br />
11
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
2.1 Introduzione alle tecnologie usate in Talete: il framework .NET<br />
Talete è <strong>una</strong> web application sviluppata sul framework .NET, realizzato da Microsoft per<br />
sistemi operativi Windows. Il framework .NET fornisce <strong>una</strong> miriade <strong>di</strong> moduli, classi e librerie<br />
per le più comuni necessità <strong>di</strong> programmazione (interfacce utente, accesso ai dati, crittografia,<br />
applicazioni web, supporto ai protocolli <strong>di</strong> comunicazione, etc.): i programmatori possono<br />
usare questa sterminata class library combinandola con il co<strong>di</strong>ce scritto da loro stessi.<br />
Il co<strong>di</strong>ce prodotto dai compilatori .NET non è un linguaggio macchina specifico per un<br />
microprocessore, ma piuttosto un linguaggio interme<strong>di</strong>o che, me<strong>di</strong>ante opportune virtual<br />
machine, è in grado <strong>di</strong> essere compilato on-the-fly ed essere eseguito su <strong>di</strong>verse piattaforme. La<br />
virtual machine che consente <strong>di</strong> eseguire applicazioni .NET è parte del Common Language<br />
Runtime (CLR) che è il modulo base, specifico per il SO, che interpreta ed esegue co<strong>di</strong>ce<br />
MSIL (Microsoft Interme<strong>di</strong>ate Language), occupandosi <strong>di</strong> funzionalità fondamentali come la<br />
<strong>gestione</strong> <strong>della</strong> memoria, i meccanismi <strong>di</strong> <strong>sicurezza</strong> e la <strong>gestione</strong> delle eccezioni.<br />
Figura 2 Generare co<strong>di</strong>ce con compilatori .NET<br />
12
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
IL (Interme<strong>di</strong>ate Language) e Metadati sono alla fine contenuti in uno o più PE (Portable<br />
Executable) nella forma tra<strong>di</strong>zionale: .exe( se è co<strong>di</strong>ce <strong>di</strong> programma eseguibile ) e .dll (se è un<br />
insieme <strong>di</strong> librerie).<br />
2.1.1 Le applicazioni Asp.NET<br />
Figura 3 Struttura del framework .NET<br />
Il volto Web del Framework .NET è meglio noto come Asp.NET. Per realizzare ed eseguire<br />
un’<strong>applicazione</strong> Web con Asp.NET è necessario che nel sistema sia installato il framework<br />
.NET ed un web server in grado <strong>di</strong> interpretare ed eseguire i file Asp.NET, che hanno<br />
estensione .aspx. Visual Stu<strong>di</strong>o 2005 include un tool <strong>di</strong> sviluppo Web, “Visual Web<br />
Developer”, che integra un piccolo server Web per consentire a tutti lo sviluppo <strong>di</strong> applicazioni<br />
<strong>di</strong> questo tipo. Il web server interpreta la richiesta, compie delle elaborazioni e risponde<br />
inviando al client <strong>una</strong> pagina web. Questa, in genere, è composta da co<strong>di</strong>ce HTML/XHTML<br />
(standard del World Wide Web Consortium che riformula l’HTML come documento XML) da<br />
13
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
regole CSS e da script che possono essere eseguiti <strong>di</strong>rettamente dal client (tipicamente<br />
Javascript).<br />
È stato già accennato che il server prima <strong>di</strong> dare <strong>una</strong> risposta deve compiere un’elaborazione.<br />
Nel caso si tratti <strong>della</strong> richiesta <strong>di</strong> <strong>una</strong> semplice pagina HMTL presente sulla macchina del<br />
server (detta "statica"), l’elaborazione consiste solo nel prelievo del file dalle cartelle locali. Il<br />
client potrebbe richiedere anche <strong>una</strong> pagina che non è presente sulle cartelle locali ma che deve<br />
essere generata <strong>di</strong>namicamente. In questo caso la richiesta è per <strong>una</strong> risorsa che contiene un<br />
programma (uno script lato server) fatto per "costruire" la pagina <strong>di</strong> risposta (detta “<strong>di</strong>namica”).<br />
Questo script viene elaborato da un altro componente che è l’application server. Riepilogando<br />
quando arriva <strong>una</strong> richiesta per <strong>una</strong> pagina <strong>di</strong>namica, il server la manda all’application server<br />
che risponde con la pagina HTML costruita ad hoc. Il motore <strong>di</strong> processamento Asp.NET si<br />
occupa <strong>di</strong> compilare, se necessario, ed eseguire il co<strong>di</strong>ce <strong>della</strong> pagina che può essere scritto in<br />
uno dei linguaggi del framework .NET, in genere C# o VB.net.<br />
Nei più noti linguaggi <strong>di</strong> scripting lato server, come JSP e PHP e nelle stesse vecchie ASP, il<br />
co<strong>di</strong>ce lato server viene scritto all’interno <strong>della</strong> pagina, nei punti in cui è necessaria<br />
un’interazione con il server. Il web server in questi casi incontra il co<strong>di</strong>ce server side e si<br />
occupa <strong>di</strong> inviarlo all’<strong>applicazione</strong> che lo può tradurre. Tutto il co<strong>di</strong>ce client side (HTML,<br />
JavaScript), invece, viene inviato al client senza elaborazioni. In Asp.NET il processo è<br />
completamente <strong>di</strong>fferente.<br />
Quando <strong>una</strong> pagina è richiesta per la prima volta al server Asp.NET, viene compilata, e<br />
trasformata in un class file scritto nel linguaggio MSIL. Il co<strong>di</strong>ce client side viene convertito in<br />
un insieme <strong>di</strong> espressioni <strong>di</strong> tipo output.Write (in modo simile a quanto fanno i Java application<br />
server quando convertono le pagine JSP nelle corrispondenti servlet). Le classi compilate non<br />
necessitano <strong>di</strong> essere ricompilate quando vengono richieste <strong>una</strong> seconda volta salvo che non<br />
abbiano subito delle mo<strong>di</strong>fiche.<br />
Tipicamente un’<strong>applicazione</strong> Asp.NET consiste in un insieme <strong>di</strong> web form, ogn<strong>una</strong> delle quali<br />
contiene oggetti. Sono oggetti ospitati ad esempio i pezzi <strong>di</strong> co<strong>di</strong>ce lato client (HTML), i<br />
controlli server ed altri oggetti ere<strong>di</strong>tati ad esempio tramite la <strong>di</strong>rettiva import. Se si confronta<br />
la velocità <strong>di</strong> Asp.NET rispetto ad ASP, è possibile notare un rallentamento <strong>di</strong> prestazioni<br />
14
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
quando la pagina deve essere compilata, cioè la prima volta che viene richiesta, ma un notevole<br />
aumento <strong>di</strong> prestazioni a regime.<br />
2.1.2 Il linguaggio C#<br />
La piattaforma .NET si può definire come <strong>una</strong> piattaforma multi-linguaggio: C#, VB.NET,<br />
C++ e JScript.NET, ai quali si è aggiunto J#. Da un punto <strong>di</strong> vista astratto, come si è già detto,<br />
la piattaforma è <strong>una</strong> sorta <strong>di</strong> middleware, vale a <strong>di</strong>re un ambiente <strong>di</strong> esecuzione che si pone al<br />
<strong>di</strong> sopra del sistema operativo. Le principali funzionalità che un linguaggio per .NET deve<br />
avere sono:<br />
1 Object Oriented: organizzazione del co<strong>di</strong>ce in classi (la mente umana ragiona ad<br />
oggetti), contenenti campi e meto<strong>di</strong>; utilizzo <strong>di</strong> classi già definite e possibilità <strong>di</strong><br />
personalizzazione <strong>di</strong> esse.<br />
2 Ere<strong>di</strong>tà singola delle classi: definire le classi attraverso le “<strong>di</strong>fferenze” da <strong>una</strong> classe<br />
base.<br />
3 Tipi <strong>di</strong> valore e <strong>di</strong> riferimento: forte tipizzazione e <strong>di</strong>stinzione tra strutture dati allocate<br />
nella parte <strong>di</strong> memoria denominata stack e quella definita heap.<br />
4 Gestione errori tramite eccezioni.<br />
Tra tutti i linguaggi supportati da .NET, per la creazione <strong>di</strong> Talete, è stato scelto C#, linguaggio<br />
creato da Microsoft specificatamente per il framework. C# è un linguaggio semplice, moderno,<br />
orientato agli oggetti e fortemente tipizzato, derivato da C, da C++ e da Java. Alcune delle sue<br />
caratteristiche sono:<br />
− pieno supporto per le classi e la programmazione orientata agli oggetti, compresa<br />
l’ere<strong>di</strong>tarietà delle interfacce<br />
15
− consistente e ben definito gruppo <strong>di</strong> tipi <strong>di</strong> base<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
supporto integrato per la generazione <strong>di</strong> documentazione XML<br />
deallocazione automatica <strong>della</strong> memoria allocata <strong>di</strong>namicamente<br />
accesso completo alle classi <strong>di</strong> base <strong>di</strong> .NET e a tutte le API <strong>di</strong> Windows<br />
supporto per proprietà ed eventi<br />
cambiando le opzioni <strong>di</strong> compilazione, è possibile compilare un eseguibile o <strong>una</strong> libreria<br />
<strong>di</strong> componenti .NET che possono essere richiamati da altro co<strong>di</strong>ce, allo stesso modo dei<br />
controlli ActiveX (componenti COM)<br />
gli assembly compilati per il framework .NET possono essere utilizzati sia da pagine<br />
web <strong>di</strong>namiche scritte in Asp.NET che da web service XML<br />
2.2 La tecnologia AJAX<br />
Dopo aver descritto a gran<strong>di</strong> linee come funziona il framework .NET e <strong>di</strong> conseguenza le<br />
applicazioni Asp.NET, viene presentato un altro elemento fondamentale per la creazione <strong>di</strong><br />
Talete: la tecnologia AJAX per l’UI <strong>della</strong> piattaforma. Nell’ultimo anno questa tecnologia ha<br />
ottenuto grande visibilità a causa <strong>della</strong> sua natura "interattiva"; Google Suggest e Google Maps<br />
sono alcuni dei servizi più noti che fanno uso <strong>di</strong> AJAX, che è in grande espansione, in quanto<br />
ogni tecnologia che migliora lo scambio dati con i server, che produce transizioni più fluide fra<br />
pagine e rende le applicazioni web più ricche, trova facilmente grande visibilità.<br />
Le classiche applicazioni web lavorano su un modello sincrono: ad <strong>una</strong> richiesta dal Web si fa<br />
seguire <strong>una</strong> risposta che provoca alcune azioni sul livello <strong>di</strong> presentazione dell’<strong>applicazione</strong>.<br />
Per esempio: il clic su un link o l’invio <strong>di</strong> un modulo eseguono <strong>una</strong> richiesta al Web server con<br />
i relativi parametri. Il tra<strong>di</strong>zionale comportamento "click and wait" (‘clicca e aspetta’) limita<br />
16
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
l’interattività delle applicazioni. Questo problema è stato mitigato dall’uso <strong>di</strong> AJAX<br />
(Asychronous Javascript and XML). Possiamo definire AJAX come il metodo con il quale<br />
vengono eseguite chiamate asincrone al Web server senza causare un aggiornamento completo<br />
<strong>della</strong> pagina Web. Questa interazione è resa possibile da tre componenti <strong>di</strong>fferenti: un<br />
linguaggio <strong>di</strong> scripting lato client, l’oggetto XmlHttpRequest (XHR) object e l’XML.<br />
Ve<strong>di</strong>amo in breve questi tre componenti. Il linguaggio <strong>di</strong> scripting lato client è utilizzato per<br />
inizializzare le chiamate al Web server e successivamente, in risposta alla richiesta, è utilizzato<br />
per accedere e aggiornare il DOM all’interno del browser. La scelta più <strong>di</strong>ffusa lato client è<br />
JavaScript poiché ampiamente integrato nei browser moderni. Il secondo componente è<br />
l’oggetto XHR: il cuore <strong>di</strong> tutto. Linguaggi come JavaScript utilizzano l’oggetto XHR per<br />
inviare richieste al Web server "<strong>di</strong>etro le quinte" utilizzando l’HTTP come mezzo <strong>di</strong> trasporto.<br />
In ultimo abbiamo <strong>una</strong> terza componente, il cui uso non è tuttavia strettamente necessario:<br />
XML, ossia il formato con cui vengono scambiati i dati.<br />
AJAX, dunque, non è <strong>una</strong> tecnologia nuova <strong>di</strong> zecca, ma <strong>una</strong> combinazione <strong>di</strong> tecnologie già<br />
esistenti usate assieme per sviluppare applicazioni Web ad alta interattività. Gli sviluppatori<br />
hanno trovato <strong>di</strong>versi usi <strong>di</strong> AJAX: in box testuali <strong>di</strong> suggerimento (come Google Suggest) e in<br />
elenchi <strong>di</strong> dati autoaggiornabili. La natura asincrona <strong>di</strong> AJAX è illustrata nella figura seguente:<br />
17
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Figura 4 La natura asincrona <strong>di</strong> AJAX<br />
Per fare un esempio concreto, è possibile considerare che molti siti usano le tabelle per<br />
visualizzare i dati. Per cambiare l’or<strong>di</strong>ne <strong>di</strong> visualizzazione dei dati, con un’<strong>applicazione</strong><br />
tra<strong>di</strong>zionale l’utente dovrebbe cliccare un link nell’intestazione <strong>della</strong> tabella che invierebbe <strong>una</strong><br />
richiesta al server per ricaricare la pagina con il nuovo or<strong>di</strong>ne. Il web server allora invierebbe<br />
<strong>una</strong> nuova query SQL al database or<strong>di</strong>nando i dati come richiesto, la eseguirebbe, prenderebbe<br />
18
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
i dati e ricostruirebbe da zero la pagina web reinviandola integralmente all’utente. Usando le<br />
tecnologie AJAX, questo evento potrebbe preferibilmente essere eseguito con un JavaScript<br />
lato client che genera <strong>di</strong>namicamente <strong>una</strong> vista dei dati con DHTML. Nella piattaforma Talete,<br />
la tecnologia AJAX è stata applicata tramite l’uso dei controlli <strong>della</strong> Telerik come il<br />
RadAjaxPanel, all’interno del quale è possibile inserire altri controlli come le griglie; in questo<br />
modo si evita il meccanismo che prevede l’utilizzo continuo <strong>della</strong> stessa pagina che viene<br />
inviata avanti e in<strong>di</strong>etro dal server (postback), che può essere abbastanza fasti<strong>di</strong>oso e<br />
soprattutto lento. Considerando proprio le griglie, e in particolare gli or<strong>di</strong>namenti all’interno <strong>di</strong><br />
esse, se si clicca su un menu poco popolato, o ancora quando si caricano no<strong>di</strong> e sottono<strong>di</strong> <strong>di</strong><br />
treeview, come è stato accennato, la pagina deve essere mandata in<strong>di</strong>etro al server che dovrà<br />
per esempio cambiare solamente <strong>una</strong> riga <strong>di</strong> <strong>una</strong> griglia e rielaborare <strong>di</strong> nuovo tutti i vari<br />
controlli (esempio .ascx) e rimandarli in<strong>di</strong>etro con notevole carico dalla parte del server oltre<br />
che <strong>di</strong> consumo <strong>di</strong> banda. Mentre con un RadAjaxPanel si ha il cosiddetto funzionamento<br />
"intelligente" delle pagine Web che girano lato client, ovvero che non subiscono <strong>una</strong><br />
rielaborazione da parte del server ad ogni postback, ma necessitano solo <strong>di</strong> un aggiornamento<br />
delle parti che verranno effettivamente mo<strong>di</strong>ficate.<br />
Oltre che nella pagina master, è possibile vedere l’uso del RadAjaxPanel nella pagina delle<br />
Organizzazioni:<br />
Figura 5 Ajax in Talete: RadAjaxPanel<br />
19
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
La griglia relativa agli utenti dell’organizzazione è inserita in un RadAjaxPanel; in questo<br />
modo, qualsiasi operazione relativa ad essa, quin<strong>di</strong> l’aggiunta o la rimozione <strong>di</strong> un nuovo<br />
utente, comporterà l’aggiornamento solo <strong>della</strong> griglia, mentre il resto <strong>della</strong> pagina non sarà<br />
rielaborato.<br />
2.2.1 Le implicazioni <strong>di</strong> <strong>sicurezza</strong> <strong>di</strong> AJAX<br />
Dopo aver esaminato le basi <strong>di</strong> AJAX, vengono ora <strong>di</strong>scusse le implicazioni <strong>di</strong> <strong>sicurezza</strong> legate<br />
a questa tecnologia. AJAX non introduce per sua natura nuove vulnerabilità <strong>di</strong> <strong>sicurezza</strong> nel<br />
regno delle applicazioni Web. Anzi, le nuove applicazioni hanno <strong>di</strong> fronte gli stessi problemi <strong>di</strong><br />
<strong>sicurezza</strong> <strong>di</strong> quelle classiche. Sfort<strong>una</strong>tamente per AJAX non sono state sviluppate buone<br />
pratiche comuni, ed è facile per questo incorrere in errore; bisogna considerare l’assegnamento<br />
delle giuste autenticazioni, autorizzazioni, controlli <strong>di</strong> accesso e validazione degli input<br />
dell’utente. Alcune aree potenziali <strong>di</strong> preoccupazione che riguardano l’uso <strong>di</strong> AJAX, sono:<br />
• Controlli <strong>di</strong> <strong>sicurezza</strong> lato client<br />
Qualcuno potrebbe suggerire che la <strong>di</strong>pendenza dalla programmazione lato client apre la<br />
possibilità <strong>di</strong> introdurre in "prima linea" alcuni noti problemi <strong>di</strong> <strong>sicurezza</strong>. Tra questi c’è<br />
l’improprio uso <strong>di</strong> controlli <strong>di</strong> <strong>sicurezza</strong> lato client da parte degli sviluppatori. Come già detto,<br />
l’uso <strong>di</strong> AJAX richiede un bel po’ <strong>di</strong> co<strong>di</strong>ce <strong>di</strong> scripting lato client. Ora si sta cominciando a<br />
scrivere co<strong>di</strong>ce sia lato client sia lato server e questo potrebbe spingere a implementare i<br />
controlli <strong>di</strong> <strong>sicurezza</strong> dalla parte client <strong>della</strong> programmazione. Questo approccio è del tutto<br />
insicuro, poiché gli aggressori potrebbero mo<strong>di</strong>ficare qualsiasi porzione <strong>di</strong> co<strong>di</strong>ce eseguito sui<br />
computer client al momento <strong>di</strong> testare le vulnerabilità dell’<strong>applicazione</strong>. I controlli <strong>di</strong> <strong>sicurezza</strong><br />
devono essere completamente implementati lato server o sempre rinforzati sul server.<br />
20
• Ampliamento <strong>della</strong> superficie <strong>di</strong> attacco<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Una seconda sfida è legata alla <strong>di</strong>fficoltà <strong>di</strong> rendere sicura la sempre più vasta superficie <strong>di</strong><br />
attacco, in quanto AJAX inevitabilmente aumenta la complessità generale del sistema. Nel<br />
processo <strong>di</strong> uso <strong>di</strong> AJAX, si devono produrre un gran numero <strong>di</strong> pagine con accessi lato server,<br />
ogn<strong>una</strong> <strong>di</strong> queste esegue alcune minime funzionalità (come la ricerca <strong>di</strong> un co<strong>di</strong>ce postale o<br />
l’autocompletamento dei campi dei dati <strong>di</strong> residenza degli utenti) all’interno dell’<strong>applicazione</strong>.<br />
Ogn<strong>una</strong> <strong>di</strong> queste piccole pagine <strong>di</strong>venta un nuovo obiettivo per gli aggressori e <strong>una</strong> nuova<br />
zona da rendere sicura da vulnerabilità. Ciò è simile al concetto, ben noto nel campo <strong>della</strong><br />
<strong>sicurezza</strong>, dei punti <strong>di</strong> accesso multipli ad <strong>una</strong> casa: confrontate le <strong>di</strong>fficoltà <strong>di</strong> proteggere <strong>una</strong><br />
casa con <strong>una</strong> porta con quelle <strong>di</strong> proteggerne <strong>una</strong> con <strong>di</strong>eci porte.<br />
• Nuove possibilità <strong>di</strong> Cross-Site Scripting (XSS)<br />
Un’altra cruda verità è che gli aggressori possono essere più creativi (in altre parole pericolosi)<br />
nello sfruttare vulnerabilità <strong>di</strong> tipo Cross Site Scripting (presentata nel sesto capitolo).<br />
Solitamente gli aggressori devono saper sfruttare dei buchi XSS in un mondo "a singolo<br />
thread", in cui l’attacco è portato mentre il browser dell’utente è in stato <strong>di</strong> attesa. Questo stato<br />
<strong>di</strong> attesa fornisce alcuni in<strong>di</strong>zi visuali e <strong>di</strong> comportamento all’utente sul normale<br />
funzionamento dell’<strong>applicazione</strong>. Con l’introduzione <strong>di</strong> AJAX, un aggressore può sfruttare<br />
vulnerabilità Cross Site Scripting più facilmente. Mentre si controlla la posta elettronica<br />
all’interno <strong>di</strong> un’<strong>applicazione</strong> scritta con AJAX, un eventuale co<strong>di</strong>ce nocivo potrebbe inviare<br />
mail a tutti i conoscenti senza che il browser conceda nessun in<strong>di</strong>zio visuale <strong>di</strong> quest’azione.<br />
Adeguati e approfon<strong>di</strong>ti test <strong>di</strong> <strong>sicurezza</strong> devono essere eseguiti prima <strong>di</strong> portare in produzione<br />
le applicazioni in modo da circoscrivere queste aree <strong>di</strong> interesse. In un sistema sicuro i controlli<br />
<strong>di</strong> <strong>sicurezza</strong> sono inclusi in un ambiente che è fuori dal controllo dell’utente.<br />
Proprio come le classiche applicazioni web, tutte le richieste AJAX dovrebbero essere<br />
verificate dal punto <strong>di</strong> vista delle autorizzazioni. Si potrebbe cadere vittima <strong>della</strong> credenza che<br />
l’autorizzazione non è più necessaria solo perché <strong>una</strong> pagina è richiamata in background<br />
me<strong>di</strong>ante l’uso <strong>di</strong> un motore <strong>di</strong> scripting lato client. Ma sarebbe un errore.<br />
21
2.3 Talete: come si presenta<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Talete si espande su 3 livelli che sono: aree, applicazioni e anagrafiche. L’aspetto preso in<br />
considerazione durante questa tesi è quello dell’amministrazione del progetto Talete, che si<br />
esplica tramite le autorizzazioni, vale a <strong>di</strong>re fare in modo che determinati utenti abbiano<br />
accesso a delle pagine, e che all’interno <strong>di</strong> esse vengano <strong>di</strong>versificate le azioni che si possono<br />
eseguire a seconda del ruolo che l’utente ricopre nell’organizzazione.<br />
Nella figura è possibile vedere i tre livelli citati prima:<br />
Tra le aree abbiamo:<br />
Figura 6 I 3 livelli <strong>di</strong> Talete<br />
22
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Figura 7 Aree <strong>di</strong> Talete<br />
Nella figura seguente sono presentate le applicazioni dell’area CdG, che sono:<br />
Figura 8 Applicazioni dell’area CdG <strong>di</strong> Talete<br />
E al terzo ed ultimo livello sono raffigurate le anagrafiche dell’<strong>applicazione</strong> ORG <strong>di</strong> CdG:<br />
Figura 9 Anagrafiche dell’<strong>applicazione</strong> ORG <strong>di</strong> Talete<br />
23
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Nella parte destra <strong>della</strong> home page è presente il controllo per effettuare il login, e, dopo aver<br />
eseguito l’accesso, vengono mostrate, oltre al nome dell’utente connesso e all’organizzazione<br />
<strong>di</strong> appartenenza, le pagine relative all’amministrazione vera e propria <strong>della</strong> piattaforma, create<br />
in questo lavoro.<br />
2.4 Progettazione <strong>della</strong> piattaforma Talete<br />
Dopo aver effettuato <strong>una</strong> panoramica molto generale <strong>di</strong> Talete, si affronteranno ora le<br />
problematiche relative alla progettazione del sistema, secondo le linee guida proposte dalla<br />
“Ingegneria del Software”, attraverso la quale si identifica <strong>una</strong> formalizzazione del processo <strong>di</strong><br />
realizzazione <strong>di</strong> un prodotto software dalla fase <strong>di</strong> concepimento fino alla sua morte funzionale.<br />
Per questo motivo si parla spesso <strong>di</strong> ciclo <strong>di</strong> vita <strong>di</strong> un software.<br />
Con questa espressione ci si riferisce al modo in cui <strong>una</strong> metodologia <strong>di</strong> sviluppo o un modello<br />
<strong>di</strong> processo scompongono l’attività <strong>di</strong> realizzazione <strong>di</strong> prodotti software in sottoattività fra loro<br />
coor<strong>di</strong>nate, il cui risultato finale è il prodotto stesso e tutta la documentazione ad esso<br />
associato.<br />
Questi concetti rappresentano un passaggio storico dallo sviluppo del software inteso come<br />
attività "artigianale" (ovvero affidata alla libera creatività dei singoli in<strong>di</strong>vidui) ad un approccio<br />
più metodologico in cui la creazione <strong>di</strong> programmi è considerata come un processo complesso<br />
che richiede pianificazione, controllo, e documentazione appropriati.<br />
Le principali attività (e sottoattività) costituenti il processo <strong>di</strong> sviluppo sono le seguenti:<br />
- la fase <strong>di</strong> <strong>analisi</strong>, ovvero l’indagine preliminare sul contesto in cui il prodotto software deve<br />
inserirsi, sulle caratteristiche che deve esibire, ed eventualmente su costi e aspetti logistici<br />
24
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
<strong>della</strong> sua realizzazione. In senso ampio si può <strong>di</strong>re che l’<strong>analisi</strong> ha lo scopo <strong>di</strong> definire (il<br />
più precisamente possibile) il problema da risolvere.<br />
- la fase <strong>di</strong> progetto, in cui si definiscono le linee essenziali <strong>della</strong> struttura del sistema da<br />
realizzare, in funzione dei requisiti evidenziati dall’<strong>analisi</strong>. Si può affermare che la fase <strong>di</strong><br />
progetto ha lo scopo <strong>di</strong> definire (ad un certo livello <strong>di</strong> dettaglio) la soluzione del problema.<br />
In questa fase sarà sviluppato un documento che permetterà <strong>di</strong> avere <strong>una</strong> definizione <strong>della</strong><br />
struttura <strong>di</strong> massima (architettura <strong>di</strong> alto livello) e <strong>una</strong> definizione delle caratteristiche dei<br />
singoli componenti (moduli);<br />
- la fase d’implementazione (o co<strong>di</strong>fica) del sistema, ovvero la sua realizzazione concreta; in<br />
pratica, l’implementazione ha lo scopo <strong>di</strong> realizzare la soluzione.<br />
- la fase <strong>di</strong> collaudo volta a determinare in che misura il sistema realizzato sod<strong>di</strong>sfa i requisiti<br />
stabiliti nella fase <strong>di</strong> <strong>analisi</strong>, ovvero a valutarne la correttezza rispetto alle specifiche.<br />
- la fase <strong>di</strong> manutenzione, che comprende tutte le attività <strong>di</strong> mo<strong>di</strong>fica del software successive<br />
al suo rilascio presso il cliente o la sua immissione sul mercato. Queste attività possono<br />
essere volte a correggere errori del software o estenderne le funzionalità.<br />
2.4.1 Analisi dei requisiti<br />
In ingegneria del software, l’<strong>analisi</strong> ha lo scopo generale <strong>di</strong> chiarire, dettagliare e documentare<br />
le funzioni, i servizi e le prestazioni che devono essere offerti da un sistema software, al fine <strong>di</strong><br />
risolvere un dato problema nel contesto in cui esso dovrà operare. Le informazioni raccolte<br />
nella fase <strong>di</strong> <strong>analisi</strong> rappresentano il punto <strong>di</strong> partenza per la progettazione <strong>di</strong> un prodotto<br />
software e per l’intero processo <strong>della</strong> sua realizzazione, validazione e manutenzione.<br />
Esempi <strong>di</strong> sottoattività che si possono considerare parte dell’<strong>analisi</strong> in senso generale,<br />
includono:<br />
25
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
- la definizione del problema, che consiste nel comprendere a fondo il problema che il<br />
sistema da sviluppare è chiamato a risolvere;<br />
- l’<strong>analisi</strong> <strong>di</strong> fattibilità, che ha lo scopo <strong>di</strong> stabilire se gli obiettivi che ci si pongono nello<br />
sviluppo del sistema siano ragionevoli e raggiungibili;<br />
- l’<strong>analisi</strong> dei costi e benefici, che valuta preliminarmente la convenienza economica dello<br />
sviluppo del sistema software in esame, tenendo conto dei suoi costi previsti e dei benefici<br />
che può fornire ai suoi utenti;<br />
- l’<strong>analisi</strong> del dominio, che consiste nel comprendere a fondo il contesto o dominio<br />
applicativo in cui il sistema dovrà agire;<br />
- l’<strong>analisi</strong> dei requisiti, che consiste nello specificare dettagliatamente i servizi, le funzioni ed<br />
eventualmente le prestazioni richieste per il sistema; questa fase porta come minimo alla<br />
stesura <strong>della</strong> specifica dei requisiti.<br />
Il problema da risolvere è stato già accennato in precedenza, ma in questa fase si cerca <strong>di</strong><br />
analizzarlo e spiegarlo in tutte le sue sfaccettature. Innanzitutto sono state in<strong>di</strong>viduate le<br />
strutture e le persone che interagiscono con la piattaforma. Le strutture sono: i concessionari e<br />
le organizzazioni.<br />
I concessionari (intesi come struttura e non come persone fisiche) corrispondono a società <strong>di</strong><br />
consulenza (come l’Equipe) e quin<strong>di</strong> rappresentano quelle organizzazioni che erogano il<br />
servizio. Le organizzazioni invece sono le aziende che chiedono e fruiscono del servizio <strong>di</strong><br />
consulenza. Ovviamente le azioni che possono svolgere gli utenti <strong>di</strong> un’organizzazione, o <strong>di</strong> un<br />
concessionario saranno <strong>di</strong>fferenti. Le persone fisiche che hanno a che fare con la piattaforma e<br />
che quin<strong>di</strong> possono accedere ad essa sono: amministratore (che è l’unico ruolo statico),<br />
concessionario (inteso come proprietario <strong>di</strong> <strong>una</strong> società che eroga consulenza), consulente,<br />
proprietario, e un utente qualsiasi <strong>di</strong> un’organizzazione.<br />
In questa prima fase, sono stati analizzati attentamente i vari ruoli e quin<strong>di</strong> le azioni che<br />
possono essere svolte a seconda se l’utente loggato è un proprietario o un consulente o un<br />
utente generico; in base al ruolo <strong>della</strong> persona, sono state assegnate le autorizzazioni, che<br />
26
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
permetteranno <strong>di</strong> definire il comportamento del sistema, schematizzabile tramite il seguente<br />
<strong>di</strong>agramma:<br />
Figura 10 Funzionamento del sistema<br />
Per mo<strong>della</strong>re il funzionamento del sistema in base alle autorizzazioni date, sono stati<br />
realizzati alcuni <strong>di</strong>agrammi UML, fondamentali in questa fase <strong>di</strong> progettazione.<br />
27
2.4.2 Diagrammi UML<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Lo Unified Modeling Language (UML, traducibile come “linguaggio <strong>di</strong> mo<strong>della</strong>zione<br />
unificato”) è <strong>una</strong> famiglia <strong>di</strong> notazioni grafiche che si basano su un singolo meta-modello e<br />
servono a supportare la descrizione e il progetto dei sistemi software, in particolare quelli<br />
costruiti seguendo il para<strong>di</strong>gma orientato agli oggetti (OO).<br />
La ragione principale per cui i linguaggi grafici sono stati introdotti è il livello <strong>di</strong> astrazione dei<br />
linguaggi <strong>di</strong> programmazione, che non è abbastanza alto da permettere la <strong>di</strong>scussione <strong>di</strong>retta<br />
delle scelte <strong>di</strong> progetto. Per questo motivo, già durante la fase <strong>di</strong> <strong>analisi</strong> dei requisiti, spesso<br />
sono costruiti <strong>una</strong> serie <strong>di</strong> <strong>di</strong>agrammi basati su UML, così da poter sintetizzare graficamente<br />
tutti gli aspetti coinvolti nell’ambito del progetto, prima, durante e dopo la sua<br />
implementazione.<br />
Per quanto riguarda la fase <strong>di</strong> sintesi dei requisiti, sono stati realizzati i <strong>di</strong>agrammi delle attività<br />
e dei casi d’uso. In seguito è stato sviluppato il <strong>di</strong>agramma delle classi, così da sintetizzare la<br />
localizzazione, all’interno <strong>di</strong> esse, dei dati e dei meto<strong>di</strong> del software da sviluppare.<br />
2.4.3 Diagramma dei casi d’uso<br />
I <strong>di</strong>agrammi dei casi d’uso servono per mo<strong>della</strong>re i requisiti del sistema dal punto <strong>di</strong> vista<br />
dell’utente. In essi vengono in<strong>di</strong>viduati:<br />
1) attore: rappresenta il ruolo che un utente deve svolgere; nel nostro caso abbiamo in<strong>di</strong>viduato<br />
l’utente generico, il concessionario, il proprietario, il consulente e l’amministratore.<br />
2) caso d’uso: particolare compito che deve essere svolto; nel nostro caso sono state definite le<br />
operazioni <strong>di</strong> autenticazione, <strong>di</strong> mo<strong>di</strong>fica e <strong>di</strong> visualizzazione. In particolare, grazie alla<br />
28
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
costruzione <strong>di</strong> questo <strong>di</strong>agramma è possibile vedere le operazioni che possono svolgere gli<br />
utenti che accedono a Talete: ad esempio il concessionario vede tutte le proprie organizzazioni,<br />
può creare e rimuovere organizzazioni, vede tutti i suoi consulenti e i permessi dei propri<br />
utenti; non può visualizzare gli altri concessionari o gli utenti delle altre organizzazioni. Il<br />
consulente vede le organizzazioni a cui appartiene, e quelle che hanno come concessionario il<br />
suo; può mo<strong>di</strong>ficare alcuni dati <strong>di</strong> esse, ma non può aggiungere o cancellare organizzazioni.<br />
Non vede gli altri concessionari o i consulenti delle altre organizzazioni e non accede alla<br />
pagina delle autorizzazioni. Infine il proprietario vede la propria organizzazione e può<br />
aggiornare i dati relativi ad essa, vede i suoi consulenti, ma non visualizza né quelli altrui né i<br />
concessionari. Egli accede alla pagina delle autorizzazioni assegnando i permessi agli utenti<br />
<strong>della</strong> propria organizzazione.<br />
3) Uses: in<strong>di</strong>ca <strong>una</strong> componente necessaria per svolgere <strong>una</strong> determinata operazione. Per<br />
quanto riguarda il nostro sistema ad esempio, tutti i casi d’uso sono subor<strong>di</strong>nati alla fase <strong>di</strong><br />
autenticazione; tuttavia nel <strong>di</strong>segno ne è rappresentato solo uno per evitare intrecci <strong>di</strong> linee.<br />
4) Extends: in<strong>di</strong>ca le eccezioni o le varianti allo scenario principale. Nel nostro caso, lo use<br />
case definito come “numero massimo <strong>di</strong> consulenti raggiunto” è un’eccezione dello scenario<br />
“mo<strong>di</strong>ficare consulenti <strong>della</strong> propria organizzazione”, in quanto ogni organizzazione può avere<br />
un determinato numero <strong>di</strong> consulenti; raggiunto questo valore non è più possibile aggiungerne<br />
degli altri.<br />
Nel <strong>di</strong>agramma in figura non sono stati aggiunti i collegamenti tra l’attore Amministratore e gli<br />
use case, in quanto l’amministratore può compiere qualsiasi azione e quin<strong>di</strong> sarebbe da<br />
collegare a tutti gli use case, e questo comporterebbe <strong>una</strong> notevole confusione nel grafico.<br />
29
2.4.4 Diagramma delle attività<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Figura 11 Diagramma dei casi d’uso<br />
Nella mo<strong>della</strong>zione basata sugli scenari, <strong>una</strong> volta in<strong>di</strong>viduati gli attori, è necessario ricercare le<br />
principali attività che sono alla base del corretto funzionamento del sistema. Più precisamente,<br />
un <strong>di</strong>agramma <strong>di</strong> attività descrive il flusso <strong>di</strong> elaborazione interno <strong>di</strong> <strong>una</strong> classe, <strong>di</strong> un caso<br />
d’uso o <strong>di</strong> un’operazione; rappresenta, insomma, un’azione in esecuzione e possiamo<br />
considerarlo il corpo <strong>di</strong> <strong>una</strong> procedura se identifichiamo le attività come delle istruzioni.<br />
Il grafico è composto da:<br />
30
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
1) Attività: un’azione in esecuzione; nel nostro sistema sono state considerate le operazioni <strong>di</strong><br />
visualizzazione, mo<strong>di</strong>fica delle organizzazioni e mo<strong>di</strong>fica dei consulenti.<br />
2) Transizione: rappresenta l’istante in cui un’attività termina ed un’altra inizia; sono appunto<br />
le frecce che collegano le varie attività fra loro.<br />
3) Punto <strong>di</strong> decisione: rappresenta un modo per separare le transizioni, infatti, a volte lo stesso<br />
evento può portare a transizioni <strong>di</strong>verse <strong>di</strong>stinte da <strong>una</strong> con<strong>di</strong>zione; nel nostro sistema dopo<br />
l’operazione <strong>di</strong> autenticazione si può verificare la con<strong>di</strong>zione <strong>di</strong> login esatto e in tal caso si può<br />
accedere alla piattaforma, oppure <strong>di</strong> login errato che “conduce” allo stop che determina la fine<br />
delle attività.<br />
31
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Figura 12 Diagramma delle attività<br />
32
2.4.5 Diagramma delle classi<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Il <strong>di</strong>agramma delle classi serve a descrivere il tipo <strong>di</strong> oggetti che fanno parte <strong>di</strong> un sistema e le<br />
varie tipologie <strong>di</strong> relazioni statiche tra <strong>di</strong> essi. Mostrano anche le proprietà e i meto<strong>di</strong> <strong>di</strong> <strong>una</strong><br />
classe, e i vincoli che si applicano ai collegamenti tra gli oggetti.<br />
Nella progettazione del sistema <strong>di</strong> autenticazione e autorizzazione <strong>di</strong> Talete, sono state<br />
in<strong>di</strong>viduate sei classi <strong>di</strong> <strong>analisi</strong>, con la classe DAL che è la superclasse che contiene i riferimenti<br />
al DB usato da cui <strong>di</strong>scendono le altre, e le classi Utente e Autorizzazione che contengono i<br />
meto<strong>di</strong> per gestire l’accesso alle varie aree e alle pagine <strong>della</strong> piattaforma.<br />
Figura 13 Diagramma delle classi<br />
33
2.4.6 Implementazione <strong>della</strong> soluzione<br />
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
La <strong>gestione</strong> degli accessi alla piattaforma è stata <strong>di</strong>visa in due parti: nella prima sono state<br />
considerate le pagine <strong>di</strong> amministrazione, vale a <strong>di</strong>re quelle relative ai concessionari, alle<br />
organizzazioni e cosi via, presenti nella parte destra <strong>della</strong> home page <strong>di</strong> Talete;<br />
Figura 14 Pagine <strong>di</strong> amministrazione<br />
nella seconda, <strong>di</strong> maggiore interesse, è stato gestito l’accesso alle varie aree (CdG, Qualità...) a<br />
seconda dei permessi dati dal proprietario. Illustro questa seconda parte partendo da un<br />
esempio. Supponiamo <strong>di</strong> avere l’organizzazione AngeloChitarre con 2 utenti: Angelo Vocino<br />
che è il proprietario, e Mario che è un utente generico.<br />
34
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Figura 15 Esempio <strong>di</strong> organizzazione: “AngeloChitarre”<br />
Ho fatto il login accedendo con username angelo.vocino, cioè attualmente l’utente loggato è il<br />
proprietario dell’organizzazione, il quale può accedere a qualsiasi area <strong>di</strong> Talete. Mentre<br />
l’utente Mario, dato che è stato appena aggiunto all’organizzazione AngeloChitarre, non ha<br />
nessun permesso e quin<strong>di</strong> non accede a ness<strong>una</strong> area; c’è bisogno che il proprietario <strong>di</strong>a le<br />
giuste autorizzazioni all’utente e a tal proposito acce<strong>di</strong>amo alla pagina “Autorizzazioni”:<br />
Figura 16 La pagina “Autorizzazioni”<br />
L’utente Mario non ha nessun permesso, altrimenti l’albero (realizzato con il controllo <strong>della</strong><br />
Telerik RadTreeView) “Talete” sarebbe stato espanso. A questo punto il proprietario può dare<br />
le autorizzazioni, espandendo l’albero, e mettendo i check sulle caselle opportune come<br />
mostrato in figura.<br />
35
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Figura 17 Albero con check nella pagina “Autorizzazioni”<br />
In questo caso, l’utente Mario ha i permessi per accedere solamente a tutta l’area CdG, quin<strong>di</strong><br />
se proverà ad entrare in qualsiasi altra pagina <strong>di</strong> Talete, gli verrà restituito il messaggio<br />
“L’accesso a questa pagina non è consentito”; il bottone “Salva i permessi” permette <strong>di</strong> salvare<br />
le autorizzazioni nel database.<br />
36
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
Figura 18 Il bottone “Salva i permessi”<br />
Dopo aver salvato i permessi, ad ogni accesso alla pagina (delle persone autorizzate<br />
ovviamente), sarà possibile vedere le autorizzazioni dell’utente Mario e <strong>di</strong> conseguenza<br />
mo<strong>di</strong>ficarle con operazioni <strong>di</strong> check/uncheck.<br />
2.4.7 Collaudo del sistema<br />
Dopo la realizzazione del software <strong>di</strong> sistema è necessario effettuare il collaudo per poter<br />
in<strong>di</strong>viduare eventuali errori presenti nel programma, per valutarne l’adeguatezza, per<br />
37
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
evidenziare le prestazioni del sistema e per in<strong>di</strong>care la qualità del software. A tale proposito<br />
sono previste la fase <strong>di</strong> verifica e quella <strong>di</strong> convalida.<br />
Entrambe sono attività che si prefiggono <strong>di</strong> determinare malfunzionamenti, anomalie ed errori<br />
nel software, ma mentre la convalida ha come fine quello <strong>di</strong> assicurare che il sistema software<br />
sia conforme ai requisiti dell’utente, la verifica si occupa <strong>di</strong> assicurarne il corretto<br />
funzionamento rispetto alle specifiche dell’analista.<br />
Nello svolgere queste attività si utilizzano strumenti complementari fra loro quali: i Meto<strong>di</strong><br />
Formali, basati su un’<strong>analisi</strong> statica del co<strong>di</strong>ce e il Testing basato su un’<strong>analisi</strong> <strong>di</strong>namica del<br />
co<strong>di</strong>ce.<br />
L’attenzione è stata focalizzata su quest’ultimo che consiste in un processo <strong>di</strong> valutazione <strong>di</strong> un<br />
sistema attraverso strumenti manuali o automatici al fine <strong>di</strong> determinare se questo sod<strong>di</strong>sfa i<br />
requisiti specificati oppure se il suo comportamento attuale <strong>di</strong>fferisce da quello atteso. Dalla<br />
teoria del testing è noto che esistono due categorie <strong>di</strong> verifiche:<br />
- black-box testing (o testing funzionale): con questo metodo viene effettuata un’<strong>analisi</strong> del<br />
comportamento del software basandosi sui risultati degli output ottenuti eseguendo moduli con<br />
degli input prestabiliti.<br />
- white-box testing (o testing strutturale): in esso i casi <strong>di</strong> test vengono scelti in base<br />
all’implementazione e alla struttura del programma. Questa classe <strong>di</strong> testing é fondata sulla<br />
definizione dei casi <strong>di</strong> prova, degli input associati e del comportamento previsto sulla base <strong>della</strong><br />
conoscenza <strong>della</strong> struttura dell’<strong>applicazione</strong>.<br />
Per quello che riguarda il nostro co<strong>di</strong>ce, ci siamo limitati a svolgere delle verifiche seguendo la<br />
prima tipologia <strong>di</strong> testing con:<br />
- la generazione a priori <strong>di</strong> pattern <strong>di</strong> test prendendo solo i valori semantici delle grammatiche<br />
- il passaggio <strong>di</strong> questi input al debugger<br />
- l’<strong>analisi</strong> degli output<br />
Fondamentale, per lo sviluppo e i miglioramenti del co<strong>di</strong>ce relativo alle autorizzazioni, è stato<br />
il Beta testing, in cui il sistema viene fornito ad alcuni potenziali utenti che accettano <strong>di</strong> usarlo<br />
38
CAPITOLO II - Talete: Autenticazione ed Autorizzazione<br />
e riportare eventuali problemi. È possibile che il Beta testing comporti la mo<strong>di</strong>fica del sistema e<br />
il rilascio <strong>di</strong> nuove versioni da sottoporre nuovamente a questo test.<br />
Il testing è il metodo più usato per determinare malfunzionamenti dei programmi; ma bisogna<br />
sempre tener presente la tesi <strong>di</strong> Dijkstra: “Il test <strong>di</strong> un programma può rilevare la presenza <strong>di</strong><br />
malfunzionamenti, ma mai <strong>di</strong>mostrarne l’assenza “.<br />
39
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design<br />
pattern<br />
40
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
3.1 Introduzione alla progettazione <strong>di</strong> applicazioni object-oriented<br />
Progettare applicazioni basate sul para<strong>di</strong>gma object-oriented non è affatto banale; riuscire a<br />
renderle anche riusabili ed esten<strong>di</strong>bili a piacimento è ancora più arduo. Ciò che occorre <strong>di</strong> volta<br />
in volta, è saper in<strong>di</strong>viduare gli oggetti giusti, con un livello <strong>di</strong> dettaglio e granularità adeguato,<br />
ed essere in grado <strong>di</strong> definire <strong>una</strong> struttura gerarchica consistente, basata su un insieme <strong>di</strong><br />
relazioni e collaborazioni coerenti ed efficaci.<br />
Per questo riuscire nell’intento <strong>di</strong> definire al primo tentativo <strong>una</strong> struttura ad oggetti che sia<br />
corretta e al tempo stesso riusabile e flessibile è “un’impresa” molto <strong>di</strong>fficile, soprattutto nel<br />
caso <strong>di</strong> applicazioni particolarmente complesse. In genere, durante la sua realizzazione,<br />
un’<strong>applicazione</strong> subisce innumerevoli mo<strong>di</strong>fiche dettate dalla variabilità delle specifiche<br />
progettuali, dalla scarsa conoscenza del dominio applicativo e dall’inesperienza. In più la<br />
mancanza <strong>di</strong> tempo, che nei progetti <strong>di</strong> sviluppo è un aspetto quasi congenito, porta sovente a<br />
scegliere soluzioni molto focalizzate sul modello reale attuale e poco orientate a adattarsi ai<br />
cambiamenti futuri.<br />
In uno scenario come quello descritto, <strong>di</strong>venta importante sia per chi progetta, sia per chi scrive<br />
il co<strong>di</strong>ce saper in<strong>di</strong>viduare delle soluzioni che siano riutilizzabili più volte nell’ambito <strong>di</strong> uno<br />
stesso progetto senza ogni volta dover partire da zero per risolvere uno specifico problema.<br />
Per minimizzare il lavoro da svolgere, gli sviluppatori meno esperti solitamente tendono a<br />
ricorrere a tecniche non object-oriented, con il risultato <strong>di</strong> duplicare parti <strong>di</strong> co<strong>di</strong>ce e <strong>di</strong><br />
introdurre in modo più o meno voluto accoppiamento e <strong>di</strong>pendenze tra gli oggetti. Gli architetti<br />
e gli sviluppatori con più esperienza tendono invece a preferire le soluzioni object-oriented che<br />
in passato si sono rivelate vincenti ed efficaci.<br />
Queste soluzioni, che in prima <strong>analisi</strong> possiamo definire pattern, sono orientate a risolvere<br />
particolari problematiche <strong>di</strong> progettazione e tendono ad introdurre, nell’ambito <strong>di</strong> <strong>una</strong> struttura<br />
ad oggetti, quella flessibilità che è necessaria per rendere il co<strong>di</strong>ce riutilizzabile ed esten<strong>di</strong>bile.<br />
Non tutti i pattern sono uguali ed è bene capire come possono essere strutturati e organizzati.<br />
Poiché esistono <strong>di</strong>verse tipologie <strong>di</strong> pattern in funzione <strong>della</strong> loro area <strong>di</strong> <strong>applicazione</strong>, in<br />
generale essi possono essere raggruppati in macrocategorie specifiche (cluster), ciasc<strong>una</strong> delle<br />
41
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
quali contenente pattern orientati a risolvere problematiche similari. Oltre che l’appartenenza<br />
ad un determinato cluster, per un pattern è possibile considerare come fattore <strong>di</strong>stintivo anche il<br />
livello <strong>di</strong> astrazione che lo contrad<strong>di</strong>stingue. Nell’ambito del cluster dei pattern relativi allo<br />
sviluppo <strong>di</strong> applicazioni software possiamo in<strong>di</strong>viduare tre categorie <strong>di</strong> pattern caratterizzate da<br />
un <strong>di</strong>verso livello <strong>di</strong> astrazione:<br />
• Pattern architetturali: descrivono lo schema organizzativo <strong>della</strong> struttura che caratterizza un<br />
sistema software. In genere questi pattern in<strong>di</strong>viduano le parti del sistema a cui sono associate<br />
responsabilità omogenee e le relazioni che esistono tra i <strong>di</strong>versi sottosistemi. Un esempio<br />
significativo <strong>di</strong> pattern architetturale è rappresentato dal layering, che descrive come<br />
sud<strong>di</strong>videre un’<strong>applicazione</strong> in strati logici sovrapposti e tra loro comunicanti.<br />
• Pattern <strong>di</strong> <strong>di</strong>segno: sono i pattern che si riferiscono alle problematiche legate al <strong>di</strong>segno<br />
object-oriented.<br />
• Pattern <strong>di</strong> implementazione (i<strong>di</strong>omi): sono pattern <strong>di</strong> basso livello specifici per <strong>una</strong> particolare<br />
tecnologia (ad esempio per il Framework .NET). Essi descrivono le modalità implementative<br />
da utilizzare per risolvere problematiche <strong>di</strong> sviluppo sfruttando in modo mirato le<br />
caratteristiche peculiari <strong>di</strong> <strong>una</strong> particolare piattaforma.<br />
42
3.2 Il significato dei design pattern<br />
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
Uno degli aspetti più delicati nel <strong>di</strong>segno object-oriented consiste nella scomposizione del<br />
sistema in oggetti. Si tratta <strong>di</strong> un’attività <strong>complessa</strong> dal momento che entrano in gioco fattori<br />
non <strong>di</strong>rettamente collegati alle specifiche funzionali quali l’accoppiamento tra oggetti, la loro<br />
<strong>di</strong>pendenza, la coesione funzionale, la granularità, la flessibilità, l’esten<strong>di</strong>bilità e la riusabilità;<br />
questi aspetti devono necessariamente influenzare il processo <strong>di</strong> scomposizione, talvolta anche<br />
in mo<strong>di</strong> tra loro <strong>di</strong>scordanti.<br />
Esistono <strong>di</strong>versi approcci che permettono <strong>di</strong> scomporre in oggetti un sistema. È possibile<br />
partire dai casi d’uso, in<strong>di</strong>viduare in essi i sostantivi e i verbi e da questi ricavare le classi e i<br />
meto<strong>di</strong> corrispondenti al fine <strong>di</strong> ottenere la struttura ad oggetti desiderata. In alternativa, è<br />
possibile porre l’attenzione principalmente sulle responsabilità e sulle collaborazioni<br />
nell’ambito del sistema in fase <strong>di</strong> stu<strong>di</strong>o e, in funzione <strong>di</strong> esse, in<strong>di</strong>viduare gli oggetti necessari<br />
per gestirle opport<strong>una</strong>mente. Infine è possibile partire da un modello del mondo reale e tradurre<br />
gli elementi in<strong>di</strong>viduati in altrettanti oggetti.<br />
Ognuno <strong>di</strong> questi approcci concorre a definire la struttura statica del sistema che, se da un lato<br />
rispecchia la realtà <strong>di</strong> oggi, dall’altro in genere non si presta <strong>di</strong>rettamente ad evolvere nel tempo<br />
e ad adattarsi alla realtà <strong>di</strong> domani. I design pattern aiutano ad in<strong>di</strong>viduare queste astrazioni e<br />
gli oggetti in grado <strong>di</strong> rappresentarle, agevolando, inoltre, il riuso <strong>di</strong> soluzioni architetturali<br />
note, rendendo accessibili agli architetti e agli sviluppatori tecniche <strong>di</strong> <strong>di</strong>segno universalmente<br />
riconosciute come valide ed efficaci. In questo senso essi aiutano i progettisti ad operare scelte<br />
consapevoli tra le varie alternative possibili allo scopo <strong>di</strong> favorire la riusabilità.<br />
In genere un design pattern è caratterizzato da quattro elementi fondamentali:<br />
• Nome: descrive le funzionalità <strong>di</strong> un pattern con <strong>una</strong> o due parole. Associare un nome ad un<br />
pattern permette <strong>di</strong> identificarlo in modo semplice ed imme<strong>di</strong>ato, e consente <strong>di</strong> con<strong>di</strong>videre le<br />
idee <strong>di</strong> <strong>di</strong>segno ad un livello più alto <strong>di</strong> astrazione, senza la necessità <strong>di</strong> dover entrare nei<br />
dettagli implementativi.<br />
43
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
• Problema: descrive la situazione alla quale applicare il pattern e le con<strong>di</strong>zioni necessarie e<br />
propedeutiche all’utilizzo del pattern stesso.<br />
• Soluzione: descrive in modo astratto come il pattern risolve il problema, specificando gli<br />
elementi coinvolti con le loro responsabilità e collaborazioni. La soluzione viene solitamente<br />
espressa in modo sufficientemente generale da lasciare numerosi gra<strong>di</strong> <strong>di</strong> libertà nelle possibili<br />
scelte implementative. Un pattern infatti è come uno schema che può essere applicato<br />
ripetutamente, il più delle volte in modo particolare e <strong>di</strong>fferente.<br />
• Conseguenze: descrive l’insieme dei risultati e dei vincoli a cui si va incontro<br />
nell’<strong>applicazione</strong> del pattern. Le conseguenze sono fondamentali per poter valutare i vantaggi e<br />
gli svantaggi derivanti dall’uso del pattern e per poter eventualmente preferire soluzioni<br />
alternative per la risoluzione del problema.<br />
3.3 Il cluster dei pattern GoF<br />
Tra i vari design pattern noti in letteratura, i pattern GoF (Gang of Four) formano senza dubbio<br />
un cluster fondamentale. Conoscere i nomi e le motivazioni <strong>di</strong> questi pattern rappresenta senza<br />
dubbio un buon punto <strong>di</strong> partenza per poter successivamente approfon<strong>di</strong>re i dettagli che li<br />
riguardano ed eventualmente valutarne l’utilizzo.<br />
I 23 pattern che compongono questo cluster sono organizzati in tre categorie <strong>di</strong>stinte e tra loro<br />
complementari:<br />
• 5 pattern creazionali, che riguardano la creazione <strong>di</strong> istanze;<br />
44
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
• 7 pattern strutturali, che si riferiscono alla composizione <strong>di</strong> classi e oggetti;<br />
• 11 pattern comportamentali, che si occupano delle modalità con cui classi e oggetti<br />
interagiscono tra loro in relazione alle loro <strong>di</strong>verse responsabilità.<br />
Nella figura seguente sono mostrati tutti i pattern e le categorie a cui appartengono:<br />
Figura 19 I 23 design pattern<br />
Per selezionare i design pattern, bisogna considerare come questi risolvono i problemi <strong>di</strong><br />
progettazione analizzando l’intento del pattern, stu<strong>di</strong>ando le interrelazioni tra essi,<br />
confrontando tra loro i pattern <strong>di</strong> uno stesso scopo; infine un aspetto importante da tener<br />
45
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
presente nella scelta <strong>di</strong> un design pattern è considerare cosa potrebbe essere variabile nel<br />
progetto in modo da anticipare i nuovi requisiti e i cambiamenti a quelli esistenti.<br />
3.4 I design pattern usati in Talete<br />
Dopo aver fatto questa introduzione sui design pattern an<strong>di</strong>amo a vedere il largo uso che se ne<br />
fa nel framework .NET e quin<strong>di</strong> l’implementazione nella nostra <strong>applicazione</strong>.<br />
• ABSTRACT FACTORY<br />
L’Abstract Factory è un pattern creazionale che ha lo scopo <strong>di</strong> fornire un’interfaccia per la<br />
creazione <strong>di</strong> famiglie <strong>di</strong> oggetti tra loro correlati o <strong>di</strong>pendenti, limitando l’accoppiamento<br />
derivante dall’uso <strong>di</strong>retto delle classi concrete. Questo pattern trova <strong>applicazione</strong> all’interno <strong>di</strong><br />
.NET Framework 2.0 in vari ambiti; uno <strong>di</strong> questi è ADO.NET.<br />
ADO.NET è parte integrante del .NET Framework, e mette a <strong>di</strong>sposizione <strong>una</strong> serie <strong>di</strong> classi<br />
che consentono l’accesso a <strong>di</strong>fferenti tipi <strong>di</strong> database con la massima efficienza possibile.<br />
I managed provider <strong>di</strong> ADO.NET 2.0 implementano un insieme comune <strong>di</strong> classi astratte<br />
contenute nel namespace System.Data.Common; ciasc<strong>una</strong> implementazione contiene aspetti<br />
peculiari relativi alla sorgente dati a cui il data provider concreto si riferisce.<br />
Tra le classi del namespace System.Data.Common è presente la classe statica<br />
DbProviderFactories che ha lo scopo <strong>di</strong> fornire le funzionalità necessarie all’enumerazione e<br />
alla creazione degli oggetti factory specifici <strong>di</strong> ogni managed provider. Tramite il metodo<br />
GetFactoryClasses() è possibile ottenere l’elenco dei data provider specificati nell’ambito dei<br />
file <strong>di</strong> configurazione, mentre tramite il metodo GetFactory(String) è possibile creare uno<br />
46
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
specifico oggetto factory in funzione del nome invariante che identifica univocamente il<br />
managed provider da utilizzare.<br />
Le classi derivate da DbProviderFactory consentono a loro volta <strong>di</strong> istanziare i principali<br />
oggetti per l’accesso ai dati come <strong>una</strong> connessione o un comando, eliminando l’accoppiamento<br />
tra l’istanza creata e il suo contesto d’utilizzo. Sfruttando il polimorfismo e l’insieme <strong>di</strong> classi<br />
base astratte contenute in System.Data.Common, l’approccio basato sul provider factory<br />
permette <strong>di</strong> scrivere co<strong>di</strong>ce che è in<strong>di</strong>pendente dal particolare managed provider utilizzato. Nel<br />
nostro caso abbiamo la classe DatabaseConfigurationView.cs in cui viene creato l’oggetto<br />
factory:<br />
DbProviderFactory providerFactory = DbProviderFactories.GetFactory(dbProviderName);<br />
e la classe:<br />
public sealed class MySQLClientFactory : DbProviderFactory<br />
che ere<strong>di</strong>ta da DbProviderFactory<br />
Il provider name viene specificato nel file web.config nella sezione connection strings:<br />
<br />
<br />
<br />
Nel web.config viene specificato il nome del PC, la sorgente dei dati che in questo caso è il<br />
localhost, il nome del database e la stringa <strong>di</strong> connessione relativa ad un database MySQL.<br />
• BUILDER<br />
Il pattern Builder consente <strong>di</strong> <strong>di</strong>videre la costruzione <strong>di</strong> un oggetto complesso e composito dalla<br />
sua rappresentazione, in maniera tale che lo stesso processo <strong>di</strong> costruzione possa essere<br />
47
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
utilizzato per creare rappresentazioni <strong>di</strong>verse. Questo pattern è molto usato all’interno <strong>di</strong> .NET<br />
Framework, ma <strong>una</strong> delle applicazioni più significative riguarda senza dubbio la costruzione<br />
delle stringhe <strong>di</strong> connessione verso <strong>una</strong> sorgente dati.<br />
Oltre ad essere recuperata dal file <strong>di</strong> configurazione (web.config), <strong>una</strong> stringa <strong>di</strong> connessione<br />
può essere costruita in modo programmatico; ADO.NET 2.0 fornisce in modo nativo per i vari<br />
managed provider un’implementazione specifica <strong>della</strong> classe astratta<br />
dbConnectionStringBuilder per la costruzione <strong>di</strong> stringhe <strong>di</strong> connessione in modo<br />
programmatico.<br />
La classe in questione permette <strong>di</strong> assemblare la stringa <strong>di</strong> connessione, fornendo un controllo<br />
intrinseco sul formato e sulla vali<strong>di</strong>tà delle parti costituenti. I parametri <strong>della</strong> stringa <strong>di</strong><br />
connessione sono proprietà dell’oggetto builder, che possono essere settate prima<br />
dell’assemblaggio finale. Nel caso in cui i parametri <strong>della</strong> stringa <strong>di</strong> connessione derivino da<br />
input da parte dell’utente (come, per esempio, controlli TextBox), l’utilizzo dell’oggetto<br />
builder migliora notevolmente la <strong>sicurezza</strong>, riducendo in modo significativo il rischio <strong>di</strong><br />
iniezioni.<br />
Nel nostro caso abbiamo la classe MySQLConnectionStringBuilder che ere<strong>di</strong>ta da<br />
DbConnectionStringBuilder<br />
public sealed class MySQLConnectionStringBuilder : DbConnectionStringBuilder<br />
• TEMPLATE METHOD<br />
Il Template Method permette <strong>di</strong> definire la struttura <strong>di</strong> un algoritmo all’interno <strong>di</strong> un metodo <strong>di</strong><br />
<strong>una</strong> classe lasciando ai tipi da essa derivati, la responsabilità <strong>di</strong> definire in modo particolare<br />
alcuni dei passi dell’algoritmo, senza dover implementare ogni volta da zero l’intera struttura<br />
dell’algoritmo stesso; un esempio molto significativo è rappresentato dai controlli Web.<br />
Ciascun controllo è soggetto ad un ciclo <strong>di</strong> vita per la costruzione del markup necessario alla<br />
sua rappresentazione, durante il quale sono eseguiti <strong>una</strong> serie <strong>di</strong> passi fino al rendering finale.<br />
48
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
Questi passi sono rappresentati da altrettanti meto<strong>di</strong>, per lo più protetti, che implementano le<br />
caratteristiche e i comportamenti predefiniti per il controllo.<br />
Molti dei principali controlli, tra cui Button, Label o Image, implementando in modo<br />
particolare questi meto<strong>di</strong> (non necessariamente tutti), ridefiniscono le modalità con cui il loro<br />
markup viene generato. Nel nostro applicativo questa personalizzazione la possiamo<br />
evidenziare nei controlli <strong>della</strong> Telerik da noi usati per estendere quelli che Visual Stu<strong>di</strong>o mette<br />
già a <strong>di</strong>sposizione.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Con questi due esempi è possibile vedere la customizzazione <strong>di</strong> 2 web controls <strong>della</strong> Telerik<br />
che sono il RadMenuItem e la RadSplitBar.<br />
Questo tipo <strong>di</strong> rappresentazione e la strutturazione forniscono un meccanismo molto potente e<br />
pratico per la personalizzazione dei controlli da parte degli sviluppatori. Del resto la<br />
motivazione principale del pattern Template Method è quella <strong>di</strong> fornire un meccanismo <strong>di</strong> riuso<br />
del co<strong>di</strong>ce, che limiti al massimo le ripetizioni, possibili cause <strong>di</strong> errori inattesi dovuti ad <strong>una</strong><br />
scarsa standar<strong>di</strong>zzazione dei comportamenti <strong>di</strong> base.<br />
49
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
L’uso del pattern Template Method rappresenta anche <strong>una</strong> soluzione efficace in termini <strong>di</strong><br />
esten<strong>di</strong>bilità. È il caso, per esempio, <strong>di</strong> System.Collections.ObjectModel.Collection.<br />
Questa classe è la rappresentazione <strong>di</strong> un insieme <strong>di</strong> elementi <strong>di</strong> tipo T, che funge da wrapper<br />
per il tipo generico System.Collections.Generic.List, ma, rispetto ad esso, fornisce<br />
meccanismi <strong>di</strong> esten<strong>di</strong>bilità sfruttando appunto il pattern in questione. Sono tanti gli esempi <strong>di</strong><br />
uso <strong>di</strong> questo template nel nostro co<strong>di</strong>ce; <strong>di</strong> seguito viene riportata <strong>una</strong> proprietà <strong>della</strong> classe<br />
Concessionario.cs, in cui viene customizzato il tipo generico System.Collections.Generic.List<br />
con System.Collections.Generic.List:<br />
Figura 20 Template Method in Talete<br />
In pratica questa proprietà restituisce <strong>una</strong> lista <strong>di</strong> organizzazioni, cioè <strong>di</strong> oggetti <strong>di</strong> tipo<br />
Organizzazione, selezionandole tramite <strong>una</strong> query Select dal database. Si può notare l’uso del<br />
parameter id nella query per evitare SQL injection (minaccia che sarà approfon<strong>di</strong>ta in seguito).<br />
50
CAPITOLO III - Progettare un’<strong>applicazione</strong>: i design pattern<br />
Questi 3 pattern mostrati sono solo un esempio dell’importanza del loro uso<br />
nell’implementazione del co<strong>di</strong>ce <strong>di</strong> un’<strong>applicazione</strong>, ma le forme e i mo<strong>di</strong> con cui servirsi <strong>di</strong><br />
essi sono tanti, considerando che l’esperienza è un fattore fondamentale per <strong>una</strong> buona<br />
progettazione; infatti, un progettista esperto non parte mai da zero, riutilizza soluzioni che si<br />
sono <strong>di</strong>mostrate valide in passato. Quin<strong>di</strong>, oltre al riuso nella scrittura del software, è<br />
fondamentale anche un riuso nella progettazione.<br />
51
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
52
4.1 Introduzione<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Da sempre sono state scritte applicazioni <strong>di</strong> tipo informatico senza dare tanto peso (o forse per<br />
niente) al problema <strong>della</strong> <strong>sicurezza</strong>; ma come è stato già detto in precedenza, ora i tempi sono<br />
cambiati. Infatti, fino a <strong>una</strong> decina <strong>di</strong> anni fa c’erano applicazioni monolitiche, stand-alone, che<br />
giravano su un singolo PC (il più delle volte staccato dalla rete). Quin<strong>di</strong> i problemi <strong>di</strong> <strong>sicurezza</strong><br />
erano quasi sconosciuti, magari si usava qualche password solo per collegarsi in rete; oggi il<br />
<strong>di</strong>scorso è cambiato ra<strong>di</strong>calmente come si può vedere anche dalla tabella seguente.<br />
Year 2000 2001 2002 2003 2004 2005 2006 1Q,2007<br />
Vulnerabilities 1,090 2,437 4,129 3,784 3,780 5,990 8,064 2,176<br />
(da www.cert.org)<br />
Figura 21 Statistiche degli attacchi nel 2007<br />
53
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Dalle statistiche risulta che il numero <strong>di</strong> vulnerabilità aumenta terribilmente anno dopo anno e<br />
lo stesso vale anche per le intrusioni; questo non è dovuto al fatto che si utilizza software più<br />
“bacato”, oppure sistemi operativi meno sicuri o apparecchiature più scadenti, ma si può<br />
constatare che ci sono sempre più fonti <strong>di</strong> attacco. Naturalmente il problema che lo sviluppatore<br />
non si è mai posto prima, ora comincia a <strong>di</strong>ventare molto importante e da prendere in<br />
considerazione da subito nello sviluppo: “la <strong>sicurezza</strong> deve essere parte integrante <strong>di</strong> ogni<br />
singola fase del ciclo <strong>di</strong> vita <strong>di</strong> un’<strong>applicazione</strong> e deve partire dall’architettura”.<br />
4.2 Evoluzione degli attacchi<br />
Perché scrivere co<strong>di</strong>ce sicuro? Come <strong>di</strong>ce Gartner (specializzato in ricerche <strong>di</strong> mercato), gli<br />
attacchi si stanno spostando dal livello <strong>di</strong> rete a quello applicativo (“over 70% of security<br />
vulnerabilità exists at the application layer, not network layer”); ad esempio è possibile, con<br />
<strong>una</strong> SQL-injection, bucare <strong>una</strong> rete robusta penetrando nella DMZ.<br />
Oggi viviamo un momento in cui il mirino è puntato soprattutto sulle applicazioni web. Sono<br />
queste infatti ad offrire un’appetibile superficie <strong>di</strong> attacco visto che ogni singola pagina<br />
costituisce un potenziale punto <strong>di</strong> ingresso per l’hacker, alla continua ricerca <strong>di</strong> <strong>una</strong><br />
vulnerabilità. Pensare però che la <strong>sicurezza</strong> si riduca ad <strong>una</strong> partita sul web è un grosso errore.<br />
Tuttavia l’aver rafforzato le barriere sul web sposta necessariamente l’attenzione su tutto il<br />
resto e l’attacco dall’interno <strong>della</strong> lan è <strong>una</strong> delle attrattive più forti.<br />
Basti pensare al classico software gestionale: si può <strong>di</strong>re esente da problemi <strong>di</strong> <strong>sicurezza</strong> perché<br />
lavora solo in lan? Certamente no, in quanto le minacce dall’interno <strong>di</strong> essa sono in continuo<br />
aumento, siano essi attacchi consapevoli o inconsapevoli, come quelli veicolati da utenti che<br />
scaricano e installano malware da Internet. Quanto danno possono fare i privilegi <strong>di</strong> un utente<br />
54
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
nella lan? Guardando per un attimo il problema solo dal punto <strong>di</strong> vista applicativo, si può<br />
immaginare la possibilità che ha un utente <strong>di</strong> collegarsi <strong>di</strong>rettamente al database aziendale<br />
tramite Access e scrivere dentro le tabelle; purtroppo questa è ancora <strong>una</strong> realtà troppo <strong>di</strong>ffusa e<br />
pericolosissima.<br />
La figura seguente ci mostra alcune delle minacce da cui <strong>di</strong>fendersi.<br />
Figura 22 Tipi <strong>di</strong> attacco<br />
Tra gli attacchi più comuni a cui è possibile assistere, ci sono quelli provenienti dall’interno,<br />
naturale evoluzione dato che le wan <strong>di</strong>ventano sempre più robuste e sicure; oramai c’è <strong>una</strong> serie<br />
<strong>di</strong> attacchi automatizzati per cui il rischio che ha un’importante azienda è uguale a quello che<br />
ha un sito poco visitato in quanto, con questa automazione, i programmi iterano gli in<strong>di</strong>rizzi ip<br />
55
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
<strong>della</strong> rete, “spazzolando” fino a quando trovano delle porte o dei servizi aperti attraverso cui<br />
effettuare l’exploit.<br />
Da non sottovalutare gli attacchi DoS tramite i quali, come sarà spiegato in seguito, un servizio<br />
viene mandato in tilt per un po’ <strong>di</strong> tempo causando un <strong>di</strong>sservizio.<br />
Poi abbiamo virus, spyware, malware, ecc. ma anche utenti che eseguono dei servizi con<br />
privilegi troppo alti come mostrato in figura.<br />
4.3 Caratteristiche e problematiche legate alla <strong>sicurezza</strong><br />
Uno dei concetti fondamentali in <strong>sicurezza</strong> è che essa non può essere considerata <strong>una</strong><br />
caratteristica del software. Essa è trasversale, parte dall’architettura, passa dalla progettazione,<br />
si concretizza nello sviluppo e trova conferme nei test.<br />
Ovviamente scrivere co<strong>di</strong>ce sicuro, mettendosi nei panni dello sviluppatore, non è facile in<br />
quanto chi attacca è notevolmente avvantaggiato; chi <strong>di</strong>fende deve proteggere tutti i fronti,<br />
mentre a chi attacca basta <strong>una</strong> sola vulnerabilità. Inoltre chi <strong>di</strong>fende lo fa in base alle proprie<br />
conoscenze e può farlo solo contro attacchi già noti, quin<strong>di</strong> si potrà sempre scoprire qualcosa <strong>di</strong><br />
nuovo che lo sviluppatore non conosce e non può considerare nella sua strategia <strong>di</strong> <strong>sicurezza</strong><br />
attuale. Ovviamente, ci sono anche dei “contro” nell’<strong>applicazione</strong> <strong>di</strong> tecniche <strong>di</strong> <strong>sicurezza</strong>:<br />
- il costo elevato, in quanto coor<strong>di</strong>nare, trovare il bug, sistemare il co<strong>di</strong>ce, testarlo, e spiegarlo<br />
al cliente (a volte è <strong>una</strong> cosa molto imbarazzante) comporta <strong>una</strong> spesa in termini economici,<br />
che può essere notevole in quanto la correzione <strong>di</strong> un bug <strong>di</strong> <strong>sicurezza</strong> può devastare il co<strong>di</strong>ce<br />
rispetto a un fix locale.<br />
- il tempo perso<br />
- la per<strong>di</strong>ta <strong>di</strong> fiducia dei clienti<br />
56
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Per legge la <strong>sicurezza</strong> è un problema che non può essere ignorato e deve essere gestito. Infatti,<br />
la legge italiana, e non solo, obbliga la protezione e la riservatezza dei dati personali; le<br />
vulnerabilità <strong>di</strong> tipo “information <strong>di</strong>sclosure” riguardano <strong>di</strong>rettamente la privacy, cioè<br />
informazioni che non era previsto che uscissero da <strong>una</strong> ristretta cerchia <strong>di</strong> persone con<br />
determinati privilegi, sono fruibili anche da altri che non sono autorizzati.<br />
Non si può permettere che i dati consegnati ad un’azienda vengano <strong>di</strong>vulgati a tutti.<br />
4.3.1 La <strong>sicurezza</strong> dei dati<br />
Il dato è il “pane” dell’informatica; ogni <strong>applicazione</strong> opera su dati, ogni operazione è relativa a<br />
dati. Il dato è gestito dall’<strong>applicazione</strong> che fornisce <strong>una</strong> funzionalità ad un utente.<br />
Inoltre bisogna tener presente che:<br />
1. alcuni utenti devono accedere ai dati e altri non devono poterli vedere;<br />
2. alcuni devono poter vedere tutti i dati presenti e altri devono poter vedere solo alcuni<br />
dati specifici;<br />
3. alcuni devono vedere un dato in tutta la sua storia e altri solo in uno specifico stato;<br />
4. alcuni possono operare sul dato a tutto tondo, altri hanno modalità d’accesso limitato.<br />
La <strong>sicurezza</strong> sui dati è possibile esplicarla attraverso 4 elementi:<br />
1 Accesso/<strong>sicurezza</strong> dei dati. La <strong>sicurezza</strong> del dato è legata primariamente al controllo<br />
dell’accesso:<br />
• Sicurezza nella trasmissione e nel trasferimento dei dati<br />
• Sicurezza nell’accesso alle applicazioni <strong>di</strong> <strong>gestione</strong><br />
57
• Sicurezza nell’accesso ai dati<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Per il primo aspetto non abbiamo grossi problemi, il dato può essere trasferito con <strong>di</strong>versi<br />
protocolli, ma tutti questi hanno, chi più e chi meno, supporti alla <strong>gestione</strong> <strong>della</strong> <strong>sicurezza</strong>;<br />
il concetto base è quello <strong>di</strong> trasferire i dati in modo cifrato.<br />
Per molto tempo questo è sembrato l’anello debole <strong>della</strong> catena <strong>della</strong> <strong>sicurezza</strong> e, <strong>di</strong><br />
conseguenza, è stato l’aspetto più curato.<br />
Il secondo problema, quello relativo al controllo <strong>di</strong> <strong>sicurezza</strong> nell’accesso all’<strong>applicazione</strong>,<br />
è tipicamente un problema facilmente risolvibile, poiché <strong>una</strong> specifica logica applicativa è<br />
sufficiente a profilare gli utenti e fornire loro il corretto accesso.<br />
Per ultimo, il problema <strong>della</strong> <strong>gestione</strong> <strong>della</strong> <strong>sicurezza</strong> nell’accesso al dato vero e proprio,<br />
viene elegantemente risolto attraverso gli strumenti nativi dei database relazionali o con un<br />
approccio applicativo.<br />
2 Integrità dei dati. Il dato nasce e vive <strong>una</strong> propria vita in cui viene letto, mo<strong>di</strong>ficato e<br />
cancellato; se è manipolato sempre dallo stesso utente ed è mantenuto in un sistema<br />
“protetto” non ha grossi problemi. Le <strong>di</strong>fficoltà nascono invece, quando i dati sono trattati<br />
da <strong>di</strong>versi utenti, e quin<strong>di</strong> c’è concorrenza su <strong>di</strong> essi; bisogna garantire, in queste con<strong>di</strong>zioni,<br />
la loro integrità.<br />
3 Integrità referenziale. Dopo aver affrontato il problema <strong>della</strong> concorrenza sui dati ne appare<br />
un altro, che è quello dell’integrità referenziale degli stessi.<br />
Per integrità referenziale si intende che due istanze presenti in due entità e correlate tra loro<br />
devono essere sempre coerenti.<br />
Ad esempio se c’è un’anagrafica <strong>di</strong> un prodotto che è classificato attraverso <strong>una</strong> tabella <strong>di</strong><br />
categorie valide, non si deve permettere <strong>di</strong> cancellare <strong>una</strong> categoria finché sia presente<br />
anche un solo prodotto che sia catalogato con quella categoria. Se così non fosse<br />
risulterebbe un prodotto con <strong>una</strong> categoria che non esiste.<br />
L’integrità referenziale serve a garantire che questa coerenza <strong>di</strong> dati venga mantenuta.<br />
4 Integrità delle informazioni. Oltre all’integrità dei dati abbiamo un altro problema da<br />
affrontare, quello dell’integrità delle informazioni.<br />
58
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Non ha alcun senso garantire che un padre non venga cancellato in presenza <strong>di</strong> almeno un<br />
figlio, se poi l’informazione che il sistema deve esprimere, perde <strong>di</strong> significato nel momento<br />
che viene cancellato l’ultimo figlio <strong>di</strong> un padre.<br />
L’importante è mantenere sempre un controllo lucido sul dato che si gestisce, prestando<br />
sempre <strong>una</strong> grande attenzione agli automatismi che si possono applicare.<br />
4.4 Certificati<br />
Un aspetto fondamentale <strong>della</strong> <strong>sicurezza</strong> delle web applications, legato ai dati e alle<br />
informazioni è quello che riguarda i certificati e le connessioni SSL (Secure Sockets Layer);<br />
queste tecnologie sono in<strong>di</strong>pendenti dalla programmazione Asp.NET.<br />
Un certificato <strong>di</strong>gitale è un messaggio con firma <strong>di</strong>gitale utilizzato <strong>di</strong> norma per attestare la<br />
vali<strong>di</strong>tà <strong>di</strong> <strong>una</strong> chiave pubblica, composto da:<br />
1 Numero <strong>di</strong> serie del certificato;<br />
2 Informazioni sull’algoritmo utilizzato;<br />
3 Estremi <strong>di</strong> chi ha rilasciato il certificato;<br />
4 Vali<strong>di</strong>tà del certificato (data);<br />
5 Informazioni sull’algoritmo <strong>di</strong> chiave pubblica del soggetto del certificato;<br />
6 Firma <strong>di</strong>gitale dell’autorità rilasciante.<br />
Essenzialmente, i certificati permettono <strong>di</strong> attestare che il sito e le informazioni<br />
dell’organizzazione sono registrate e soprattutto verificate da <strong>una</strong> certificate authority. Questo<br />
generalmente aumenta la fiducia del cliente, anche se non garantisce che la società o<br />
l’organizzazione agisca responsabilmente e onestamente. Un certificato è un po’ come la<br />
patente <strong>di</strong> guida, che non prova che <strong>una</strong> persona sa guidare, ma attesta che <strong>una</strong> terza parte (in<br />
59
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
questo caso la motorizzazione) può certificare la qualifica dell’utente. Un web server richiede<br />
un certificato per usare SSL, che automaticamente cripta tutte le informazioni scambiate tra<br />
client e server.<br />
Per aggiungere un certificato ad un sito, bisogna acquistarlo da <strong>una</strong> certificate authority, tra le<br />
quali abbiamo:<br />
• VeriSign (http://www.verisign.com)<br />
• GeoTrust (http://www.geotrust.com)<br />
• GlobalSign (http://www.globalsign.com)<br />
• Thawte (http://www.thawte.com)<br />
La tecnologia SSL cripta la comunicazione tra un client ed un sito web. Anche se rallenta le<br />
prestazioni, essa viene usata quando, tra un utente autenticato ed <strong>una</strong> web application, devono<br />
essere trasmesse informazioni private o dati sensibili. Senza SSL, ogni informazione che viene<br />
spe<strong>di</strong>ta su Internet, incluso password, numeri <strong>di</strong> carta <strong>di</strong> cre<strong>di</strong>to, ed elenchi d’impiegati sono<br />
facilmente visibili da un ficcanaso con appositi strumenti <strong>di</strong> rete come gli sniffer.<br />
Anche applicando ai dati la migliore cifratura, c’è un altro problema: come può un client essere<br />
sicuro che un web server è quello che il client cerca? Per esempio, si consideri un cracker<br />
intelligente che usa <strong>una</strong> sorta <strong>di</strong> IP spoofing per “spacciarsi” come Amazon.com; anche se la<br />
comunicazione avviene tramite SSL per trasferire le informazioni <strong>della</strong> carta <strong>di</strong> cre<strong>di</strong>to, il web<br />
server maligno può decriptare agevolmente l’informazione. Per questo SSL usa i certificati;<br />
questi stabiliscono l’identità, mentre SSL protegge la comunicazione. Se un utente maligno<br />
abusa <strong>di</strong> un certificato, la certificate authority può revocarlo; ovviamente per usare SSL, c’è<br />
bisogno <strong>di</strong> installare un certificato valido. Per accedere alla pagina con SSL, il cliente inserisce<br />
l’URL preceduta da https anziché http all’inizio <strong>della</strong> richiesta (o comunque avviene il<br />
re<strong>di</strong>rect). Nel co<strong>di</strong>ce Asp.NET è possibile controllare e verificare se un utente sta trasferendo<br />
informazioni su un canale sicuro o meno:<br />
60
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 23 Co<strong>di</strong>ce <strong>di</strong> verifica <strong>di</strong> trasferimento su un canale sicuro<br />
Riferendoci alla nostra <strong>applicazione</strong>, l’uso <strong>di</strong> SSL è fondamentale, soprattutto per criptare le<br />
credenziali dell’utente che accede alla piattaforma o per proteggere dati sensibili delle aziende<br />
come i budget; infatti, senza questo canale sicuro, con strumenti <strong>di</strong> rete come ethereal, <strong>di</strong>venta<br />
semplice catturare username e password come mostrato nell’esempio seguente:<br />
61
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 24 Accesso a Talete<br />
In assenza <strong>di</strong> SSL, catturando i pacchetti con ethereal, è possibile vedere in uno <strong>di</strong> questi il<br />
passaggio in chiaro <strong>di</strong> username e password:<br />
Figura 25 Pacchetto con username e password<br />
62
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
L’inserimento <strong>della</strong> protezione SSL è <strong>una</strong> procedura ancora da completare in Talete;<br />
innanzitutto è stata inserita la seguente proprietà:<br />
In questo modo, quando si va ad effettuare il login, si ottiene il seguente messaggio d’errore:<br />
“ L’<strong>applicazione</strong> è configurata per inviare cookie protetti. Tali cookie richiedono che il<br />
browser invii la richiesta me<strong>di</strong>ante SSL (protocollo https), mentre la richiesta corrente non è<br />
basata su SSL”.<br />
Il passo successivo è la configurazione <strong>di</strong> IIS per fare in modo che Talete giri sotto SSL e<br />
l’acquisto <strong>di</strong> un certificato da <strong>una</strong> CA.<br />
4.4.1 Come lavora SSL<br />
Con SSL, il client e il web server avviano <strong>una</strong> sessione sicura prima <strong>di</strong> comunicare qualsiasi<br />
informazione che usa <strong>una</strong> chiave <strong>di</strong> co<strong>di</strong>fica generata casualmente.<br />
Di seguito sono descritte le varie fasi:<br />
Fase 1: Client_Hello<br />
– Il client invia un messaggio Client_Hello al Server per informarlo che vuole<br />
iniziare <strong>una</strong> sessione. Tale messaggio può essere mandato anche per rinegoziare<br />
<strong>una</strong> sessione. Il messaggio contiene:<br />
• le combinazioni <strong>di</strong> algoritmi <strong>di</strong> crittografia supportati dal Client;<br />
• <strong>una</strong> lista <strong>di</strong> algoritmi <strong>di</strong> compressione supportati dal Client;<br />
– Dopo aver mandato un Client_Hello, il client rimane in attesa <strong>di</strong> un Server_Hello<br />
63
Fase 2: Server_Hello<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
– Il server risponde al client con un alert (per il fallimento dell’handshake) o con un<br />
Server_Hello_msg nel quale sceglie la suite <strong>di</strong> crittografia, l’algoritmo <strong>di</strong><br />
compressione e invia altri dati sulla sessione. Se il server non supporta gli<br />
algoritmi del client, invia un failure.<br />
Fase 3: Server_Certificate (opzionale)<br />
– Il server invia un messaggio <strong>di</strong> Server_Certificate per autenticarsi. Se il server<br />
non ha un certificato manda un “server_key_change msg”. Può anche richiedere<br />
al client un certificato (certificate request).<br />
Fase 4: Server_hello_done<br />
– Il server, dopo aver mandato il server_hello_msg (ed anche gli altri messaggi <strong>di</strong><br />
certificazione) rimane in attesa <strong>di</strong> <strong>una</strong> risposta del client.<br />
Fase 5: Client_key_exchange<br />
– Se il client autentica il server, manda un messaggio client_key_exchange.<br />
Fase 6: Change_cipher_spec e finished<br />
– Il client manda tale messaggio seguito da un finished.<br />
– Il server risponde con un change_cipher_spec e manda finished.<br />
Fase 7: Scambio <strong>di</strong> messaggi<br />
– client e server si scambiano i record prodotti dal Record Layer e crittografati<br />
usando le specifiche concordate nell’Hello<br />
64
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 26 Fasi dell’SSL<br />
65
4.4.2 Obiettivi SSL<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Sono tanti i vantaggi derivanti dall’<strong>applicazione</strong> del protocollo SSL, tra cui troviamo:<br />
1 Sicurezza del collegamento: SSL garantisce <strong>una</strong> comunicazione sicura tra due endpoint;<br />
2 Interoperabilità: programmatori <strong>di</strong> <strong>di</strong>verse organizzazioni sono in grado <strong>di</strong> sviluppare<br />
applicazioni utilizzando SSL, accordandosi sui parametri utilizzati dagli algoritmi <strong>di</strong><br />
crittografia;<br />
3 Ampliamento: SSL fornisce <strong>una</strong> struttura in cui nuovi meto<strong>di</strong> <strong>di</strong> crittografia a chiave<br />
pubblica e a chiave simmetrica, possono essere incorporati senza dover creare un nuovo<br />
protocollo;<br />
4 Efficienza: l’SSL ha incorporato uno schema <strong>di</strong> “session caching” opzionale che riduce<br />
il numero <strong>di</strong> collegamenti che devono essere stabiliti ex-novo (ad es. attività sulla rete);<br />
questo è molto importante in quanto le operazioni <strong>di</strong> crittografia tendono ad essere molto<br />
laboriose per la CPU, soprattutto quelle a chiave pubblica.<br />
4.4.3 Come usare male SSL<br />
Ci sono alcuni siti <strong>di</strong> banche italiane che a volte usano male ssl per <strong>di</strong>versi motivi: in<br />
particolare, spesso vengono chieste le credenziali su <strong>una</strong> normale pagina http facendo<br />
successivamente il post su ssl e questo è un errore, perché la pagina mostrata, essendo http, non<br />
da la certezza che possa provenire (e quin<strong>di</strong> essere erogata) dal sito <strong>della</strong> banca; cioè cosa può<br />
essere successo? Il dns che viene usato dal client, cioè dagli utenti <strong>della</strong> banca potrebbe essere<br />
stato avvelenato, e, nel momento in cui si va a <strong>di</strong>gitare l’URL www.miabanca.com, il dns non<br />
restituisce l’in<strong>di</strong>rizzo <strong>della</strong> banca, bensì quello del sito dell’hacker che ha <strong>una</strong> pagina identica a<br />
66
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
quella <strong>della</strong> banca; a questo punto vengono chieste le credenziali e l’utente non sa se il<br />
postback è su http o https. Quin<strong>di</strong> fondamentale è non solo il cripting dei dati con ssl, ma l’uso<br />
del certificato che garantisce che chi sta dall’altra parte è effettivamente l’entità che <strong>di</strong>ce <strong>di</strong><br />
essere. Il certificato client garantisce la banca, mentre quello server autentica l’in<strong>di</strong>rizzo del sito<br />
oltre a criptare le informazioni. Anche il cookie sul client è un punto <strong>di</strong> attacco in quanto non si<br />
ha la <strong>sicurezza</strong> che esso sia immune da cross site scripting.<br />
Altri meto<strong>di</strong> oltre ssl per garantire <strong>una</strong> comunicazione sicura potrebbero essere la VPN,<br />
l’IPSEC (ottimo), oppure l’IPSEC /L2TP.<br />
4.5 Principi <strong>di</strong> <strong>sicurezza</strong> in Asp.NET<br />
Le applicazioni che ci riguardano più da vicino, visto lo sviluppo <strong>della</strong> piattaforma Talete, sono<br />
quelle Asp.NET che, “per default”, sono <strong>di</strong>sponibili a qualsiasi utente che può connettersi al<br />
server (se è in Internet o su <strong>una</strong> rete locale). Sebbene questo è l’ideale per molte applicazioni<br />
web (ed incarna lo spirito con cui è nata e cresciuta Internet), non è sempre appropriato. Per<br />
esempio, un sito <strong>di</strong> e-commerce ha bisogno <strong>di</strong> fornire un esercizio d’acquisto sicuro per<br />
accaparrarsi clienti.<br />
Un sito subscription-based ha bisogno <strong>di</strong> limitare contenuto o accesso ad esso, oppure ad<br />
alcune parti come ad esempio ad <strong>una</strong> pagina <strong>di</strong> configurazione o ad un report amministrativo.<br />
In questo ambito, Asp.NET fornisce un modello <strong>di</strong> <strong>sicurezza</strong> a vari livelli che facilita la<br />
protezione delle web applications. Anche se questo “schema” <strong>di</strong> <strong>sicurezza</strong> è potente ed<br />
assolutamente flessibile, può apparire confusionario a causa del numero <strong>di</strong> strati in cui la<br />
<strong>sicurezza</strong> può essere applicata; molto del lavoro non viene dallo scrivere co<strong>di</strong>ce ma dal<br />
determinare le zone adatte in cui implementarla.<br />
67
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Il primo passo nella protezione delle applicazioni web è decidere dove si ha bisogno <strong>della</strong><br />
<strong>sicurezza</strong> e ciò che deve proteggere. Per esempio, ci potrebbe essere la necessità <strong>di</strong> impe<strong>di</strong>re<br />
l’accesso a chiunque per proteggere delle informazioni riservate, oppure solamente <strong>di</strong><br />
rafforzare <strong>una</strong> subscription policy; altre volte non si ha bisogno <strong>di</strong> alcun genere <strong>di</strong> protezione,<br />
ma si vuole solo un sistema <strong>di</strong> login per offrire personalizzazione per visitatori frequenti.<br />
Questi requisiti determinano l’approccio e la strategia da usare.<br />
La <strong>sicurezza</strong> non ha bisogno <strong>di</strong> essere <strong>complessa</strong>, ma deve essere applicata su larga scala. Per<br />
esempio, anche se si costringono gli utenti a loggarsi in <strong>una</strong> parte del sito, bisogna assicurarsi<br />
che le informazioni siano immagazzinate nel database con un account sicuro, con <strong>una</strong> password<br />
che non possa essere indovinata facilmente da un utente sulla rete locale. C’è bisogno <strong>di</strong><br />
garantire anche che l’<strong>applicazione</strong> non venga mo<strong>di</strong>ficata da utenti malintenzionati in modo tale<br />
da spe<strong>di</strong>re informazioni private (come attraverso delle query impostate male).<br />
Il modello <strong>di</strong> <strong>sicurezza</strong> in Asp.NET può essere rappresentato con la seguente figura.<br />
Figura 27 Modello <strong>di</strong> <strong>sicurezza</strong> in Asp.NET<br />
68
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Come si può notare dalla figura, le richieste web sono passate prima all’IIS (Internet<br />
Information Services) che poi le trasferirà all’<strong>applicazione</strong> Asp.NET (se è <strong>una</strong> richiesta<br />
Asp.NET).<br />
È possibile applicare la <strong>sicurezza</strong> e quin<strong>di</strong> la sua politica in <strong>di</strong>verse zone <strong>di</strong> questo modello.<br />
Prima, considerando il processo <strong>di</strong> richiesta <strong>di</strong> <strong>una</strong> pagina web or<strong>di</strong>naria (non Asp.NET):<br />
1. IIS prova ad autenticare l’utente.<br />
2. Se IIS autentica con successo l’utente, gli manda l’appropriato file html che è stato<br />
richiesto.<br />
Mentre <strong>una</strong> richiesta Asp.NET richiede dei passi ad<strong>di</strong>zionali. Il primo e l’ultimo passo sono gli<br />
stessi <strong>della</strong> procedura già vista, ma il processo ha dei livelli interme<strong>di</strong>:<br />
1. IIS prova ad autenticare l’utente<br />
2. Se IIS autentica con successo l’utente, esso passa la richiesta ad Asp.NET con ulteriori<br />
informazioni sull’utente autenticato.<br />
3. Se Asp.NET autentica l’utente, quest’ultimo può effettuare richieste <strong>di</strong> pagine .aspx o<br />
del servizio web <strong>di</strong> asmx. Il co<strong>di</strong>ce può compiere anche controlli <strong>di</strong> <strong>sicurezza</strong><br />
supplementari (per esempio, chiedendo un’altra parola d’or<strong>di</strong>ne prima <strong>di</strong> permettere <strong>una</strong><br />
specifica operazione).<br />
4. Quando il co<strong>di</strong>ce Asp.NET richiede delle risorse (per esempio, prova ad aprire un file o<br />
connettersi ad un db), il sistema operativo compie i suoi controlli <strong>di</strong> <strong>sicurezza</strong>.<br />
4.5.1 Autenticazione e autorizzazione in Asp.NET<br />
Uno degli scenari più <strong>di</strong>ffusi nelle applicazioni web e al tempo stesso più <strong>di</strong>fficile da gestire,<br />
specie con le versioni precedenti <strong>di</strong> Asp.NET, riguarda l’autenticazione e l’autorizzazione<br />
69
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
all’accesso a pagine protette; è <strong>una</strong> funzionalità da cui moltissime applicazioni web ormai non<br />
possono più prescindere, perché consente <strong>di</strong> dare accesso ad alcune aree solo a determinati<br />
utenti, provvisti <strong>di</strong> certi privilegi, così da rendere possibile, ad esempio, l’aggiunta <strong>di</strong> un’area<br />
ad accesso riservato, che consente <strong>di</strong> amministrare in tutta <strong>sicurezza</strong> e autonomia<br />
l’<strong>applicazione</strong>. Asp.NET 2.0 introduce in quest’ambito delle novità che rendono più semplice<br />
l’implementazione <strong>di</strong> queste funzionalità, attraverso Membership e Roles API, costruite intorno<br />
al Provider Model, un modello teso a favorire lo sviluppo <strong>di</strong> applicazioni basate su provider,<br />
facili da creare e imme<strong>di</strong>ate da configurare.<br />
Con il termine “autenticazione” s’intende il processo con cui si determina l’identità <strong>di</strong> un<br />
soggetto e si “costringono” gli utenti a provare che loro sono effettivamente chi <strong>di</strong>cono <strong>di</strong><br />
essere. Di solito, questo comporta l’immissione <strong>di</strong> credenziali (tipicamente un nome utente e<br />
<strong>una</strong> password) in <strong>una</strong> pagina o finestra <strong>di</strong> login. Generalmente, queste credenziali sono<br />
autenticate, controllate e confrontate con quelle <strong>di</strong> un elenco <strong>di</strong> utenti in un archivio o in un<br />
database back-end.<br />
Gli attori sono (almeno):<br />
1 <strong>applicazione</strong> che deve autenticare<br />
2 principal: un’entità che può essere autenticata<br />
3 authority: un’entità che rappresenta e riconosce i principal, associandoli a dei ruoli che<br />
classificano le “capabilities” <strong>di</strong> quest’utente.<br />
L’autorizzazione è, invece, quel processo che, dopo l’autenticazione da parte <strong>di</strong> un utente,<br />
determina se costui ha i permessi sufficienti per compiere <strong>una</strong> determinata azione o accedere<br />
alla risorsa richiesta (come ad esempio vedere <strong>una</strong> pagina o recuperare informazioni da un<br />
database, ecc.).<br />
L’autenticazione e l’autorizzazione sono le due pietre angolari per creare un sito sicuro. Per<br />
capire meglio l’importanza <strong>di</strong> questi aspetti, possiamo fare un’analogia con la procedura <strong>di</strong><br />
accesso al sistema operativo Windows. Quando un computer con Windows viene avviato,<br />
l’utente fornisce username e password, in modo tale da autenticarsi al sistema. Da quel punto in<br />
poi, ogni volta che s’interagisce con <strong>una</strong> risorsa limitata (come un archivio, database, chiave <strong>di</strong><br />
registro, ecc.), Windows compie <strong>di</strong> nascosto controlli <strong>di</strong> autorizzazione per garantire che lo<br />
70
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
user account abbia i <strong>di</strong>ritti necessari per portare a termine ciò che tenta <strong>di</strong> fare; la stessa cosa<br />
deve accadere in un’<strong>applicazione</strong> Asp.NET.<br />
Per comprendere in modo adeguato quanto sia potente l’approccio usato da Asp.NET, è<br />
necessario per prima cosa aprire <strong>una</strong> piccola parentesi sui meccanismi <strong>di</strong> autenticazione<br />
utilizzati, che rappresentano la base su cui Membership e Roles API si poggiano.<br />
Questi componenti non fanno altro che utilizzare un pezzo dell’architettura <strong>di</strong> HttpRuntime,<br />
cioè del cuore <strong>di</strong> Asp.NET, chiamato HttpModule.<br />
Asp.NET è provvisto <strong>di</strong> tre HttpModule specifici, ognuno per la <strong>di</strong>fferente tipologia <strong>di</strong><br />
autenticazione, <strong>di</strong> cui il nome già rappresenta un’in<strong>di</strong>cazione:<br />
• FormsAuthenticationModule<br />
• WindowsAuthenticationModule<br />
• PassportAuthenticationModule<br />
Il primo è rivolto essenzialmente a siti pubblici che non rientrano nell’ambito delle Intranet, per<br />
le quali è consigliabile il secondo. L’ultimo, specifico per Passport, è ad uso e consumo <strong>di</strong><br />
Microsoft.<br />
4.5.2 L’utente in Asp.NET: Principal e Identity<br />
Asp.NET utilizza due classi per rappresentare le informazioni relative all’utente, che sono<br />
implementate in maniera tale da essere in<strong>di</strong>pendenti dal tipo <strong>di</strong> autenticazione: Principal e<br />
Identity.<br />
71
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
La classe Principal contiene le informazioni <strong>di</strong> protezione relative all’utente, sotto forma <strong>di</strong> un<br />
oggetto che implementa l’interfaccia IIdentity, e dei ruoli a cui lo stesso appartiene. È inoltre<br />
rappresentato da <strong>una</strong> serie <strong>di</strong> oggetti che implementano l’interfaccia IPrincipal.<br />
Identity rappresenta l’identità <strong>di</strong> un utente (WindowsIdentity, FormsIdentity, PassportIdentity,<br />
GenericIdentity).<br />
Principal ed Identity sono legati tra loro e variano a seconda del tipo <strong>di</strong> autenticazione<br />
utilizzato: nel caso dell’autenticazione Windows gli oggetti utilizzati saranno rispettivamente<br />
WindowsPrincipal e WindowsIdentity, mentre con Forms Authentication gli oggetti saranno<br />
GenericPrincipal e GenericIdentity.<br />
All’interno dell’identità dell’utente è dunque contenuta l’appartenenza ai ruoli, secondo le<br />
modalità specifiche del tipo <strong>di</strong> autenticazione.<br />
L’accesso a queste informazioni è regolato attraverso la proprietà User, che viene restituita sia<br />
attraverso la classe HttpContext, che <strong>di</strong>rettamente come proprietà <strong>della</strong> classe Page.<br />
Attraverso il metodo IsInRole si può verificare l’appartenenza ad un certo ruolo, mentre<br />
IIdentity ha la proprietà Name, con cui si può risalire al nome utente, e quella<br />
IsAuthenticated, che stabilisce se l’utente è stato autenticato o meno.<br />
Figura 28 Interfaccia IIdentity<br />
Figura 29 Interfaccia IPrincipal<br />
72
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Di seguito viene proposto un esempio in cui si nota come con le classi GenericIdentity e<br />
GenericPrincipal si può gestire in modo personalizzato il sistema <strong>di</strong> autenticazione e<br />
autorizzazione:<br />
Prima si costruisce l’oggetto GenericIdentity passandogli l’username, poi si crea l’oggetto<br />
GenericPrincipal passandogli il GenericIdentity e l’array <strong>di</strong> stringhe che sono i ruoli che si<br />
vogliono assegnare al particolare utente:<br />
Nella nostra <strong>applicazione</strong>, abbiamo creato la classe TaleteIdentity.cs:<br />
73
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 30 Classe “TaleteIdentity” in Talete<br />
Come si nota dal co<strong>di</strong>ce, questa classe deriva da GenericIdentity, e ha come proprietà Utente,<br />
Name, NomeVisualizzato e il metodo SetOrganizzazione. Questa classe, ai fini<br />
dell’autorizzazione degli utenti è fondamentale, in quanto, come già visto<br />
nell’implementazione, il metodo richiamato è:<br />
identity.Utente.Autorizzato(string pagina)<br />
con<br />
TaleteIdentity identity = Page.User.Identity as TaleteIdentity;<br />
L’altra classe, o meglio interfaccia, fondamentale è IPrincipal in Talete:<br />
74
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 31 Interfaccia “IPrincipal” in Talete<br />
Come già accennato nell’introduzione, non è stato possibile gestire tutto il meccanismo <strong>di</strong><br />
autenticazione e autorizzazione con queste due interfacce, in quanto l’unico ruolo statico è<br />
l’amministratore, per cui il metodo IsInRole è usato solo con questo tipo <strong>di</strong> utente:<br />
4.5.3 Web.config: il tag <br />
if (Page.User.IsInRole("Amministratore"))...<br />
con<br />
public IPrincipal User { get; }<br />
Per controllare chi può accedere al sito web, c’è bisogno <strong>di</strong> aggiungere regole <strong>di</strong> controllo<br />
dell’accesso alla sezione del file web.config. Questo è un esempio che duplica<br />
il comportamento <strong>di</strong> default:<br />
75
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 32 Esempio n°1 <strong>di</strong> nel web.config<br />
Esistono due caratteri speciali, “*” e “?”, che in<strong>di</strong>cano rispettivamente “All users” e<br />
“Anonymous User”; nel file web.config i settaggi <strong>di</strong> default permettono l’uso a tutti gli utenti.<br />
Per cambiare questo comportamento, bisogna esplicitamente aggiungere <strong>una</strong> regola più<br />
restrittiva, in questo modo:<br />
Figura 33 Esempio n°2 <strong>di</strong> nel web.config<br />
Includendo questa regola nel file web.config, si specifica che non sono permessi utenti<br />
anonimi. Ogni utente deve essere autenticato, e qualsiasi operazione dell’utente richiederà il<br />
cookie <strong>di</strong> <strong>sicurezza</strong>.<br />
76
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Un approccio comune nel progetto <strong>di</strong> un’<strong>applicazione</strong> web è <strong>di</strong> mettere i file che richiedono<br />
autenticazione in <strong>una</strong> <strong>di</strong>rectory separata. Con i file <strong>di</strong> configurazione <strong>di</strong> Asp.NET questa<br />
metodologia è semplice da seguire. Basta lasciare l’impostazione <strong>di</strong> default <br />
nella <strong>di</strong>rectory padre, e aggiungere le specifiche restrizioni nel web.config, il quale negherà<br />
l’accesso a queste <strong>di</strong>rectory ad utenti anonimi. Lo stesso si può fare con i file; a tal proposito<br />
viene presentato un esempio con <strong>una</strong> parte del “ web.config” <strong>della</strong> nostra <strong>applicazione</strong>:<br />
Figura 34 Web.config <strong>di</strong> Talete<br />
Come è possibile evincere dal co<strong>di</strong>ce, alla cartella App_Themes è permesso l’accesso a tutti gli<br />
utenti, cosi come al file Default.aspx; alla pagina PasswordRecovery è permesso l’accesso solo<br />
agli utenti anonimi, mentre alla cartella CdG possono accedere solo utenti autenticati, cioè che<br />
hanno già inserito nella form del login username e password.<br />
77
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
I settaggi si applicano secondo la regola “First Match Wins”, cioè l’or<strong>di</strong>ne <strong>di</strong> valutazione delle<br />
autorizzazioni va dal primo verso l’ultimo.<br />
Quin<strong>di</strong> nell’esempio seguente il secondo tag verrebbe ignorato:<br />
<br />
<br />
Con la figura seguente è possibile riassumere i concetti <strong>di</strong> autenticazione e autorizzazione in<br />
Asp.NET:<br />
4.5.4 API per la <strong>sicurezza</strong><br />
Figura 35 Autenticazione e autorizzazione in Asp.NET<br />
Con Asp.NET 2.0 sono state introdotte delle API che hanno rivoluzionato totalmente il modo<br />
<strong>di</strong> lavorare con la <strong>sicurezza</strong> consentendo un’elevata flessibilità nella scelta delle caratteristiche<br />
da aggiungere alle proprie applicazioni. È presente un modello unificato che permette <strong>di</strong> avere<br />
2 set <strong>di</strong>versi <strong>di</strong> API che sono:<br />
1. Membership API<br />
2. Roles API<br />
78
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Esse sono state costruite principalmente per <strong>di</strong>saccoppiare quello che è il mondo dei controlli e<br />
quin<strong>di</strong> la possibilità <strong>di</strong> gestire in maniera interattiva il controllo sulla <strong>gestione</strong> dell’utente e dei<br />
ruoli. Per fare questo abbiamo un meccanismo, chiamato provider model, il quale, pluggando<br />
un nuovo provider, a prescindere dall’<strong>applicazione</strong> che utilizza le membership e le roles,<br />
automaticamente fornisce un nuovo modo <strong>di</strong> registrare le credenziali e i ruoli.<br />
Il Provider Model è un design pattern che può essere considerato come l’uso congiunto <strong>di</strong> altri<br />
pattern già definiti, dove lo Strategy Pattern, che appartiene alla famiglia dei pattern GOF<br />
(Gang of Four), è sicuramente quello che si nota con maggior facilità: si basa sulla creazione <strong>di</strong><br />
<strong>una</strong> famiglia <strong>di</strong> algoritmi, incapsulati e resi intercambiabili tra <strong>di</strong> loro, richiamati in maniera<br />
in<strong>di</strong>pendente dal contesto.<br />
Il vantaggio <strong>di</strong> questo approccio è che cambiando il provider non è necessario cambiare il<br />
co<strong>di</strong>ce che richiama le API, che è poi l’unica interfaccia utilizzata dalle applicazioni. Nel caso<br />
<strong>di</strong> Asp.NET, il provider è specificato attraverso il web.config e caricato, attraverso<br />
un’operazione <strong>di</strong> Dependency Injection, quando le API hanno bisogno <strong>di</strong> fornire <strong>una</strong><br />
determinata funzionalità. Con questo modello qualsiasi sviluppatore può creare un provider,<br />
dato che le API rappresentano un ponte verso il provider, che è l’effettivo componente che<br />
fornisce l’implementazione concreta, avendo al tempo stesso il medesimo approccio, garantito<br />
dall’utilizzo <strong>di</strong> <strong>una</strong> classe astratta come base comune per queste classi.<br />
È possibile scrivere custom Providers (sono <strong>di</strong>sponibili per Oracle, MySQL).<br />
1. MEMBERSHIP API<br />
Le Membership API rappresentano il primo modo per mettere in pratica, al tempo stesso, i<br />
concetti propri del Provider Model e quelli dell’autorizzazione integrata in Asp.NET, attraverso<br />
gli HttpModule.<br />
Esse gestiscono utenti e credenziali, fornendo la logica per validare gli utenti e le password,<br />
creare nuovi utenti ed altro ancora; inoltre gestiscono lo store per le credenziali, in<strong>di</strong>rizzi e-mail<br />
e altri dati relativi all’utente. Si tratta <strong>di</strong> <strong>una</strong> serie <strong>di</strong> funzionalità che forniscono l’infrastruttura<br />
comune a tutti i provider, in grado <strong>di</strong> garantire un’uniformità <strong>di</strong> creazione <strong>della</strong> parte <strong>di</strong><br />
79
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
<strong>gestione</strong> degli utenti. Il meccanismo delle Membership API è costituito da due componenti<br />
fondamentali:<br />
• le API, richiamate <strong>di</strong>rettamente dallo sviluppatore ed implementate attraverso la classe statica<br />
Membership;<br />
• i provider, che forniscono le funzionalità specifiche in base allo storage e che derivano dalla<br />
classe base astratta MembershipProvider.<br />
In un modello del genere, i meto<strong>di</strong> <strong>della</strong> classe Membership richiamano il corrispondente<br />
metodo definito all’interno del provider, usando un’istanza dello stesso, creata a partire dalle<br />
impostazioni specificate nel web.config.<br />
Lo schema a blocchi del Membership Provider Model è sostanzialmente il seguente:<br />
Figura 36 Membership API<br />
In pratica abbiamo nello strato più basso il Membership Store, che è sostanzialmente il livello<br />
fisico, il database come SQLServer o MySQL, oppure Active Directory o altri ottenuti<br />
scrivendo dei Provider. Al livello superiore ci sono i Membership Providers, che servono a<br />
salvare o comunque a mantenere le informazioni, su <strong>di</strong> un supporto per immagazzinare i dati. Il<br />
ruolo del Membership Provider è quin<strong>di</strong> quello <strong>di</strong> fare da ponte tra le Membership API e i<br />
80
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
supporti d’immagazzinamento dei dati, in modo che lo sviluppatore non debba scrivere co<strong>di</strong>ce<br />
a basso livello. Se lo sviluppatore vuole immagazzinare i suoi dati in un formato <strong>di</strong>verso, ad<br />
esempio in un documento XML, può scrivere un proprio Membership Provider ad hoc. Salendo<br />
troviamo le Membership API che possono essere <strong>di</strong>rettamente utilizzate dalle applicazioni; in<br />
questo modo è possibile controllare lo stato <strong>della</strong> Membership oppure dell’utente con <strong>una</strong> serie<br />
<strong>di</strong> meto<strong>di</strong> e proprietà, le quali andranno a leggere dal file web.config qual è il provider<br />
installato nello specifico ed utilizzarlo. Quin<strong>di</strong> esse non sono legate alla presenza <strong>di</strong> un<br />
particolare provider. Alla fine abbiamo i controlli che usano le Membership API e che<br />
permettono <strong>di</strong> gestire le classiche operazioni <strong>di</strong> Login.<br />
La classe Membership provvede meto<strong>di</strong> statici per eseguire le azioni più frequenti, tra i quali:<br />
- CreateUser: aggiunge un utente allo store <strong>della</strong> Membership<br />
- DeleteUser: rimuove un utente dallo store <strong>della</strong> Membership<br />
- GeneratePassword: genera <strong>una</strong> password random <strong>della</strong> lunghezza specificata<br />
- GetAllUsers: carica <strong>una</strong> collection <strong>di</strong> oggetti MembershipUser<br />
- GetNumberOfUsersOnline: restituisce il numero <strong>di</strong> utenti collegati<br />
- GetUser: carica un singolo oggetto MembershipUser che rappresenta un utente<br />
- UpdateUser: aggiorna le informazioni per uno specifico utente<br />
- ValidateUser: valida il login sulla base <strong>di</strong> username e password verificando che siano corrette<br />
La classe MembershipUser invece si occupa <strong>della</strong> <strong>gestione</strong> delle informazioni utente come la<br />
password, oppure delle domande per recuperare password smarrite.<br />
2. ROLES API<br />
Con lo stesso spirito <strong>di</strong> Membership API, vale a <strong>di</strong>re quello <strong>di</strong> favorire la semplicità<br />
d’implementazione <strong>di</strong> funzionalità ripetitive, Roles API fornisce l’infrastruttura necessaria ad<br />
aggiungere anche il supporto per i ruoli applicativi all’utente.<br />
Il Role Manager ci abilita alla <strong>gestione</strong> in automatico <strong>della</strong> <strong>sicurezza</strong> a ruoli basato sulla logica<br />
a provider, con 3 provider <strong>di</strong> default:<br />
1. AuthorizationStoreRoleProvider (per l’e<strong>di</strong>tabilità, cioè la <strong>gestione</strong> dei ruoli)<br />
81
2. SQLRoleProvider<br />
3. WindowsTokenRoleProvider<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Le API Roles servono per mettere in corrispondenza gli utenti con i ruoli e <strong>di</strong> conseguenza la<br />
classe Roles definisce meto<strong>di</strong> per creare un nuovo ruolo, verificare se ad un utente è associato<br />
un determinato ruolo, ecc.<br />
Per quanto riguarda la parte architetturale, ancora <strong>una</strong> volta abbiamo il Roles Store, cioè dei<br />
dati e i relativi Roles Providers. Tra le Roles Api, abbiamo solo la classe Roles e infine i<br />
controlli che utilizzano le Roles API per sfruttare queste funzionalità.<br />
Figura 37 Roles API<br />
82
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
4.6 Controlli per gestire l’accesso e l’autenticazione in Asp.NET 2.0<br />
Per rendere più semplice l’implementazione delle API viste in precedenza, la versione 2.0 <strong>di</strong><br />
Asp.NET introduce alcuni nuovi server control <strong>di</strong> tipo security, che automatizzano questo<br />
genere <strong>di</strong> operazioni, grazie all’utilizzo <strong>di</strong> un approccio totalmente <strong>di</strong>chiarativo.<br />
L’idea è che grazie al fatto che le API sono fisse e non cambiano mai (a farlo è solo il<br />
provider), si possono creare dei server control in grado <strong>di</strong> richiamare queste API, senza<br />
necessità <strong>di</strong> essere cambiati nel tempo.<br />
Le aree in cui questi controlli impattano sono quelle legate alle operazioni più <strong>di</strong>ffuse, e sono<br />
state inserite nella nostra piattaforma:<br />
ChangePassword: consente il cambio password;<br />
CreateUserWizard: fornisce un wizard per l’iscrizione <strong>di</strong> un utente;<br />
Login: fornisce l’infrastruttura necessaria al login;<br />
LoginName: mostra il nome utente;<br />
LoginStatus: mostra lo stato dell’utente (autenticato o no);<br />
LoginView: supporta la visualizzazione <strong>di</strong> template in base allo stato dell’utente;<br />
PasswordRecovery: consente <strong>di</strong> recuperare la password esistente o <strong>di</strong> crearne <strong>una</strong> nuova,<br />
quando si utilizza un formato hashed.<br />
Questi controlli coprono quasi il 100% delle necessità presenti in questi scenari, adattandosi in<br />
automatico al provider in uso; inoltre questi compiti, che prima richiedevano la scrittura <strong>di</strong><br />
co<strong>di</strong>ce, adesso possono essere svolti semplicemente trascinando i relativi controlli dalla barra<br />
degli strumenti all’area <strong>di</strong> lavoro oppure inserendoli nel source code <strong>della</strong> pagina .aspx.<br />
1) Login: permette <strong>di</strong> verificare automaticamente utente e password, quin<strong>di</strong> fa la validazione<br />
sullo store specificato nel file web.config<br />
83
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 38 Controllo “Login”<br />
2) LoginStatus: questo controllo in<strong>di</strong>ca lo stato dell’utente e da la possibilità, cliccando, <strong>di</strong><br />
andare alla pagina <strong>di</strong> Login. Quin<strong>di</strong> agli utenti che sono loggati fornisce la possibilità <strong>di</strong> fare<br />
il logout; a quelli non loggati permette <strong>di</strong> effettuare il login.<br />
Figura 39 Controllo “LoginStatus”<br />
3) LoginName: in<strong>di</strong>ca quale è il login name, cioè il nome dell’utente che è in questo momento<br />
loggato, oppure “blank ” se non è loggato nessuno<br />
Figura 40 Controllo “LoginName”<br />
4) LoginView: esso fa da contenitore per altri controlli e mostra le informazioni circa lo stato<br />
dell’utente collegato; inoltre informa se egli ha già effettuato il login, cioè se ha già eseguito<br />
l’autenticazione. All’interno <strong>di</strong> questo controllo viene fatto un match tra l’identità dell’utente e<br />
il ruolo che è specificato nella combo. Nel template (nella figura loggedInTemplate) viene<br />
specificato cosa deve accadere (ad es. cosa visualizzare) con un utente anonimo e con uno<br />
loggato; in questo secondo caso, in Talete, devono essere visualizzate tutte le pagine<br />
(Mo<strong>di</strong>ficaDati, CambiaOrganizzazione, etc.) mostrate in figura.<br />
84
Mentre con AnomynousTemplate si ha:<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 41 Controllo “LoginView”<br />
Figura 42 Controllo “LoginView” in Talete: LoggedInTemplate<br />
Figura 43 Controllo “LoginView”in Talete: AnonymousTemplate<br />
85
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
5) CreateUserWizard: è il controllo specifico per l’inserimento <strong>di</strong> un wizard nella pagina per<br />
la registrazione <strong>di</strong> un nuovo utente. Raccoglie le informazioni minime necessarie alla creazione<br />
(username, e-mail e password) e procede ad invocare il metodo CreateUser <strong>della</strong> classe<br />
Membership, che a sua volta richiamerà lo stesso metodo offerto dal provider. Nel nostro caso<br />
abbiamo:<br />
• 4 label per inserire “Nome e Cognome”, “In<strong>di</strong>rizzo email”, “Password” e “Nome<br />
utente”<br />
• Un validatore nel caso l’username già esista<br />
• Un bottone per generare l’evento<br />
Figura 44 Controllo “CreateUserWizard”<br />
6) ChangePassword e PasswordRecovery servono rispettivamente per cambiare la password<br />
o recuperare la stessa. Il primo va ovviamente messo su <strong>una</strong> pagina riservata agli utenti<br />
autenticati, laddove il secondo deve essere aperto a tutti. Nelle due figure sono mostrati l’uso<br />
dei controlli in Talete:<br />
86
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Figura 45 Controllo “ChangePassword”<br />
Figura 46 Controllo “PasswordRecovery”<br />
In questo modo è stata realizzata l’interfaccia per il Login con autenticazione <strong>di</strong> tipo<br />
“Forms”. Questo tipo <strong>di</strong> autenticazione non esegue automaticamente il criptaggio delle<br />
credenziali che vengono inserite; questa protezione sarà implementata per evitare<br />
intercettazioni furtive.<br />
La modalità si usa per applicazioni web a <strong>di</strong>fferenza <strong>della</strong><br />
che richiederebbe la creazione <strong>di</strong> un account utente su <strong>una</strong><br />
macchina Windows.<br />
87
4.7 La <strong>sicurezza</strong> in Asp.NET: il ViewState<br />
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
Così come la Windows Form è il componente base <strong>di</strong> ogni <strong>applicazione</strong> per Windows, la Web<br />
Form è il centro <strong>di</strong> un’<strong>applicazione</strong> Asp.NET. Scendendo nei dettagli dell’implementazione,<br />
<strong>una</strong> Web Form è <strong>una</strong> pagina web in cui tutti gli elementi (testo, elenchi, pulsanti, caselle, ecc.)<br />
sono inseriti all’interno <strong>di</strong> <strong>una</strong> normale form HTML, ovvero tra i tag e .<br />
Quando la pagina viene caricata all’interno del browser, viene generato l’evento Page_Load.<br />
Nel co<strong>di</strong>ce del delegato per Page_Load è possibile verificare se l’utente sta eseguendo il primo<br />
accesso alla pagina oppure sta effettuando un PostBack. La tecnica del postback è quella che<br />
consente ad <strong>una</strong> pagina Web <strong>di</strong> trasmettere a se stessa delle informazioni <strong>di</strong> stato. In pratica in<br />
<strong>una</strong> pagina web <strong>di</strong>namica viene creata <strong>una</strong> form che ha, come campo «action» l’in<strong>di</strong>rizzo <strong>della</strong><br />
pagina stessa, ed al suo interno dei campi «hidden» che mantengono informazioni sullo stato<br />
<strong>della</strong> pagina. Queste informazioni, <strong>una</strong> volta generato un evento "Submit" (che non<br />
necessariamente scaturisce da un bottone), vengono "rispe<strong>di</strong>te in<strong>di</strong>etro" alla pagina che le usa<br />
per mo<strong>di</strong>ficare il suo aspetto.<br />
Questa tecnica è abbastanza comune per chi programma in Asp o PHP, ma Asp.NET l’ha<br />
integrata nel concetto <strong>di</strong> Web Form con il PostBack e il ViewState.<br />
Osservando il sorgente <strong>di</strong> <strong>una</strong> pagina, ad esempio quella dei Concessionari,<br />
(http://www.talete.net/Admin/Concessionari.aspx), notiamo che nella form è stato inserito<br />
anche un campo nascosto <strong>di</strong> nome __VIEWSTATE, che può apparire nel modo seguente:<br />
Il ViewState è <strong>una</strong> tabella associativa co<strong>di</strong>ficata che contiene lo stato degli oggetti presenti<br />
nella form, ad esempio il testo inserito in <strong>una</strong> casella, oppure quali CheckBox sono state<br />
selezionate. HTTP è un protocollo stateless (senza stato), ovvero non mantiene informazioni<br />
sullo stato <strong>di</strong> <strong>una</strong> pagina tra <strong>una</strong> visita e l’altra: per sopperire a tale mancanza, Asp.NET<br />
utilizza il campo ViewState. Ogni volta che si ricarica <strong>una</strong> pagina, i controlli in essa presenti<br />
88
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
(come ad esempio un submit per la form) vengono inizializzati sulla base del contenuto del<br />
ViewState, che viene generato automaticamente da Asp.NET. Lo stato <strong>della</strong> pagina viene<br />
mantenuto se si eseguono richieste consecutive <strong>della</strong> stessa pagina. Nel caso venga richiesta<br />
<strong>una</strong> nuova pagina, il ViewState utilizzato sarà perso e sostituito da uno nuovo. Questa<br />
soluzione consente <strong>di</strong> trasferire lo stato dei controlli dal server al client e viceversa; ciò<br />
significa che quando il server leggerà il ViewState <strong>di</strong> <strong>una</strong> pagina sarà in grado <strong>di</strong> ripristinare, ad<br />
esempio, il valore corrente <strong>di</strong> tutti i campi «input», senza bisogno che sia il programmatore a<br />
farlo via co<strong>di</strong>ce. Trattandosi <strong>di</strong> <strong>una</strong> tabella associativa, inoltre, nel ViewState è possibile<br />
inserire anche dei valori personalizzati.<br />
Per mantenere le informazioni durante la navigazione, è possibile ricorrere all’oggetto Session.<br />
Anch’esso si comporta come <strong>una</strong> tabella associativa e funziona esattamente come il ViewState;<br />
tuttavia le variabili archiviate al suo interno non vengono cancellate quando l’utente passa da<br />
<strong>una</strong> pagina a un’altra dell’<strong>applicazione</strong>, ma sono mantenute per tutta la "sessione" che inizia<br />
quando un browser punta al nostro sito e finisce quando viene chiusa.<br />
Le informazioni passate nel campo nascosto possono essere visualizzate nel sorgente HTML<br />
<strong>della</strong> pagina, creando <strong>una</strong> potenziale problematica <strong>di</strong> <strong>sicurezza</strong> tale che, pur archiviando il dato<br />
con enco<strong>di</strong>ng base64 ed in un formato hashed tramite <strong>una</strong> MAC (Machine Authentication<br />
Code) key, lo stesso può essere alterato o intercettato da utenti malintenzionati, e quin<strong>di</strong> i dati<br />
memorizzati nel ViewState posso essere facilmente deco<strong>di</strong>ficati<br />
Visualizzando il ViewState all’interno <strong>di</strong> <strong>una</strong> pagina HTML è facile pensare che la stringa sia<br />
crittografata, ma si tratta <strong>di</strong> <strong>una</strong> semplice co<strong>di</strong>fica in Base 64; è possibile comunque attivare<br />
due livelli <strong>di</strong> protezione per il ViewState:<br />
1 A prova <strong>di</strong> alterazione: viene utilizzato un co<strong>di</strong>ce hash che consente <strong>di</strong> ridurre le<br />
probabilità <strong>di</strong> spoofing sull’<strong>applicazione</strong>. In pratica si imposta a true, nella pagina aspx che si<br />
intende proteggere, l’attributo EnableViewStateMAC:<br />
<br />
89
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
2 Crittografica: tutte le informazioni vengono crittografate utilizzando l’algoritmo<br />
simmetrico Triple DES. In questo caso, oltre a impostare a “true” l’attributo<br />
EnableViewStateMAC, si definisce il tipo <strong>di</strong> convalida machineKey a 3DES nel web.config:<br />
<br />
In ogni caso è importante ricordare che, maggiore sarà il livello <strong>di</strong> protezione adottato, più<br />
lungo sarà il tempo <strong>di</strong> elaborazione <strong>della</strong> pagina quin<strong>di</strong>, anche in questo caso, è necessario<br />
utilizzare il ViewState con la dovuta cautela, ponderando sempre ogni singola scelta.<br />
4.7.1 Il ViewState in Asp.NET 2.0<br />
In Asp.NET 2.0, il meccanismo per il controllo e l’utilizzo <strong>della</strong> cifratura è stato espanso. I<br />
settaggi <strong>di</strong> cifratura ora possono essere separatamente impostati per ogni pagina. Inoltre, i<br />
controlli sulla pagina possono richiedere che la cifratura sia usata per il ViewState, ma anche<br />
questa richiesta può essere “scavalcata” dai settaggi <strong>della</strong> pagina e quin<strong>di</strong> ignorata. Il tutto<br />
grazie all’attributo ViewStateEncryptionMode che ha 3 valori: Auto che è quello <strong>di</strong> default,<br />
Always, e Never.<br />
• ViewStateEncryptionMode.Auto: in questo modo, Asp.NET cripterà il ViewState per<br />
<strong>una</strong> pagina se un controllo nella pagina lo richiede.<br />
• ViewStateEncryptionMode.Never: in questo modo Asp.NET non cripterà il<br />
ViewState, anche se i controlli nella pagina l’hanno richiesto.<br />
90
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
• ViewStateEncryptionMode.Always: in questo modo, Asp.NET non aspetta la richiesta<br />
<strong>di</strong> cifratura da parte <strong>di</strong> <strong>una</strong> pagina, ma il ViewState sarà sempre criptato; quest’ultima<br />
opzione è fondamentale se si lavora con dati sensibili.<br />
Il modo è <strong>una</strong> proprietà nella pagina:<br />
Oppure si può impostare nel web.config:<br />
<br />
Figura 47 Esempio d’uso del ViewStateEncryptionMode<br />
Mentre, per scrivere un controllo customizzato che richiede la cifratura del ViewState si usa il<br />
metodo <strong>della</strong> classe page chiamato RegisterRequiresViewStateEncryption:<br />
Figura 48 Esempio d’uso del RegisterRequiresViewStateEncryption<br />
91
CAPITOLO IV - La <strong>sicurezza</strong> nelle web applications<br />
In Talete, poiché nel ViewState non sono presenti dati sensibili o comunque pericolosi se<br />
vengono visualizzati, (ad esempio variabili contenenti id) è stato impostato l’attributo<br />
ViewStateEncryptionMode ad Auto, in modo tale che se qualche controllo particolare lo<br />
richiede, il ViewState <strong>della</strong> pagina in cui è presente quel controllo sarà criptato, altrimenti il<br />
ViewState sarà co<strong>di</strong>ficato, come <strong>di</strong> default, in Base 64.<br />
92
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong><br />
un’<strong>applicazione</strong><br />
93
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
5.1 Architettura a più livelli <strong>di</strong> un’<strong>applicazione</strong> web<br />
Quando si parla <strong>di</strong> <strong>sicurezza</strong> e la si ricerca in un’<strong>applicazione</strong>, il concetto da tener presente è<br />
che “la <strong>sicurezza</strong> non è <strong>una</strong> feature, ma deve essere parte dell’architettura”.<br />
Nel corso degli anni la più classica architettura client-server ha <strong>di</strong>mostrato tutti i suoi punti<br />
deboli per scalabilità, tempi <strong>di</strong> down per manutenzione, potenza hardware necessaria e sul<br />
fronte <strong>sicurezza</strong> le cose non vanno certamente meglio dato che si ha <strong>una</strong> maggiore superficie <strong>di</strong><br />
attacco. La prima e più semplice evoluzione è un’architettura multilivello che comporta almeno<br />
la sud<strong>di</strong>visione in tre livelli logico-funzionali (applicazioni Three-Tier) che sono:<br />
presentazione, logico e dati. Il primo strato, più esterno, viene gestito dal web server e si<br />
occupa <strong>della</strong> presentazione dei dati, strutturandoli e formattandoli in <strong>una</strong> GUI tramite un<br />
linguaggio interpretabile dal browser (o da un generico client), tipicamente html oppure xml.<br />
Il layer logico è il vero nucleo dell’<strong>applicazione</strong>. In esso si concentra l’implementazione degli<br />
algoritmi, sia quelli funzionali all’offerta del servizio, sia quelli accessori, come per esempio il<br />
controllo <strong>di</strong> <strong>sicurezza</strong>. Capita, però, che questo strato sia talmente sottile da poterlo inglobare<br />
nel presentation layer oppure, al contrario, sia così complesso da dover essere <strong>di</strong>viso in <strong>di</strong>verse<br />
sezioni cooperanti fra loro che si occupano <strong>di</strong> compiti molto specifici.<br />
L’ultimo strato, non meno importante, svolge la funzione <strong>di</strong> storing dei dati: database, file e<br />
archivi.<br />
Nella seguente figura è mostrata questo tipo <strong>di</strong> architettura:<br />
94
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Figura 49 Architettura a tre livelli<br />
Le applicazioni possono essere <strong>di</strong>stribuite anche su più layer (applicazioni Multi-Tier). La<br />
strutturazione a più livelli, vincente per funzionalità, scalabilità, e un alto livello <strong>di</strong><br />
<strong>di</strong>saccoppiamento, tipico <strong>della</strong> più recente visione SOA (Service Oriented Architecture),<br />
permette anche <strong>una</strong> <strong>gestione</strong> più semplice dell’intero ciclo <strong>di</strong> vita dell’<strong>applicazione</strong> oltre a poter<br />
evolvere le versioni <strong>di</strong> ogni singolo layer separatamente, eventualmente gestite da team<br />
<strong>di</strong>fferenti. Queste stesse motivazioni sono degli ottimi punti <strong>di</strong> partenza per costruire<br />
un’architettura sicura.<br />
5.2 L’SDL<br />
La protezione è un requisito essenziale per i produttori <strong>di</strong> software, imposto dal mercato,<br />
dall’esigenza <strong>di</strong> proteggere infrastrutture d’importanza critica e dalla necessità <strong>di</strong> creare e<br />
95
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
preservare <strong>una</strong> fiducia <strong>di</strong>ffusa nei sistemi informatici. Una sfida importante è riuscire a creare<br />
applicativi più sicuri che richiedano meno patch <strong>di</strong> aggiornamento e attività <strong>di</strong> <strong>gestione</strong> <strong>della</strong><br />
protezione meno onerose.<br />
Per l’industria del software, la possibilità <strong>di</strong> sod<strong>di</strong>sfare la richiesta attuale <strong>di</strong> maggiore<br />
<strong>sicurezza</strong> è legata all’adozione <strong>di</strong> processi ripetibili, in grado <strong>di</strong> garantire un miglioramento<br />
misurabile <strong>della</strong> protezione, riducendo al minimo il numero <strong>di</strong> vulnerabilità ancora esistenti nel<br />
progetto, nella co<strong>di</strong>fica e nella documentazione, cercando <strong>di</strong> rilevare ed eliminare tali<br />
vulnerabilità prima possibile durante il ciclo <strong>di</strong> vita dello sviluppo. La necessità <strong>di</strong> adottare un<br />
processo <strong>di</strong> questo tipo riguarda in particolare i prodotti software aziendali e <strong>di</strong> consumo<br />
presumibilmente destinati all’elaborazione <strong>di</strong> input ricevuti da Internet, al controllo <strong>di</strong> sistemi<br />
critici esposti agli attacchi o all’elaborazione <strong>di</strong> dati personali; è in questo ambito che si colloca<br />
anche Talete.<br />
Vi sono tre aspetti alla base <strong>della</strong> creazione <strong>di</strong> software più sicuro: ripetibilità del processo,<br />
formazione dei tecnici, criteri <strong>di</strong> misurazione e atten<strong>di</strong>bilità. Una metodologia che può essere<br />
d’aiuto in questo ambito è l’SDL, che comporta la mo<strong>di</strong>fica dei processi <strong>di</strong> sviluppo <strong>di</strong> prodotti<br />
software adottati da un’organizzazione me<strong>di</strong>ante l’integrazione <strong>di</strong> misure che assicurino <strong>una</strong><br />
migliore protezione del software. Microsoft ha creato l’SDL (Security Development Lifecycle),<br />
che è un “metodo <strong>di</strong> sviluppo” non complicato ma sicuramente molto elaborato; esso<br />
comprende un insieme <strong>di</strong> processi aventi lo scopo <strong>di</strong> <strong>di</strong>minuire le vulnerabilità <strong>di</strong><br />
un’architettura software. Le strategie pratiche per raggiungere lo scopo sono:<br />
• lo sviluppo <strong>di</strong> un modello delle minacce (threat modeling)<br />
• l’uso <strong>di</strong> strumenti <strong>di</strong> <strong>analisi</strong> statica del co<strong>di</strong>ce (cioè <strong>di</strong> lettura del co<strong>di</strong>ce con un tool per<br />
trovare bug)<br />
• l’uso <strong>di</strong> <strong>una</strong> metodologia chiamata “Security Push ” che coinvolge le revisioni tecniche del<br />
co<strong>di</strong>ce e del test <strong>della</strong> nostra <strong>applicazione</strong>.<br />
I benefici raggiunti grazie all’<strong>applicazione</strong> <strong>di</strong> SDL sono:<br />
- minori vulnerabilità<br />
- minor numero <strong>di</strong> patch abbattimento dei costi<br />
96
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Fondamentale in questa metodologia è la presenza <strong>di</strong> un “security advisor” (interno o<br />
consulente, se esterno è meglio) che garantisce <strong>una</strong> visione oggettiva (tipo un consulente <strong>della</strong><br />
qualità per le ISO 9000) e globale su queste problematiche.<br />
L’SDL si fonda su 3 aspetti:<br />
- Secure By Design: architettura progettazione e implementazione devono essere pensati per<br />
essere sicuri; include l’<strong>analisi</strong> delle minacce e l’identificazione <strong>di</strong> potenziali vulnerabilità<br />
- Secure By Default: i componenti devono offrire la minore superficie d’attacco e gli account<br />
degli utenti devono poter eseguire l’<strong>applicazione</strong> con privilegi minimi<br />
- Secure in Deployment: bisogna assicurarsi che il sistema sia <strong>di</strong>fen<strong>di</strong>bile dopo l’installazione.<br />
Se un prodotto non è facile da amministrare, sarà ancora più <strong>di</strong>fficile da proteggere contro le<br />
varie minacce che minano la sua <strong>sicurezza</strong>; inoltre si devono formare gli utenti affinché usino il<br />
sistema in <strong>una</strong> maniera sicura.<br />
Figura 50 I tre aspetti dell’SDL<br />
97
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Nella figura seguente possiamo vedere la cronologia <strong>di</strong> sviluppo protetto dei prodotti:<br />
Figura 51 Cronologia dell’SDL<br />
1 Dalla fase <strong>di</strong> design in poi, il threat modeling (presentato successivamente) è uno<br />
strumento prezioso per identificare i <strong>di</strong>fetti legati alla <strong>sicurezza</strong>.<br />
2 Durante lo sviluppo, gli sviluppatori dovrebbero essere formati per riconoscere i<br />
problemi comuni legati alla <strong>sicurezza</strong> e come programmare per evitarli; ci dovrebbe<br />
essere un’attenzione particolare sulla <strong>sicurezza</strong> durante le revisioni del co<strong>di</strong>ce.<br />
3 I piani <strong>di</strong> test devono considerare il testing <strong>della</strong> <strong>sicurezza</strong> come un elemento<br />
fondamentale. I tester dovrebbero fare in modo <strong>di</strong> creare attacchi verso il software per<br />
rilevare eventuali vulnerabilità.<br />
4 Dopo la ven<strong>di</strong>ta del prodotto, ci deve essere un appropriato piano <strong>di</strong> risposta per le<br />
nuove vulnerabilità che possono essere scoperte, con la creazione <strong>di</strong> patch per<br />
eliminarle.<br />
98
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
SDL fornisce numerosissime in<strong>di</strong>cazioni per ogni ruolo del team <strong>di</strong> sviluppo. Per esempio<br />
viene preferito l’uso <strong>di</strong> linguaggi strong-typed, tool <strong>di</strong> <strong>analisi</strong> statica del co<strong>di</strong>ce come Prefix,<br />
PreFast e strumenti che eseguano test fornendo input non valido all’<strong>applicazione</strong> (fuzzing).<br />
L’insieme delle attività <strong>di</strong> <strong>sicurezza</strong> che sono state stabilite per l’<strong>applicazione</strong> culminano prima<br />
nel “security push”, il primo momento in cui l’<strong>applicazione</strong> è sufficientemente matura per<br />
essere testata dal punto <strong>di</strong> vista <strong>della</strong> <strong>sicurezza</strong>, e successivamente nella “Final Security<br />
Review”, momento nel quale si tirano le somme sui risultati che sono stati ottenuti<br />
sottoponendo l’<strong>applicazione</strong> a specifici test <strong>di</strong> penetrazione e dove si è ancora in tempo per<br />
reagire rapidamente eseguendo le mo<strong>di</strong>fiche necessarie.<br />
A prescindere dall’applicare o meno in modo completo quanto viene in<strong>di</strong>cato in SDL, i concetti<br />
<strong>di</strong> base già esposti rimangono un punto <strong>di</strong> partenza fondamentale su cui costruire il modello<br />
specifico dell’<strong>applicazione</strong> che si vuole progettare in <strong>sicurezza</strong>.<br />
5.3 Il threat modeling<br />
Un elemento fondamentale per creare un’architettura sicura è il threat modeling (mo<strong>della</strong>zione<br />
delle minacce), che permette <strong>di</strong> illustrare quali sono i possibili rischi a cui un’<strong>applicazione</strong> va<br />
incontro; esso è un approccio pragmatico all’<strong>analisi</strong> delle minacce in <strong>una</strong> generica architettura<br />
software, in quanto ogni sistema che espone un ingresso è soggetto ad attacchi.<br />
In pratica, il modello delle minacce è quel processo che serve a:<br />
1 trovare i punti d’ingresso del software<br />
2 capire come possano essere sfruttati<br />
3 valutare i possibili rime<strong>di</strong><br />
99
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
4 adottare il rime<strong>di</strong>o che abbia un coefficiente <strong>di</strong> rischio accettabile (non ci sarà mai la<br />
<strong>sicurezza</strong> al 100%;e i costi per mettere in <strong>sicurezza</strong> un componente potrebbero non<br />
essere sostenibili, per questo è necessario un compromesso tra <strong>sicurezza</strong> e costo).<br />
Figura 52 Elementi del “threat modeling”<br />
Il threat modeling è un processo composto da 6 fasi:<br />
1. Identificazione dell’Asset, cioè la risorsa a cui l’hacker vuole arrivare; in questa fase si<br />
crea un elenco <strong>di</strong> risorse da proteggere, tra cui dati riservati (come database <strong>di</strong> clienti),<br />
pagine web e altri componenti che, se danneggiati, impe<strong>di</strong>rebbero il corretto<br />
funzionamento dell’<strong>applicazione</strong>.<br />
2. Creazione <strong>di</strong> <strong>una</strong> panoramica dell’architettura; si cerca <strong>di</strong> identificare cosa<br />
l’<strong>applicazione</strong> deve fare creando un <strong>di</strong>agramma <strong>della</strong> sua architettura e identificando le<br />
tecnologie da usare.<br />
Figura 53 Threat Modeling: panoramica dell’architettura<br />
100
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
3. Scomposizione dell’architettura e creazione <strong>di</strong> un profilo <strong>di</strong> protezione basato sulle<br />
tra<strong>di</strong>zionali aree <strong>di</strong> vulnerabilità, con 5 sottofasi:<br />
Figura 54 Threat modeling: livelli dell’architettura<br />
4. Identificazione del Threat, cioè <strong>della</strong> minaccia (che può essere alla rete, all’host o<br />
all’<strong>applicazione</strong>) tramite la quale si vuole arrivare alla risorsa; è in questa fase che si ha<br />
la creazione del team. Per l’identificazione delle minacce è stato usato un tool generico,<br />
il “Threat Analisys and Modeling Tool”.<br />
5. Documentazione delle minacce, con <strong>una</strong> struttura del genere, lasciando vuoto per il<br />
momento il campo “Rischio”:<br />
Descrizione <strong>della</strong> minaccia Inserimento <strong>di</strong> coman<strong>di</strong> SQL<br />
Obiettivo <strong>della</strong> minaccia Componente <strong>di</strong> accesso ai dati<br />
Rischio<br />
Tecniche <strong>di</strong> attacco L’hacker aggiunge coman<strong>di</strong> SQL al nome<br />
utente utilizzato per creare <strong>una</strong> query SQL<br />
101
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Contromisure Utilizzare un’espressione regolare per<br />
convalidare il nome utente e <strong>una</strong> stored<br />
procedure con parametri per accedere al<br />
database<br />
6. Classificazione delle minacce, per determinare quali sono le più pericolose; si usa la<br />
seguente formula: Rischio = probabilità * potenziale del danno<br />
Un modello per classificare le minacce potrebbe essere il modello DREAD:<br />
- Discoverability (quanto è semplice scoprire la vulnerabilità? )<br />
- Reproducibility (quanto è facile replicare l’attacco? )<br />
- Exploitability (quanto è semplice compiere l’attacco? )<br />
- Affected users (quanti utenti sono colpiti dall’attacco? )<br />
- Damage potential (quanto danno provoca il successo <strong>di</strong> un attacco? )<br />
oppure quello STRIDE:<br />
- Spoofing (<strong>di</strong> IP, credenziali..)<br />
- Tampering (alterazione dei dati, man in the middle)<br />
- Repu<strong>di</strong>ation (esecuzione <strong>di</strong> azioni senza poter provare la loro paternità)<br />
- Information Disclosure (<strong>di</strong>vulgazione delle informazioni)<br />
- Denial of Service<br />
- Elevation of Privilege (innalzamento dei privilegi)<br />
Entrambi questi modelli, possono essere ricondotti a tre categorie, che sono quelle prese in<br />
considerazione dal tool usato: Confidentiality, Integrity e Availability.<br />
La teoria del Threat Modeling ha presentato, nel corso degli anni, due <strong>di</strong>fferenti prospettive <strong>di</strong><br />
mo<strong>della</strong>zione. La prima in termini cronologici è data dal modello <strong>di</strong> “Swiderski / Snyder”, le<br />
cui caratteristiche fondamentali sono:<br />
102
1 porsi dalla prospettiva dell’attaccante<br />
2 identificare il threat al target dell’hacker<br />
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
3 assumere che l’attacco c’è in quanto esiste <strong>una</strong> risorsa interessante (non considera il<br />
‘vandalo’, che può essere ad esempio un virus che si <strong>di</strong>ffonde all’interno <strong>di</strong> <strong>una</strong> lan).<br />
Il nuovo modello è il TAM, il quale:<br />
1. si pone dal punto <strong>di</strong> vista <strong>di</strong> chi <strong>di</strong>fende e quin<strong>di</strong> ha il vantaggio <strong>di</strong> conoscere i dettagli del<br />
sistema; in questo modo è possibile apprendere meglio le modalità con cui un hacker può<br />
cercare <strong>di</strong> prendere il controllo del sistema<br />
2. <strong>di</strong>fende ciò che vale la pena <strong>di</strong>fendere (quin<strong>di</strong> è meno complesso)<br />
3. espande il lavoro <strong>di</strong> chi mo<strong>della</strong> (che deve decidere cosa è giusto fare o non lo è in certi<br />
casi) e quin<strong>di</strong> è pesante nello sviluppo delle calls /use-cases<br />
Il modello usato in quest’esperienza è quest’ultimo, attraverso il tool creato da Microsoft.<br />
5.4 “Microsoft Threat Analysis & Modeling Tool”<br />
Non può esistere un tool che miracolosamente risolve il problema <strong>della</strong> <strong>sicurezza</strong> <strong>di</strong> <strong>una</strong><br />
<strong>applicazione</strong>. Fino ad ora sono stati descritti i punti essenziali per realizzare un’architettura che<br />
semplifichi la creazione <strong>di</strong> un’<strong>applicazione</strong> più sicura. In questo processo sono emersi dati<br />
tangibili che permettono <strong>di</strong> identificare con più facilità i punti <strong>di</strong> maggiore rischio. L’utilità <strong>di</strong><br />
uno strumento sta nel raccogliere le informazioni sulla struttura dell’<strong>applicazione</strong>, i punti<br />
d’ingresso, i ruoli, i componenti e mettere in evidenza le possibili vulnerabilità così che<br />
architetto e sviluppatori possano in<strong>di</strong>viduare subito i punti <strong>di</strong> attenzione. E questo è quanto è<br />
103
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
stato realizzato da un gruppo <strong>di</strong> sviluppo chiamato ”Ace Team” che in Microsoft si occupa <strong>di</strong><br />
problemi riguardanti la <strong>sicurezza</strong>, le performance e la privacy.<br />
Il “Microsoft Threat Analysis & Modeling Tool” è volutamente slegato dal sistema<br />
operativo, dall’uso <strong>di</strong> specifici linguaggi, dall’utilizzo <strong>di</strong> co<strong>di</strong>ce nativo, dall’<strong>applicazione</strong> <strong>di</strong><br />
tutte le in<strong>di</strong>cazioni <strong>di</strong> SDL e dall’uso <strong>di</strong> Visual Stu<strong>di</strong>o. Come <strong>di</strong>ce il nome “threat modeling”,<br />
quest’<strong>applicazione</strong> grafica permette <strong>di</strong> mo<strong>della</strong>re le minacce che possono minare la <strong>sicurezza</strong><br />
<strong>della</strong> nostra <strong>applicazione</strong>, raccogliendo i dati che sono emersi durante la definizione<br />
dell’architettura ed evoluti in fase <strong>di</strong> progettazione e sviluppo.<br />
Nella fase iniziale il wizard <strong>di</strong> questo tool raccoglie i dati attraverso <strong>una</strong> serie <strong>di</strong> passi:<br />
Figura 55 Threat Model Wizard<br />
1. I ruoli applicativi: vengono immessi i nomi dei ruoli che ricoprono gli utenti che usano<br />
l’<strong>applicazione</strong>; nel nostro caso abbiamo l’amministratore, l’utente autorizzato e l’utente<br />
non autorizzato.<br />
2. Le risorse (dati): si inseriscono tutte le tipologie <strong>di</strong> dati utilizzati dall’<strong>applicazione</strong>, siano<br />
essi dati <strong>di</strong> un DB, file, ecc; nel nostro caso abbiamo customers, orders e products.<br />
104
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
3. Matrice <strong>di</strong> Accesso: per ciascun ruolo si definisce quale tipo <strong>di</strong> accesso è possibile<br />
eseguire sulle risorse. Per tipo <strong>di</strong> accesso si intendono le classiche operazioni <strong>di</strong><br />
creazione, lettura, mo<strong>di</strong>fica, cancellazione (CRUD).<br />
4. Use Cases: questo passo permette <strong>di</strong> stabilire quale sia il tipico uso fatto dagli utenti per<br />
accedere ai dati.<br />
5. Componenti <strong>di</strong> sistema: vengono identificati i macroblocchi del sistema, che in Talete<br />
sono il database, il web service, la web application e l’Asp.NET application<br />
6. Rilevanze: sono dei punti <strong>di</strong> attenzione particolari come l’uso <strong>di</strong> co<strong>di</strong>ce nativo piuttosto<br />
che <strong>di</strong> generazione <strong>di</strong> co<strong>di</strong>ce o ancora la costruzione <strong>di</strong> query SQL o LDAP.<br />
7. Le chiamate: si identificano tutte le azioni che un utente, per esempio grazie<br />
all’interfaccia utente, può eseguire con la nostra <strong>applicazione</strong>.<br />
8. Le minacce: si stabiliscono quali siano le potenziali minacce che possono occorrere.<br />
L’immissione dei dati non è certamente semplice ed è un lavoro molto lungo, che, però è<br />
ripagato da <strong>una</strong> serie <strong>di</strong> report con tanto <strong>di</strong> grafici con gli “use cases” costruiti in modo<br />
automatico grazie al motore <strong>di</strong> Visio.<br />
Solo immettendo pochi dati, il tool ha automaticamente generato minacce <strong>di</strong> tipo<br />
confidentiality, integrity e availability.<br />
• Confidentiality:<br />
Unauthorized <strong>di</strong>sclosure of using by <br />
Questa è <strong>una</strong> minaccia <strong>di</strong> tipo “confidentiality”, che rileva la possibilità <strong>di</strong> <strong>una</strong> <strong>di</strong>ffusione non<br />
autorizzata <strong>di</strong> notizie durante <strong>una</strong> CreateCustomer, cioè qualcuno potrebbe mettersi sulla linea<br />
del TCP/IP e intercettare la creazione <strong>di</strong> un nuovo customer mentre sta avvenendo la<br />
comunicazione col web service; ovviamente saremo noi a decidere se la comunicazione è<br />
sicura o meno, e quin<strong>di</strong> se il rischio lo accettiamo o meno.<br />
• Integrity:<br />
Illegal execution of using by <br />
105
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Qualcuno potrebbe invalidare l’esecuzione <strong>della</strong> CreateCustomer da parte dell’utente<br />
autorizzato che “usa” il web service, magari iniettando delle informazioni false.<br />
• Availability:<br />
Ineffective execution of using by <br />
Qualcuno potrebbe aver creato un virus per eseguire dei DoS sulla CreateCustomer.<br />
Successivamente nel tool è possibile impostare varie proprietà per ogni componente. Ad<br />
esempio sui dati, oltre alla matrice <strong>di</strong> accesso, è possibile classificare il tipo <strong>di</strong> impatto che quel<br />
dato ha; per i customers è stato scelto un High Business Impact PII. PII in<strong>di</strong>ca che sono dati<br />
personali, mentre l’impatto elevato è dovuto al fatto che in Italia c’è il problema <strong>della</strong> privacy,<br />
che deve essere rispettata. Per i products si ha un impatto me<strong>di</strong>o, perché il catalogo dei prodotti<br />
lo si conosce e quin<strong>di</strong> non ci sono molti segreti da custo<strong>di</strong>re e proteggere. Per gli or<strong>di</strong>ni è stato<br />
impostato un impatto molto alto, ma non dati personali per cui la proprietà è stata impostata a<br />
High Business Impact, e cosi via. Inoltre per ogni minaccia si possono specificare il rischio, la<br />
probabilità che essa abbia successo recando danni al sistema, e la risposta, cioè se il rischio lo<br />
si può accettare oppure no.<br />
Nel report creato, è possibile vedere la matrice degli accessi, la generazione dei casi d’uso e le<br />
contromisure per le vulnerabilità, per ogni caso d’uso:<br />
106
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Figura 56 Report del TAM: la matrice <strong>di</strong> accesso<br />
Figura 57 Report del TAM: gli use case generati automaticamente<br />
107
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Figura 58 Report del TAM: le contromisure<br />
Un’altra utilità dei report <strong>di</strong> questo tool, è la possibilità <strong>di</strong> mostrare delle best-practices che<br />
suggeriscono le contromisure da adottare: nell’esempio in figura è stato mostrato come si usano<br />
i parameters per evitare SQL injection oppure come avere un session ID random e sicuro.<br />
108
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
Figura 59 Report del TAM: le best practices per evitare SQL Injection<br />
5.5 Considerazioni sul threat modeling<br />
Chi conosce il processo <strong>di</strong> certificazione <strong>di</strong> qualità del software avrà notato quanto il processo<br />
programmatico <strong>di</strong> pianificazione <strong>della</strong> <strong>sicurezza</strong> vada nella stessa <strong>di</strong>rezione <strong>di</strong> normative come<br />
la ISO9001:2000. Lo stesso “Threat Analysis and Modeling Tool” va in questa <strong>di</strong>rezione e i<br />
109
CAPITOLO V - La <strong>sicurezza</strong> nell’architettura <strong>di</strong> un’<strong>applicazione</strong><br />
reports che vengono creati dal tool sono in perfetta sintonia con quelle normative, non solo per<br />
la <strong>gestione</strong> <strong>della</strong> <strong>sicurezza</strong> ma per il progetto nella sua totalità.<br />
Il vantaggio <strong>di</strong> un approccio programmatico è quello <strong>di</strong> poter definire dei parametri <strong>di</strong><br />
valutazione <strong>della</strong> <strong>sicurezza</strong> del software anche quando il suo processo <strong>di</strong> creazione sia<br />
identificato artigianale e a maggior ragione quando sia industriale.<br />
In fondo, la progettazione è solamente <strong>una</strong> parte del processo <strong>di</strong> creazione <strong>di</strong> un software<br />
protetto. Supporto esecutivo, implementazione, test, creazione e consegna, nonché fornitura e<br />
manutenzione giocano tutti un ruolo cruciale nella protezione finale del sistema. E ogni ruolo<br />
deve essere giocato bene.<br />
110
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
111
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Al contrario del mondo reale, in quello virtuale la <strong>di</strong>stanza non ha alc<strong>una</strong> importanza e la<br />
<strong>di</strong>ffusione <strong>di</strong> Internet ha creato <strong>una</strong> sorta <strong>di</strong> enorme megalopoli che ci permette <strong>di</strong> vivere allo<br />
stesso tempo in perfetta solitu<strong>di</strong>ne o in mezzo a <strong>una</strong> moltitu<strong>di</strong>ne. Parlando <strong>di</strong> <strong>sicurezza</strong> quin<strong>di</strong>,<br />
nel mondo reale la <strong>di</strong>stanza è un parametro fondamentale visto che la minaccia deve essere<br />
fisicamente vicina. Lo stesso ovviamente non vale per il mondo virtuale dove chiunque è<br />
soggetto a minacce che possono arrivare da qualsiasi parte <strong>della</strong> rete e perciò molto più<br />
frequentemente. Nei paragrafi successivi sono descritte le varie tipologie <strong>di</strong> attacco che <strong>una</strong><br />
buona <strong>applicazione</strong> web dovrebbe respingere o limitare. Sul totale delle vulnerabilità segnalate,<br />
<strong>una</strong> grossa percentuale è da attribuire a software sviluppati con tecnologie web. In figura<br />
sono rappresentati la maggior parte degli attacchi considerando i 4 livelli relativi ad <strong>una</strong> web<br />
applications:<br />
Figura 60 Possibili attacchi sui 4 livelli <strong>di</strong> <strong>una</strong> web application<br />
Dall’esigenza <strong>di</strong> contrastare le cause dei software insicuri su internet nasce OWASP (Open<br />
Web Application Security Project): un progetto open source con l’obiettivo primario <strong>di</strong> trovare<br />
e combattere le falle che affliggono le applicazioni web.<br />
112
6.1 Progetto OWASP<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Il progetto Open Web Application Security Project (http://www.owasp.org) è stato creato per<br />
aiutare le aziende e le organizzazioni a capire e migliorare la <strong>sicurezza</strong> delle loro applicazioni e<br />
dei servizi web e grazie alla Top Ten è stato possibile focalizzare l’attenzione verso le<br />
vulnerabilità più critiche.<br />
Figura 61 Logo OWASP<br />
La <strong>sicurezza</strong> delle applicazioni web è <strong>di</strong>ventata un argomento fondamentale dal momento che,<br />
moltissime aziende cercano <strong>di</strong> rendere <strong>di</strong>sponibili in rete un numero sempre crescente <strong>di</strong><br />
contenuti e servizi (basti pensare a Talete che è un servizio <strong>di</strong> consulenza on-line). Nello stesso<br />
tempo, gli hacker hanno rivolto l’attenzione verso gli errori <strong>di</strong> sviluppo comunemente inseriti<br />
dagli sviluppatori.<br />
Quando un’organizzazione pubblica mette a <strong>di</strong>sposizione un servizio web è come se invitasse<br />
tutto il mondo ad inviare richieste http. Gli attacchi contenuti all’interno <strong>di</strong> queste attraversano<br />
firewalls, filtri, piattaforme <strong>di</strong> <strong>sicurezza</strong> e sistemi IDS senza lasciare traccia in quanto si<br />
trovano all’interno <strong>di</strong> richieste http legittime. Con l’aumentare del numero <strong>di</strong> applicazioni web<br />
all’interno del sistema aumenta anche il perimetro <strong>di</strong> esposizione.<br />
Le problematiche riportate in questa lista non sono nuove. La maggior parte <strong>di</strong> esse è ben nota<br />
da decenni. Purtroppo, per <strong>una</strong> serie <strong>di</strong> motivazioni, la maggior parte degli sviluppatori<br />
continua ad inserire sempre gli stessi errori all’interno dei programmi, mettendo a rischio non<br />
solo la <strong>sicurezza</strong> dei propri clienti, ma anche la <strong>sicurezza</strong> <strong>di</strong> tutta Internet. Non esiste <strong>una</strong><br />
panacea per risolvere tutti questi problemi; oggi l’<strong>analisi</strong> e le tecnologie <strong>di</strong> protezione stanno<br />
migliorando, ma solitamente si riesce al massimo ad affrontare solo un set minimo <strong>di</strong><br />
problematiche.<br />
Il documento analizzato è la “OWASP Top Ten 2.0”, che comprende <strong>una</strong> lista <strong>di</strong><br />
vulnerabilità che richiedono un intervento imme<strong>di</strong>ato. Eventuale co<strong>di</strong>ce esistente dovrebbe<br />
essere imme<strong>di</strong>atamente controllato in quanto questi errori vengono sfruttati puntualmente dagli<br />
hacker. I progetti in fase <strong>di</strong> sviluppo dovrebbero includere nei documenti <strong>di</strong> requisiti, <strong>di</strong><br />
113
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
progettazione e <strong>di</strong> test dei riferimenti a queste criticità per verificarne l’assenza all’interno del<br />
software. I project manager dovrebbero includere all’interno <strong>della</strong> pianificazione preventivata<br />
un intervallo <strong>di</strong> tempo e del budget per le attività <strong>di</strong> <strong>sicurezza</strong> applicativa. Dovrebbero tener<br />
conto anche del training per gli sviluppatori, <strong>della</strong> creazione <strong>di</strong> policy <strong>di</strong> <strong>sicurezza</strong> applicativa,<br />
<strong>di</strong> prevedere dei meccanismi <strong>di</strong> <strong>sicurezza</strong>, dei penetration test e delle fasi <strong>di</strong> revisione del<br />
co<strong>di</strong>ce.<br />
Bisogna incoraggiare le aziende che sviluppano software ad adottare la OWASP Top Ten<br />
come standard base <strong>di</strong> <strong>sicurezza</strong> e ad impegnarsi nel produrre applicazioni Web esenti da tali<br />
vulnerabilità.<br />
In questa tesi è stata fatta <strong>una</strong> panoramica delle <strong>di</strong>eci vulnerabilità più critiche, seguita da<br />
un’attenta <strong>analisi</strong> <strong>della</strong> nostra <strong>applicazione</strong> alla ricerca <strong>di</strong> bug o falle da correggere mettendo in<br />
evidenza che la maggior parte delle precauzioni, come l’esempio dei parameters nelle query,<br />
sono state già applicate alla scrittura del co<strong>di</strong>ce <strong>di</strong> Talete.<br />
6.2 Unvalidated input<br />
Rientrano sotto la categoria “unvalidated input” tutti i problemi legati alla mancanza <strong>di</strong><br />
validazione dell’input o alla validazione parziale. L’interazione dell’utente con l’<strong>applicazione</strong><br />
avviene attraverso uno scambio <strong>di</strong> messaggi, secondo il protocollo HTTP, che può essere<br />
semplicemente descritto attraverso lo schema sottostante:<br />
114
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Figura 62 Protocollo HTTP<br />
Un utente, e quin<strong>di</strong> anche un potenziale aggressore, può mo<strong>di</strong>ficare in parte o completamente la<br />
richiesta inoltrata verso il Server Web, plasmando a piacere il contenuto <strong>di</strong> tali parametri. La<br />
possibilità <strong>di</strong> e<strong>di</strong>tare le variabili nell’header HTTP, il valore dei campi ritornati da <strong>una</strong> form, e<br />
così via, apre l’enorme problematica legata alla validazione dei parametri che l’<strong>applicazione</strong>,<br />
sul server, potrà accettare. In questo contesto è importante ricordare che non ci si deve mai<br />
affidare a soluzioni <strong>di</strong> verifica dei parametri con controlli "lato client" (per esempio tramite<br />
JavaScript) in quanto il co<strong>di</strong>ce stesso è manipolabile dall’aggressore che potrebbe bypassare il<br />
controllo, semplicemente salvando in locale la pagina e mo<strong>di</strong>ficando il sorgente.<br />
I parametri da controllare in fase <strong>di</strong> validazione sono:<br />
- Il tipo <strong>di</strong> dato (string, integer, real, ecc…)<br />
- Il set <strong>di</strong> caratteri consentito<br />
- La lunghezza minima e massima<br />
- Controllare se è permesso il tipo NULL<br />
- Controllare se il parametro è richiesto o meno<br />
- Controllare se sono permessi i duplicati<br />
- Intervallo numerico<br />
- Specificare i valori ammessi (numerazione)<br />
- Specificare i pattern (espressioni regolari)<br />
Il modo migliore per proteggersi da questo tipo <strong>di</strong> attacchi è quin<strong>di</strong> quello <strong>di</strong> assicurarsi che i<br />
parametri in input siano resi sicuri prima che siano effettivamente utilizzati all’interno<br />
dell’<strong>applicazione</strong>. Le migliori soluzioni si basano sulle cosiddette whitelist ovvero delle liste in<br />
115
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
cui specificare tutto quello che l’<strong>applicazione</strong> può accettare; questa tecnica <strong>di</strong>fferisce dalla<br />
duale blacklist, in cui invece viene specificato tutto quello che non deve essere accettato. Per<br />
valori "non ammissibili" inten<strong>di</strong>amo degli input che possono generare errori anche a livello<br />
funzionale oltre che strettamente legati alla <strong>sicurezza</strong>.<br />
La prima soluzione è sicuramente preferibile in quanto spesso non è possibile definire in<br />
maniera precisa cosa scartare; a questo si aggiunge la naturale evoluzione del software che<br />
subisce perio<strong>di</strong>camente mo<strong>di</strong>fiche e reingegnerizzazioni. Nel caso in cui il controllo sui valori<br />
in ingresso non sia ben implementato, si correrà il rischio <strong>di</strong> esporre l’<strong>applicazione</strong> ad <strong>una</strong> serie<br />
<strong>di</strong> attacchi noti che vanno dal classico SQL injection, al cross site scripting, buffer overflow,<br />
format string, e così via.<br />
6.2.1 SQL Injection<br />
SQL Injection consiste in un attacco informatico che sfrutta la cattiva abitu<strong>di</strong>ne <strong>di</strong> concatenare<br />
le stringhe destinate ad un database server. La concatenazione delle stringhe SQL viene<br />
solitamente associata a problemi <strong>di</strong> <strong>sicurezza</strong>, ma affligge anche performance e provoca subdoli<br />
errori <strong>di</strong> runtime in relazione ai separatori numerici e delle date.<br />
Pren<strong>di</strong>amo ad esempio la seguente stringa che verrà eseguita come query su un database:<br />
"select * from users where name like ‘ " + TextBox1.Text + "%’ "<br />
Un utente del web che dovesse cercare "Angelo" causerebbe l’esecuzione <strong>della</strong> query:<br />
"select * from users where name like ‘Angelo%’ "<br />
Lo sviluppatore web non ha purtroppo validato il contenuto <strong>della</strong> TextBox e un hacker<br />
potrebbe sfruttare questa vulnerabilità semplicemente inserendo nella casella <strong>di</strong> testo la stringa:<br />
" ‘ or ‘a’ like ‘a "<br />
Lo statement SQL risultante dalla concatenazione sarebbe il seguente:<br />
116
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
"select * from users where name like ‘‘ or ‘a’ like ‘a%’ "<br />
In sostanza la clausola “where” è sempre vera causando quin<strong>di</strong> la restituzione del contenuto<br />
completo <strong>della</strong> tabella users.<br />
Questo esempio non è che la punta dell’iceberg ed è solo il primo assaggio. Il peggio deve<br />
ancora arrivare, ma questo può far riflettere gli sviluppatori poco accorti in quanto, essere<br />
vulnerabili a questo tipo <strong>di</strong> attacco, è palesemente contrario alla normativa vigente in materia <strong>di</strong><br />
privacy con tutto ciò che ne consegue per legge.<br />
Un altro punto interessante è che questo tipo <strong>di</strong> attacco non è <strong>di</strong>rettamente <strong>di</strong>pendente dalla<br />
tecnologia utilizzata o per <strong>di</strong>rlo in altri termini è un attacco cross-platform, funziona per<br />
esempio su SQL Server, MySQL, Access, Oracle o FireBird, solo per citarne alcuni.<br />
Naturalmente l’hacker in alcuni casi dovrà iniettare co<strong>di</strong>ce <strong>di</strong>fferente in base al database usato,<br />
ma nessuno è immune a priori. La vulnerabilità è figlia <strong>della</strong> stessa natura del linguaggio SQL<br />
che è espresso per mezzo <strong>di</strong> stringhe <strong>di</strong> testo; le soluzioni definitive esistono, ma purtroppo<br />
sono snobbate da molti sviluppatori che sottovalutano la portata <strong>di</strong> questa vulnerabilità.<br />
Fino a che punto <strong>una</strong> SQL Injection è pericolosa? Niente <strong>di</strong> meglio che un altro esempio per<br />
rispondere a questa domanda, partendo dalla stessa query iniziale:<br />
"select * from users where name like ‘ " + TextBox1.Text + "%’ "<br />
l’hacker potrebbe scrivere nella TextBox (cioè iniettare) questo co<strong>di</strong>ce:<br />
che risulterebbe in questa stringa:<br />
"‘ ; select * from sys.tables -- "<br />
"select * from users where name like ‘‘ ;<br />
select * from sys.tables -- ‘ "<br />
Questo statement ha tre punti fondamentali. Il primo è il ";" che permette la <strong>di</strong>chiarazione <strong>di</strong><br />
due <strong>di</strong>stinte query all’interno <strong>di</strong> <strong>una</strong> stessa stringa; il secondo è l’uso <strong>di</strong> "--" per commentare<br />
ciò che resta nella stringa. Non tutti i database permettono l’uso <strong>di</strong> ";" e/o <strong>di</strong> "--" ma questo non<br />
è altro che uno degli esempi possibili. Il terzo punto è l’uso <strong>della</strong> view sys.tables <strong>di</strong> SQL2005.<br />
In SQL2000 esiste la tabella sysobjects mentre nel MySQL esiste la tabella<br />
INFORMATION_SCHEMA.TABLES, supportata anche da SQL2005. Ancora <strong>una</strong> volta<br />
queste <strong>di</strong>fferenze non costituiscono alcun ostacolo per l’attuazione dell’injection.<br />
117
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
L’esecuzione <strong>della</strong> query appena vista restituisce l’elenco delle tabelle presenti nel database.<br />
Fatto questo l’hacker passa a sys.columns (o syscolumns) e così via ottenendo la struttura<br />
completa del database. Non contento potrebbe anche andare oltre e con sys.databases ottenere<br />
la lista <strong>di</strong> tutti i database installati su quel server. L’hacker può così copiarsi il contenuto del<br />
database e chi ritiene che ci voglia troppa pazienza certosina per portare a compimento questo<br />
tipo <strong>di</strong> attacco, sappia che esistono tool che, in automatico, eseguono la copia <strong>di</strong> un database<br />
sfruttando semplicemente un web vulnerabile alla SQL Injection.<br />
6.2.2 Quanti danni può fare?<br />
Dopo il furto, arrivano i danni e per esempio l’hacker può cancellare un’intera tabella<br />
iniettando:<br />
"‘; drop orders --"<br />
Non bastasse, i danni più grossi arrivano iniettando query come queste:<br />
"‘; exec master..xp_cmdshell ‘notepad.exe’--"<br />
La extended stored procedure xp_cmdshell consente l’esecuzione <strong>di</strong> un arbitrario comando o<br />
eseguibile analogo a quanto si potrebbe eseguire da command prompt del server. Avendo i<br />
permessi <strong>di</strong> eseguire <strong>una</strong> query <strong>di</strong> questo genere, il server è completamente compromesso.<br />
Eseguendola <strong>una</strong> serie <strong>di</strong> volte si possono progressivamente portare su quel server (ad esempio<br />
via tftp) delle utility per fare le cose più <strong>di</strong>sparate: controllo remoto del server via socket,<br />
cattura delle password del server, furto dei dati, crash del server, sniffing <strong>della</strong> rete interna, e<br />
quanto altro ci si possa immaginare, il tutto solo con SQL Injection anche in totale assenza <strong>di</strong><br />
bug o <strong>di</strong> vulnerabilità del database o del sistema operativo.<br />
Questo rischio ha portato Microsoft ha decidere <strong>di</strong> <strong>di</strong>sabilitare per default la xp_cmdshell ma,<br />
ancora <strong>una</strong> volta, questo non è certamente l’unico modo per poter sfruttare SQL Injection e la<br />
118
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
sua <strong>di</strong>sabilitazione non è certamente <strong>una</strong> garanzia assoluta. Perché è possibile portare a<br />
compimento un attacco <strong>di</strong> questo genere? Per portare a compimento gli attacchi che abbiamo<br />
visto su SQL2005, oltre ad essere vulnerabili alla SQL Injection, sono stati fatti almeno tre<br />
errori <strong>di</strong> configurazione, ciascuno non meno grave dell’altro. Il primo errore consiste<br />
nell’accedere al database con privilegio amministrativo. Tipicamente per pigrizia si accede con<br />
l’utente "sa" (analogo del root in MySQL) acronimo <strong>di</strong> "system administrator" che ha i<br />
massimi privilegi possibili sul database. L’uso <strong>di</strong> sa fa risparmiare <strong>una</strong> decina <strong>di</strong> minuti, giusto<br />
il tempo <strong>di</strong> creare un nuovo utente ‘normale’ e configurarlo con i minimi privilegi necessari.<br />
Un utente sprovvisto del permesso "control server" non può eseguire xp_cmdshell e questo<br />
ripaga già dei <strong>di</strong>eci minuti spesi per la configurazione. Attenzione che questo non è sufficiente<br />
a garantire la <strong>sicurezza</strong>. Ad esempio chiunque nel ruolo public può effettuare la schedulazione<br />
dei job in SQL Server. Con l’aiuto <strong>di</strong> <strong>una</strong> stored procedure scritta male è possibile schedulare<br />
l’esecuzione <strong>di</strong> un job con il privilegio assegnato al servizio SQL Server Agent.<br />
Il secondo errore è quello <strong>di</strong> permettere l’accesso <strong>di</strong>retto alle tabelle. Una buona pratica è<br />
quella <strong>di</strong> far accedere l’utente appena creato alle sole stored procedure in modo da limitare il<br />
raggio <strong>di</strong> azione dell’hacker. Ancora <strong>una</strong> volta è importante non cadere nel tranello <strong>di</strong><br />
un’equazione "stored procedure = <strong>sicurezza</strong> e performance" che non è sempre vera.<br />
Il terzo errore origina dall’installazione database server, quando abbiamo configurato il servizio<br />
<strong>di</strong> SQL Server. Se il servizio gira sotto le credenziali <strong>di</strong> localsystem o <strong>di</strong> un utente<br />
amministratore del PC, i coman<strong>di</strong> attuati dalla xp_cmdshell saranno anch’essi eseguiti con le<br />
stesse credenziali. Questo è quello che consente all’hacker <strong>di</strong> prendere il controllo completo del<br />
server.<br />
119
6.2.3 Quale linguaggio e quale tecnologia?<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Fino ad ora non abbiamo neppure citato il linguaggio <strong>di</strong> sviluppo o la tecnologia che i web<br />
server (o il windows client) usano per eseguire le query sul database; questo perché sono<br />
ininfluenti. Sia questo un sito asp classico, php, jsp, Asp.NET o cgi, il problema è solo causato<br />
dallo sviluppatore che non valida l’input dell’utente e non dalla tecnologia usata.<br />
Validare bene l’input utente non è <strong>una</strong> cosa da inventare e poi perché rifare <strong>una</strong> cosa che esiste<br />
già ed è collaudata? La soluzione bella e pronta sta nella collection dei parametri del command.<br />
Sia che si parli <strong>di</strong> ado classico che <strong>di</strong> ado.net, entrambi prevedono l’uso dei command e <strong>di</strong> <strong>una</strong><br />
collection <strong>di</strong> parametri, soluzione presa in considerazione nella scrittura del co<strong>di</strong>ce<br />
dell’<strong>applicazione</strong> sviluppata. Di seguito è riportato un pezzo del co<strong>di</strong>ce <strong>della</strong> classe<br />
Concessionario.cs in cui è possibile notare l’uso dei parameters nelle query eseguite su<br />
database MySQL:<br />
120
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Figura 63 Uso dei parameters in Talete<br />
Avendo utilizzato il parametro ?id nel metodo Load() e l’aggiunta del parametro nella<br />
collection dei parameters, abbiamo eliminato i rischi da injection, così come negli altri due<br />
meto<strong>di</strong> <strong>della</strong> figura InsertConcessionario e DeleteConcessionario.<br />
Ogni dbms ha la propria sintassi per la descrizione <strong>di</strong> un parametro. In MySQL, così come in<br />
MS Access, si utilizza il punto interrogativo (“?”) seguito dal nome del parametro, mentre in<br />
SQLServer si utilizza la chiocciola (@). In questo caso risulta importante l’or<strong>di</strong>ne con cui<br />
vengono specificati i parametri <strong>di</strong> selezione.<br />
121
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Questa costituisce la migliore soluzione per fronteggiare la SQL Injection, ma la <strong>sicurezza</strong> non<br />
si costruisce mai su un solo fronte. Oltre a scrivere co<strong>di</strong>ce sicuro è fondamentale aggiungere le<br />
altre contromisure (citate precedentemente) sulla configurazione del database server.<br />
6.2.4 Proteggersi dalla SQL injection<br />
Come si è già accennato, l’unica possibilità <strong>di</strong> protezione è un controllo sui dati ricevuti da<br />
parte del programmatore, durante lo sviluppo del programma. In altre parole, bisogna<br />
assicurarsi che l’input ricevuto rispetti le regole necessarie, e questo può essere fatto in <strong>di</strong>versi<br />
mo<strong>di</strong>:<br />
- controllare il tipo dei dati ricevuti (se ad esempio ci si aspetta un valore numerico,<br />
controllare che l’input sia un valore numerico);<br />
- forzare il tipo dei dati ricevuti (se ad esempio ci si aspetta un valore numerico, si può<br />
forzare l’input affinché <strong>di</strong>venti comunque un valore numerico);<br />
- filtrare i dati ricevuti attraverso le espressioni regolari (regex);<br />
- sostituire i caratteri pericolosi con equivalenti caratteri innocui (ad esempio in entità<br />
html);<br />
Ovviamente, questi meto<strong>di</strong> possono essere applicati anche insieme sullo stesso dato in input. La<br />
scelta varia a seconda delle tipologie <strong>di</strong> questi dati. Occorre, quin<strong>di</strong>, prestare particolare<br />
attenzione a tutte le varianti <strong>di</strong> un input, tenendo conto <strong>di</strong> ogni possibile (oppure improbabile)<br />
ipotesi.<br />
122
6.2.5 I vantaggi nascosti<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Per rendere più “attraente” l’uso dei parameters nei command anche ai più scettici, ve<strong>di</strong>amo<br />
adesso quali altri vantaggi ne derivano.<br />
Il vantaggio più evidente per lo sviluppatore riguarda i rognosi problemi dei separatori dei<br />
decimali, date e ora. Un comando SQL che non fa uso dei parametri deve necessariamente<br />
convertire il DateTime in stringa:<br />
string str = "select * from orders where OrderDate>" + MyDate.ToString();<br />
Il DateTime internamente non ha cognizione dei separatori, tanto meno del nome, dei giorni o<br />
dei mesi. Nel Framework. .NET il DateTime è un numero a 64bit in cui ogni unità rappresenta<br />
cento nanosecon<strong>di</strong> a partire dall’anno zero. In sostanza è un offset da <strong>una</strong> data convenzionale<br />
ed ha <strong>una</strong> granularità molto bassa che ci permette <strong>di</strong> rappresentare con esattezza un istante<br />
temporale.<br />
Il risultato <strong>della</strong> conversione da DateTime a stringa è relativo a dove viene fatta la conversione.<br />
Negli USA la data del 6 Luglio 2005 sarà 7/6/2005, in Italia 06/07/2005 ed in Svizzera<br />
06.07.2005. Questa impostazione deriva dai settaggi internazionali <strong>di</strong> Windows associati al<br />
profilo dell’utente il cui token ha fatto partire il processo <strong>della</strong> nostra <strong>applicazione</strong>.<br />
123
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Figura 64 Conversione del DateTime nelle query SQL<br />
Se quin<strong>di</strong> l’<strong>applicazione</strong> parte a seguito <strong>di</strong> un doppio click, il formato <strong>della</strong> data <strong>di</strong>penderà dalle<br />
nostre impostazioni internazionali. Nel caso <strong>di</strong> un web server l’<strong>applicazione</strong> web tipicamente<br />
gira con un utente senza profilo (aspnet, network_service, etc.) per questo vengono utilizzate le<br />
impostazioni <strong>di</strong> ‘default’ che sono quelle scelte da chi ha installato il server e registrate nella<br />
chiave <strong>di</strong> registro HKEY_USERS/.Default/....<br />
La soluzione sbagliata è quella dell’uso <strong>della</strong> funzione CONVERT del database che interpreta<br />
la stringa e la riconverte in data. La soluzione corretta è quella <strong>di</strong> non far mai avvenire le due<br />
conversioni da data a stringa (che avviene <strong>di</strong> default nell’<strong>applicazione</strong>) e da stringa a data (che<br />
avviene all’interno del database server).<br />
Usando i parameters, come nel co<strong>di</strong>ce <strong>di</strong> Talete, non vengono fatte conversioni. Il DateTime<br />
viene portato dall’<strong>applicazione</strong> al webserver nel formato binario nativo, senza trasformazioni in<br />
124
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
stringa con vantaggio sia del programmatore che eviterà i problemi dei separatori, sia del<br />
database administrator che eviterà l’uso <strong>di</strong> CONVERT all’interno delle query, e anche del<br />
cliente che avrà un’<strong>applicazione</strong> più performante.<br />
Figura 65 Uso dei parameters con le date<br />
Il guadagno in performance non è solo dato dalla mancata doppia conversione. Il vantaggio sta<br />
anche nella compilazione <strong>della</strong> query. Se la stringa <strong>della</strong> query cambia ogni volta a causa dei<br />
parametri, questa dovrà essere ricompilata ogni volta dal database. Se invece la query è<br />
parametrizzata, verrà compilata solo la prima volta e le successive esecuzioni saranno molto<br />
più performanti. Il performance monitor <strong>di</strong> Windows (SQL Statistics - SQL Compilations/sec e<br />
SQL Re-Compilations/sec) ci rivela in modo lampante questo vantaggio; un esempio del co<strong>di</strong>ce<br />
<strong>di</strong> Talete si ha nella classe Concessionario.cs con la proprietà Organizzazioni che ritorna<br />
l’elenco <strong>di</strong> oggetti <strong>di</strong> tipo Organizzazione che sod<strong>di</strong>sfano la clausola “where”:<br />
125
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Figura 66 Proprietà “Organizzazioni” <strong>della</strong> classe Concessionario<br />
6.2.6 Tentativi <strong>di</strong> SQL Injection in Talete<br />
Per verificare l’effettiva <strong>sicurezza</strong> e protezione <strong>della</strong> piattaforma Talete da attacchi <strong>di</strong> tipo SQL<br />
Injection ho effettuato <strong>una</strong> serie <strong>di</strong> tentativi <strong>di</strong> violazione del database, eseguiti tramite i vari<br />
form d’inserimento <strong>di</strong> cui il sito web <strong>della</strong> piattaforma <strong>di</strong>spone.<br />
Inizio con il valutare i vari tipi <strong>di</strong> risposta che posso ricevere dall’esecuzione <strong>della</strong> pagina; oltre<br />
al caso ovvio e non interessante <strong>di</strong> inserimento corretto e valido dell’input, generalmente<br />
dovrebbero essere forniti messaggi d’avviso da parte <strong>della</strong> pagina web stessa nel caso <strong>di</strong><br />
inserimenti sintatticamente vali<strong>di</strong> ma che non trovano riscontro nelle tabelle utenti contenute<br />
nel database (il classico caso dell’errore <strong>di</strong> <strong>di</strong>gitazione) ed i messaggi d’errore forniti dal web<br />
server in caso <strong>di</strong> non corretta esecuzione <strong>della</strong> query SQL (ovvero quelli causati da inserimenti<br />
“malevoli”). Provo ad introdurre valori casuali nei form e ad avviarne l’esecuzione; anziché<br />
essere mostrati messaggi d’avviso il browser mi visualizza la pagina <strong>di</strong> partenza richiedendo le<br />
credenziali. Provo inoltre ad inserire semplici caratteri che si suppone possano causare un<br />
126
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
malfunzionamento <strong>della</strong> query inoltrata al database, come ad esempio l’apice “ ‘ ” ed i caratteri<br />
<strong>di</strong> commento “ -- ” o “ /**/”. Anche in questo caso il browser si limita ad aggiornare la pagina<br />
iniziale senza mo<strong>di</strong>ficarne minimamente il contenuto; lo stesso avviene con le TextBox<br />
all’interno come quella presente all’interno <strong>della</strong> pagina dei Concessionari che serve per la<br />
creazione <strong>di</strong> un nuovo consulente. In essa, grazie ad un validatore e al co<strong>di</strong>ce scritto<br />
correttamente, qualsiasi stringa con caratteri <strong>di</strong>versi da quelli che in<strong>di</strong>cherebbero il nome <strong>di</strong> un<br />
nuovo consulente, viene rigettata.<br />
Questo evidenzia che il sito è stato pre<strong>di</strong>sposto in modo tale da nascondere un qualunque tipo<br />
<strong>di</strong> informazione che potrebbe essere utile ad un eventuale hacker (nel caso specifico il<br />
sottoscritto).<br />
Dopo numerosi tentativi e varianti la pagina web sembra rigettare ogni inserimento<br />
sintatticamente non corretto, <strong>di</strong>mostrando <strong>di</strong> essere effettivamente ben progettata contro i<br />
pericoli <strong>di</strong> SQL injection.<br />
E’ stata ricercata anche un’anomalia che pur non avendo a che fare con le tecniche <strong>di</strong> SQL<br />
injection riguarda comunque la <strong>sicurezza</strong> dell’accesso alla piattaforma; in caso <strong>di</strong> login corretto<br />
il browser web viene in<strong>di</strong>rizzato ad <strong>una</strong> pagina che ad esempio chiamiamo Prova.asp, dove in<br />
base ad un “id” specificato dalla richiesta http ci verrà fornito l’accesso al materiale desiderato.<br />
Conoscendo già il percorso completo <strong>di</strong> tale pagina Prova.asp all’interno del sito è possibile<br />
accedere <strong>di</strong>rettamente ai contenuti <strong>di</strong> tale pagina semplicemente specificando nell’argomento<br />
<strong>della</strong> GET un Id valido, saltando così completamente la fase <strong>di</strong> riconoscimento tramite<br />
username e password. In Talete anche questa prova ha dato esito negativo, in quanto, senza il<br />
login, l’accesso al sito non viene permesso.<br />
Quin<strong>di</strong> per concludere è possibile affermare che tutti i dati forniti dall’utente sono sottoposti a<br />
meccanismi <strong>di</strong> validazione per il raddoppio degli apici o ad altre tecnice, che nel caso <strong>di</strong> input<br />
<strong>di</strong> tipo stringa come quelli utilizzati nel sito rendono quasi impossibile un qualunque tipo <strong>di</strong><br />
injection. A seguito <strong>di</strong> questo riscontro è possibile riba<strong>di</strong>re l’effettiva <strong>sicurezza</strong> del sito da parte<br />
degli attacchi <strong>di</strong> SQL Injection; da notare la presenza fondamentale dell’opzione<br />
r<strong>una</strong>t=”server”, che specifica il fatto che le operazioni previste dal form dovranno essere<br />
eseguite dal server e non dal client.<br />
127
6.3 Broken Access Control<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
All’interno <strong>di</strong> applicazioni web multiutente, come lo è Talete, sono spesso presenti dei<br />
meccanismi <strong>di</strong> autorizzazione denominati controlli d’accesso. La corretta implementazione<br />
consente <strong>di</strong> associare ad ogni tipologia d’utenza un corrispettivo gruppo <strong>di</strong> appartenenza con<br />
ruoli, credenziali e privilegi <strong>di</strong>versi. La <strong>gestione</strong> delle autorizzazioni deve iniziare dalla<br />
formalizzazione <strong>di</strong> alcune policy che regolano che cosa è lecito per ogni <strong>di</strong>versa classe<br />
d’utenza; già durante la fase <strong>di</strong> design è importante considerare attentamente ogni singolo<br />
aspetto.<br />
Nella fase successiva, quella dell’implementazione, è bene evitare alcuni classici errori:<br />
• Parametri non controllati: le applicazioni usano le informazioni presenti nella<br />
richiesta HTTP per decidere come rispondere. Un attacco potrebbe avvenire<br />
mo<strong>di</strong>ficando <strong>una</strong> qualsiasi parte <strong>della</strong> richiesta HTTP, l’url, la querystring, gli headers, i<br />
cookies o i campi dei form.<br />
Per ovviare a questo tipo <strong>di</strong> attacchi è importante filtrare i dati in arrivo, ci sono tre<br />
politiche principali per il filtraggio:<br />
1. Accettare solo dati vali<strong>di</strong><br />
2. Rifiutare dati non vali<strong>di</strong><br />
3. Sanare i dati in arrivo<br />
La prima opzione è la più sicura, imposizioni <strong>di</strong> lunghezza e formato limitano molto le<br />
possibili manomissioni, al contrario un filtro che elimina alcuni caratteri speciali potrebbe<br />
essere facilmente oltrepassato con <strong>una</strong> qualche co<strong>di</strong>fica.<br />
Un altro importante regola è quella <strong>di</strong> non fidarsi mai <strong>di</strong> un controllo <strong>di</strong> vali<strong>di</strong>tà lato client,<br />
questi controlli sono utili da punto <strong>di</strong> vista delle performances e dell’usabilità, ma sono<br />
molto semplici da evitare.<br />
• File permission: molti server web utilizzano sistemi <strong>di</strong> controllo d’accesso forniti dal<br />
file system <strong>della</strong> piattaforma in uso. Anche se tutti i dati vengono conservati su server<br />
posizionati nel backend, ci sono sempre dei file conservati localmente sui web e<br />
application server che non devono essere accessibili da tutti (file <strong>di</strong> configurazione, file<br />
128
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
default e script). Solamente i file che devono essere visualizzati dagli utenti via web<br />
devono essere marcati come leggibili usando il sistema <strong>di</strong> <strong>gestione</strong> dei permessi del<br />
sistema operativo (la maggior parte delle <strong>di</strong>rectory deve essere nascosta e pochissimi<br />
file, se non nessuno, deve essere marcato come eseguibile).<br />
• Forced browsing per superare <strong>una</strong> restrizione d’accesso: molte applicazioni, tra cui<br />
Talete, prevedono dei controlli prima <strong>di</strong> accedere ad un in<strong>di</strong>rizzo profondamente<br />
ni<strong>di</strong>ficato all’interno del sito. È necessario evitare che un utente possa saltare tali<br />
controlli forzando la navigazione (es: non fidarsi <strong>della</strong> variabile HTTP_REFERER).<br />
• Insecure ID: non bisogna affidarsi alla segretezza degli ID usati comunemente per<br />
<strong>di</strong>stinguere gli utenti, i gruppi <strong>di</strong> appartenenza e quin<strong>di</strong> i relativi privilegi. Se un<br />
aggressore riuscisse a leggere tali valori e capire la logica dell’assegnazione (es: il<br />
valore "0" per l’utente root) potrebbe generare delle richieste HTTP mo<strong>di</strong>ficate,<br />
scar<strong>di</strong>nando il meccanismo <strong>di</strong> controllo implementato. Fondamentale in Talete è il<br />
parametro ID presente nelle query; in pratica se fosse l’unico parametro presente,<br />
chiunque potrebbe provare ad indovinare quell’id scrivendone uno a caso. In questo<br />
modo, se l’id fosse presente, sarebbero visualizzati dei dati che non dovrebbero essere<br />
mostrati. Per questo, nelle query <strong>di</strong> Talete, è stato inserito un altro parametro, che è l’id<br />
dell’organizzazione, in modo tale che, se l’id tirato a caso dall’utente <strong>di</strong> quella stessa<br />
organizzazione è giusto, i dati vengono mostrati (ma comunque è un utente appartenente<br />
a quell’organizzazione), altrimenti la query non restituisce alcun risultato perché non<br />
viene specificato l’esatto parametro relativo all’id dell’organizzazione.<br />
• Client Side Caching: le pagine salvate in cache dai moderni browser sono un pericolo<br />
costante per la riservatezza dei dati <strong>di</strong> quelle persone che navigano attraverso postazioni<br />
pubbliche (scuole, internet point, etc.). Si dovrebbe adottare tutte le soluzioni tecniche<br />
per evitare il caching delle pagine contenenti informazioni sensibili oppure dati<br />
129
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
importanti, quali ad esempio particolari permessi (ad es. amministratore) o informazioni<br />
private.<br />
• Path trasversale: questo attacco coinvolge l’uso <strong>di</strong> in<strong>di</strong>rizzi relativi (es.<br />
"../../some<strong>di</strong>r/somefile.txt") per accedere a risorse che normalmente non dovrebbero<br />
essere <strong>di</strong>sponibili.<br />
6.4 Broken Authentication e Session Management<br />
Nelle moderne applicazioni web, la <strong>gestione</strong> dell’autenticazione è uno dei primi meccanismi<br />
messo in atto per <strong>di</strong>scriminare un utente riconosciuto da uno estraneo. Solitamente l’utente si<br />
presenta (fase <strong>di</strong> identificazione) inviando username e password che attesta la sua conoscenza<br />
del "segreto con<strong>di</strong>viso" (fase <strong>di</strong> autenticazione).<br />
A seguito <strong>di</strong> questa procedura, per la natura stateless del protocollo HTTP, è necessario tener<br />
traccia delle operazioni compiute durante la navigazione dal singolo navigatore; pensiamo ad<br />
<strong>una</strong> tipica <strong>applicazione</strong> commerciale, in cui è necessario mantenere un carrello virtuale con i<br />
prodotti acquistati dall’utente. Per dotare le applicazioni web <strong>di</strong> questa funzionalità, negli anni<br />
sono state sviluppate numerose tecniche ma, ad oggi, la più comune è quella basata su token <strong>di</strong><br />
sessione. In pratica, nella fase che segue l’autenticazione, il server associa al client un ID <strong>di</strong><br />
sessione che <strong>di</strong>stinguerà univocamente un utente da un altro; ogni qualvolta il browser<br />
dell’utente effettua <strong>una</strong> richiesta verso l’<strong>applicazione</strong> invia anche tale identificativo,<br />
permettendo <strong>di</strong> tracciare le varie operazioni compiute nel tempo. Sul lato client tale<br />
informazione è spesso memorizzata all’interno dei cookie. Nella figura successiva è<br />
schematizzato il classico meccanismo dei session token.<br />
130
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Figura 67 Gestione dei token <strong>di</strong> sessione<br />
Per quanto riguarda la <strong>gestione</strong> delle sessioni è fondamentale proteggere l’ID <strong>di</strong> sessione<br />
utilizzando un canale <strong>di</strong> trasmissione sicuro in maniera da ridurre il rischio <strong>di</strong> intercettazione; è<br />
altresì importante utilizzare identificativi che siano <strong>di</strong>fficili da generare e composti, in maniera<br />
casuale, facendo uso <strong>di</strong> complicate catene <strong>di</strong> numeri e caratteri. Se i token <strong>di</strong> sessione non<br />
vengono adeguatamente protetti, un aggressore potrebbe <strong>di</strong>rottare <strong>una</strong> sessione attiva e<br />
assumere il ruolo <strong>di</strong> un malcapitato utente.<br />
La <strong>di</strong>fesa a questo rischio non consiste solo nel rendere sicura la trasmissione del cookie (come<br />
viene fatto adoperando SSL) ma piuttosto è necessario, nell’<strong>applicazione</strong> web, capire se il<br />
session id allegato ad <strong>una</strong> richiesta è valido oppure corrotto, cioè applicare uno schema <strong>di</strong><br />
<strong>gestione</strong> <strong>della</strong> sessione.<br />
Esistono <strong>di</strong>versi schemi <strong>di</strong> <strong>gestione</strong> delle sessioni utente:<br />
• time-out <strong>della</strong> sessione: sappiamo che un attacco richiede del tempo, sia per quanto riguarda<br />
la preparazione sia per la sua messa in atto. Una sessione che non ha scadenza nel tempo<br />
può dare all’attaccante un tempo infinito a sua <strong>di</strong>sposizione. Inserendo invece <strong>una</strong> scadenza<br />
(time-out) che invalida l’id <strong>di</strong> sessione, forzando la cancellazione dei dati accumulati, limita<br />
in modo significativo tale possibilità ed evita alcuni problemi come il mantenimento in<br />
cache delle informazioni (specialmente quando si utilizzano proxy) ;<br />
131
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
• rigenerazione dell’id: questa è <strong>una</strong> delle tecniche trasparenti all’utente secondo la quale, in<br />
un istante arbitrario, il server cambia l’identificativo <strong>di</strong> sessione dei dati memorizzati,<br />
aggiornando tale valore nelle risposte fornite al client. Il risultato è simile al time-out, cioè<br />
l’id viene invalidato, ma questa volta il cambiamento del numero non tiene conto del tempo<br />
<strong>di</strong> vita <strong>della</strong> sessione o del tempo <strong>di</strong> inutilizzo, ma è casuale. In PHP è stata pre<strong>di</strong>sposta <strong>una</strong><br />
funzione apposita (session regenerate()) per la rigenerazione del session id. Tale<br />
funzionalità rende semplicissima l’attuazione <strong>di</strong> tale contromisura ;<br />
• brute-forcing detection: questa misura <strong>di</strong> <strong>sicurezza</strong> viene espletata bloccando l’accesso a<br />
quelle macchine (definite tramite il loro ip o nome dell’ host) che inviano molte richieste<br />
con id errato (estrapolato da bruteforcing) in un tempo troppo breve per essere considerate<br />
accidentali;<br />
• riautenticazione: le operazioni più critiche possono essere salvaguardate annullando<br />
l’autenticazione effettuata dall’utente in modo tale da controllare la sua identità<br />
imme<strong>di</strong>atamente prima dell’esecuzione dell’operazione critica ;<br />
• trasmissione dell’id: se un id viene catturato in fase <strong>di</strong> trasmissione dello stesso sulla rete,<br />
l’account viene facilmente esposto a duplicazione o attacco <strong>di</strong> hijacking. La scelta riguardo<br />
il mezzo <strong>di</strong> trasporto dell’id risulta quin<strong>di</strong> determinante per quanto riguarda la salvaguar<strong>di</strong>a<br />
<strong>della</strong> riservatezza.<br />
Asp.NET implementa un meccanismo <strong>di</strong> <strong>gestione</strong> <strong>della</strong> sessione molto avanzato; in Talete, e in<br />
particolare nel file web.config, sono due gli elementi da considerare e da specificare:<br />
1. è stata impostata a true la proprietà FormsAuthentication.Sli<strong>di</strong>ngExpiration, che<br />
specifica se è abilitata la scadenza variabile, che consente <strong>di</strong> reimpostare il tempo <strong>di</strong><br />
un cookie <strong>di</strong> autenticazione attivo in modo che scada a ogni richiesta durante <strong>una</strong><br />
singola sessione. Se impostata a true in<strong>di</strong>ca che è attivata la scadenza variabile e<br />
quin<strong>di</strong> il cookie <strong>di</strong> autenticazione viene aggiornato e la scadenza viene reimpostata a<br />
ogni richiesta durante <strong>una</strong> singola sessione. Mentre con false si specifica che la<br />
scadenza variabile non è attivata e che il cookie scade dopo un determinato periodo<br />
<strong>di</strong> tempo dalla propria emissione. Ovviamente l’intervallo <strong>di</strong> tempo, espresso in<br />
132
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
minuti interi, trascorso il quale il cookie scade viene specificato con l’attributo<br />
timeout.<br />
2. È stata impostata al valore AutoDetect la proprietà SessionStateSection.Cookieless.<br />
L’ID univoco che associa il client a <strong>una</strong> sessione server può essere archiviato in due<br />
mo<strong>di</strong> dallo stato sessione: tramite l’archiviazione <strong>di</strong> un cookie HTTP sul client o<br />
tramite la co<strong>di</strong>fica dell’ID <strong>di</strong> sessione nell’URL. L’archiviazione dell’ID <strong>di</strong> sessione<br />
nel cookie risulta più sicura, ma richiede il supporto dei cookie da parte del browser<br />
del client. Nel caso delle applicazioni che consentono client che non supportano<br />
cookie, ad esempio alcuni <strong>di</strong>spositivi mobili, l’ID <strong>di</strong> sessione può essere archiviato<br />
nell’URL. Tale opzione presenta svariati svantaggi. È necessario che i collegamenti<br />
nel sito siano relativi e che la pagina sia rein<strong>di</strong>rizzata all’inizio <strong>della</strong> sessione con<br />
nuovi valori <strong>di</strong> stringa <strong>di</strong> query. L’ID <strong>di</strong> sessione viene inoltre esposto nella stringa<br />
<strong>di</strong> query e può essere quin<strong>di</strong> rilevato e utilizzato in un attacco alla <strong>sicurezza</strong>.<br />
È consigliabile utilizzare la modalità senza cookie solo se risulta necessario<br />
supportare client privi <strong>di</strong> supporto per i cookie.<br />
Lo stato sessione supporta inoltre due opzioni aggiuntive: UseDeviceProfile e<br />
AutoDetect. La prima opzione consente al modulo dello stato sessione <strong>di</strong> determinare<br />
quale modalità, ovvero con o senza cookie, viene utilizzata su base client, a seconda<br />
delle capacità del browser. Con l’opzione AutoDetect Asp.NET è “così intelligente”<br />
da capire da solo se usare i cookie oppure l’Url; infatti essa consente <strong>di</strong> eseguire un<br />
handshake con il browser, per verificare se è possibile archiviare un cookie, e<br />
prevede quin<strong>di</strong> un’ulteriore richiesta per determinare la modalità da utilizzare. In<br />
pratica viene inviato il cookie e si esegue <strong>una</strong> re<strong>di</strong>rect verso <strong>una</strong> pagina che controlla<br />
la presenza del cookie; se la pagina <strong>di</strong> controllo non riceve il cookie significa che il<br />
client non li supporta e inserisce il ticket <strong>di</strong> login nell’Url. In generale, se è<br />
necessario supportare client senza cookie, è consigliabile prendere in considerazione<br />
l’utilizzo del campo UseDeviceProfile per generare cookie senza URL solo per i<br />
client che li richiedono.<br />
133
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Il meccanismo <strong>di</strong> autenticazione e la <strong>gestione</strong> delle sessioni sono elementi importanti per<br />
assicurare dei requisiti minimi <strong>di</strong> <strong>sicurezza</strong> nelle applicazioni web.<br />
L’utilizzo <strong>di</strong> password considerate "deboli", ovvero composte da pochi caratteri (solamente<br />
alfabetici), che compongono parole d’uso comune nella lingua considerata, è <strong>una</strong> pratica<br />
sconsigliata in quanto rende possibile un attacco a forza bruta basato su <strong>di</strong>zionari. Un sistema<br />
<strong>di</strong> autenticazione dovrebbe imporre <strong>una</strong> lunghezza minima e dei criteri <strong>di</strong> complessità per le<br />
password scelte dagli utenti, questo rende più complesso il trovare <strong>una</strong> password tirando ad<br />
indovinare Tutte le password devono essere conservate sotto forma <strong>di</strong> hash oppure cifrate in<br />
qualsiasi modo esse vengano conservate ed è la soluzione adoperata nella nostra <strong>applicazione</strong>.<br />
E’ preferibile l’utilizzo <strong>di</strong> <strong>una</strong> funzione <strong>di</strong> hash, in quanto non reversibile. E’ importante non<br />
mantenere nei log informazioni come username e password, i log potrebbero essere in uno<br />
spazio insicuro. Tra le altre cose dovrebbe essere configurato un numero prefissato <strong>di</strong> tentativi<br />
<strong>di</strong> login per unità <strong>di</strong> tempo. I tentativi falliti dovrebbero essere loggati. Per le stesse ragioni è<br />
consigliabile inoltre adottare delle policy <strong>di</strong> cambio password che non permettano<br />
l’inserimento <strong>di</strong> parole chiave già utilizzate in passato; ad un cambio <strong>di</strong> password all’utente<br />
dovrebbe essere sempre richiesto l’inserimento <strong>della</strong> vecchia e <strong>della</strong> nuova password,<br />
analogamente dovrebbe essere richiesta un’ulteriore conferma per il cambio <strong>di</strong> mail, altrimenti<br />
qualcuno potrebbe inserire il proprio in<strong>di</strong>rizzo e poi richiedere la password "<strong>di</strong>menticata" .<br />
Bisogna proteggere le credenziali in transito, e l’unica tecnica efficiente è quella <strong>di</strong> proteggere<br />
tutta la fase <strong>di</strong> login utilizzando protocolli come SSL. La semplice trasformazione in hash <strong>della</strong><br />
password, prima <strong>della</strong> trasmissione <strong>della</strong> medesima, fornisce <strong>una</strong> scarsa protezione. La<br />
transazione potrebbe essere intercettata e ritrasmessa anche se l’attuale password non è nota.<br />
I sistemi dovrebbero essere progettati in modo da evitare l’accesso alla lista dei nomi degli<br />
account presenti sul sito. Se queste liste devono essere mostrate, si raccomanda <strong>di</strong> usare degli<br />
pseudonimi che mappano i nomi veri degli account. In questo modo, lo pseudonimo non può<br />
essere utilizzato per un tentativo <strong>di</strong> login o per altri meto<strong>di</strong> <strong>di</strong> attacco su <strong>di</strong> un account utente.<br />
Altro elemento da tener presente è la cache del browser: i dati <strong>di</strong> autenticazione e <strong>di</strong> sessione<br />
non dovrebbero mai essere trasmessi come parte <strong>della</strong> GET; al contrario dovrebbero essere<br />
utilizzate sempre delle POST. Le pagine <strong>di</strong> autenticazione dovrebbero essere marcate con il tag<br />
134
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
“no cache”; in questo modo si può prevenire la possibilità <strong>di</strong> usare il tasto “back” per tornare<br />
alla schermata <strong>di</strong> login e reinviare le credenziali utilizzate precedentemente.<br />
6.5 Cross Site Scripting<br />
Il cross site scripting è <strong>una</strong> tipologia <strong>di</strong> attacco che può essere portato a compimento anche se<br />
solo uno dei tre attori principali <strong>della</strong> società informatica, cioè utenti, sviluppatori e<br />
amministratori <strong>di</strong> sistema, è incauto.<br />
Si tratta <strong>di</strong> <strong>una</strong> vulnerabilità che consente ad eventuali aggressori <strong>di</strong> inserire del co<strong>di</strong>ce<br />
arbitrario all’interno delle applicazioni web, così da mo<strong>di</strong>ficarne il comportamento per<br />
perseguire i propri fini illeciti. Il co<strong>di</strong>ce inviato, spesso sotto forma <strong>di</strong> script (JavaScript,<br />
VBScript e così via), verrà eseguito senza alcun controllo dal browser dell’utente poiché<br />
inoltrato da <strong>una</strong> sorgente ritenuta sicura: il server web da cui proviene la pagina.<br />
Figura 68 XSS con un sito vulnerabile<br />
1. l’hacker crea uno script nato per girare nel browser del client<br />
2. l’hacker inietta in qualche modo lo script nel web server<br />
3. il web server consegna lo script a uno o più client<br />
135
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Quando il client lo esegue fornisce delle informazioni all’hacker che non avrebbe dovuto dare.<br />
La web application è colpevole in quanto vulnerabile e consegna lo script dell’hacker al client;<br />
l’attacco funziona anche in assenza <strong>di</strong> vulnerabilità del browser e dei sistemi operativi <strong>di</strong> client<br />
e server.<br />
Come esempio si può provare a scrivere su un forum nel testo:<br />
location=‘http://www.notrace.it/’;<br />
Successivamente si può salvare questo testo su un forum non protetto da questo attacco e come<br />
risultato si avrà che chi carica la pagina con il messaggio, sarà rein<strong>di</strong>rizzato al sito<br />
www.notrace.it<br />
Ve<strong>di</strong>amo un esempio più pericoloso con questo testo:<br />
document.location=‘http://www.sito.com/leggo-<br />
cookie.asp?’+document.cookie<br />
Con questa riga si possono leggere i cookie rilasciati dal sito vittima e inviarli ad <strong>una</strong> pagina<br />
appositamente creata.<br />
La prima domanda che salta in mente allo sviluppatore riguarda la <strong>sicurezza</strong> degli script. Non<br />
erano forse stati pensati per essere intrinsecamente sicuri? È noto che gli script possono<br />
accedere ad un numero limitato <strong>di</strong> risorse e che il browser impe<strong>di</strong>sce loro, tra le altre cose, <strong>di</strong><br />
accedere ad un arbitrario file su <strong>di</strong>sco o <strong>di</strong> eseguire chiamate <strong>di</strong> sistema. Il fatto è che gli script<br />
possono essere considerati sicuri in quanto eseguiti nel contesto dell’<strong>applicazione</strong> web per cui<br />
sono stati scritti. Non è certamente <strong>di</strong> interesse per un sito <strong>di</strong>vulgare le informazioni sensibili<br />
che gli sono state affidate dall’utente; <strong>di</strong>verso è se lo script è pensato da qualcuno che vuole<br />
rubare queste informazioni.<br />
Rivalutando gli script in quest’ottica, ecco che le risorse a cui devono poter accedere possono<br />
risultare a rischio; tra queste ci possono essere i dati presenti nella pagina web del sito<br />
vulnerabile, i dati prelevabili con richieste Get/Post/XmlHttp al sito <strong>di</strong> provenienza, i cookie<br />
persistenti o ancora dei dati XML usati per esempio da Ajax.<br />
Descritto il meccanismo a gran<strong>di</strong> linee, entriamo in maggiore dettaglio cominciando a<br />
sud<strong>di</strong>videre gli attacchi <strong>di</strong> cross site scripting in due macrocategorie: attacchi stored e<br />
136
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
attacchi reflected. I primi si verificano quando il co<strong>di</strong>ce nocivo è conservato dall’<strong>applicazione</strong><br />
stessa e viene presentato all’utente ogni qualvolta si accede ad <strong>una</strong> specifica pagina (es: un<br />
messaggio, all’interno <strong>di</strong> un forum, che contiene JavaScript). Nella seconda categoria rientrano<br />
quegli attacchi che utilizzano altri canali <strong>di</strong> comunicazione (es: email, messaggi attraverso IM<br />
client e così via) per trasmettere un link "mo<strong>di</strong>ficato", il quale rein<strong>di</strong>rizzerà il co<strong>di</strong>ce verso<br />
l’utente.<br />
Uno degli attacchi <strong>di</strong> cross site scripting più <strong>di</strong>ffusi inizia con un attacco <strong>di</strong> social engineering<br />
che ha come mezzo <strong>una</strong> apparentemente innocua email che promette <strong>una</strong> vincita milionaria<br />
sicura. In mezzo alle milioni <strong>di</strong> email <strong>di</strong> spam che girano su internet, molte sono un attacco <strong>di</strong><br />
cross site scripting.<br />
Credo che nessuno possa negare che tragicamente non sarebbero pochi gli utenti a cliccare sul<br />
link per cercare <strong>di</strong> riscuotere la presunta vincita milionaria.<br />
Figura 69 Esempio <strong>di</strong> attacco <strong>di</strong> “ cross site scripting”<br />
Al click dell’utente si apre, ad esempio, il sito <strong>della</strong> banca che l’hacker ha prescelto in quanto<br />
vulnerabile al cross site scripting e <strong>di</strong> cui presume che l’utente ne sia un cliente. Il risultato è<br />
l’apertura del browser che non desta alcun sospetto all’utente che brama la vincita fort<strong>una</strong>ta. A<br />
137
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
questo punto il browser esegue <strong>una</strong> GET o POST <strong>della</strong> pagina vulnerabile del sito <strong>della</strong> banca<br />
trasmettendo lo script avvelenatore.<br />
Come risultato il browser riceve la pagina inquinata dallo script che viene eseguito<br />
imme<strong>di</strong>atamente. Lo script, essendo stato scaricato dal dominio del sito <strong>della</strong> banca, ha accesso<br />
al cookie che incautamente custo<strong>di</strong>sce le credenziali per accedere alle operazioni sul conto<br />
corrente, e che viene prontamente trasmesso all’hacker. Infine viene subito caricata un’altra<br />
pagina per non insospettire l’utente. Di tutta questa operazione l’utente non fa in tempo a<br />
vedere il caricamento <strong>della</strong> pagina <strong>della</strong> banca in quanto avviene in tempi rapi<strong>di</strong>ssimi. Il furto<br />
delle credenziali è avvenuto e l’utente con tutta probabilità non si è accorto <strong>di</strong> nulla.<br />
Le vulnerabilità XSS possono essere sfruttare dall’aggressore in molti mo<strong>di</strong>; <strong>di</strong> seguito sono<br />
mostrati alcuni possibili scenari che ne evidenziano la pericolosità:<br />
• Session Hijacking: è sicuramente l’utilizzo illecito più comune; in questo modo un<br />
aggressore può rubare le credenziali dell’utente e utilizzare l’<strong>applicazione</strong> con i<br />
privilegi <strong>di</strong> quest’ultimo. Solitamente questo attacco è attuato inviando un semplice<br />
script all’interno del sito vulnerabile e forzando l’utente a visitare la pagina che contiene<br />
le istruzioni dannose; spesso per convincere la vittima si utilizzano tecniche <strong>di</strong> social<br />
engineering come già descritto. Bisogna tener presente che il co<strong>di</strong>ce inserito<br />
dall’aggressore viene eseguito dal browser dell’utente come <strong>una</strong> qualsiasi altra<br />
informazione proveniente dal sito visitato: la vittima non si accorgerà <strong>di</strong> nulla se le<br />
istruzioni inserite copiano il token <strong>di</strong> sessione, presente all’interno dei cookie, e lo<br />
inviano verso un sito esterno. Se l’<strong>applicazione</strong> non controlla la sessione attraverso altri<br />
meccanismi, l’aggressore ha quin<strong>di</strong> tutte le informazioni che servono per<br />
impersonificare l’utente.<br />
Un attacco leggermente <strong>di</strong>verso, ma con simili risultati, è quello denominato session<br />
fixation: in questo caso l’aggressore richiede un token <strong>di</strong> sessione valido attraverso <strong>una</strong><br />
normale richiesta e lo inoltra verso la vittima, creando <strong>una</strong> "trap session". Alcune<br />
applicazioni permettono la definizione <strong>di</strong> session ID attraverso un’esplicita richiesta<br />
presente nell’URL (es: login.php?PHPSESSID=1234), rendendo possibile la<br />
138
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
con<strong>di</strong>visione del medesimo token <strong>di</strong> sessione tra utente ed aggressore che può quin<strong>di</strong><br />
controllare la navigazione.<br />
• User Tracking: un altro uso <strong>di</strong> XSS è quello relativo all’ottenimento <strong>di</strong> informazioni<br />
riguardo la tipologia <strong>di</strong> visite e <strong>di</strong> visitatori in un sito web, per poi poter iniziare attività<br />
<strong>di</strong> spamming.<br />
• Browser/User exploitation: l’invio <strong>di</strong> co<strong>di</strong>ce dannoso può rendere <strong>di</strong>fficile la<br />
navigazione, intervenendo sulle modalità <strong>di</strong> interazione tra sito ed utente. L’aggressore<br />
potrebbe forzare l’apertura <strong>di</strong> alert box o il reload delle pagine, obbligando l’utente ad<br />
interrompere la visita al sito oppure forzando eventuali percorsi <strong>di</strong> navigazione.<br />
• Credentialed Misinformation/Information Dissemination: dal momento che Internet<br />
sta assumendo un ruolo importante come mezzo propagan<strong>di</strong>stico, questo ultimo attacco<br />
XSS non deve essere trascurato. Attraverso l’invio <strong>di</strong> script, in esecuzione sul browser, è<br />
possibile mo<strong>di</strong>ficare attivamente il contenuto <strong>di</strong> un sito e la modalità <strong>di</strong> presentazione.<br />
Le notizie ed i contenuti riportati nelle varie pagine web vulnerabili possono essere<br />
cambiati a proprio piacimento, creando <strong>di</strong>sinformazione. Scenari possibili vanno dalle<br />
mo<strong>di</strong>fiche <strong>di</strong> alcune notizie all’interno dei giornali online, al cambio <strong>di</strong> valori nel sito<br />
<strong>della</strong> borsa sino all’inserimento <strong>di</strong> pubblicità in siti molto frequentati.<br />
L’eventualità che un sito contenga <strong>una</strong> vulnerabilità <strong>di</strong> questo tipo è estremamente elevata<br />
poiché spesso non è semplice filtrare l’input dell’utente: esistono innumerevoli mo<strong>di</strong> per<br />
inserire del co<strong>di</strong>ce JavaScript all’interno <strong>di</strong> pagine HTML, molti standard e <strong>di</strong>fferenti<br />
meccanismi <strong>di</strong> invio dei dati. Non dobbiamo inoltre <strong>di</strong>menticare che parlando <strong>di</strong> scripting lato<br />
client non esiste solo JavaScript ma anche ActiveX(OLE), VBScript, Flash, etc.<br />
L’uso <strong>di</strong> linguaggi interpretati (PHP, Python, Java, Pike, Perl, Ruby, ...) riduce <strong>di</strong> molto il<br />
problema in quanto un errore per compromettere la <strong>sicurezza</strong> dovrebbe andare a provocare un<br />
buffer overflow nella VM.<br />
I rime<strong>di</strong> sono vari, dal tenere costantemente aggiornato il sistema ed i vari prodotti usati, al<br />
controllare ogni input per lunghezza e formato.<br />
Tuttavia è molto <strong>di</strong>fficile identificare e rimuovere, da <strong>una</strong> <strong>applicazione</strong> web, delle vulnerabilità<br />
<strong>di</strong> XSS. Il modo migliore per riscontrarle è quello <strong>di</strong> eseguire <strong>una</strong> revisione del co<strong>di</strong>ce ed<br />
139
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
identificare tutti i punti in cui i dati in ingresso da <strong>una</strong> HTTP request possano transitare<br />
all’interno <strong>di</strong> un output HTML. E’ da tenere presente che <strong>una</strong> varietà <strong>di</strong> tag HTML può essere<br />
utilizzata per inviare un javascript artefatto. Alcuni tool come Nessus, Nikto e altri, possono<br />
aiutare nella ricerca <strong>di</strong> queste falle, anche se sono in grado <strong>di</strong> eseguire un controllo superficiale.<br />
Per ridurre la pericolosità <strong>di</strong> questo attacco, si potrebbe definire <strong>una</strong> policy <strong>di</strong> <strong>sicurezza</strong> che<br />
specifichi le tipologie <strong>di</strong> dati da trattare, filtrare l’input e anche l’output in maniera da inibire le<br />
falle provocate da XSS; questo ultimo aspetto è facilmente realizzabile convertendo i caratteri<br />
"pericolosi" negli equivalenti HTML entity enco<strong>di</strong>ng (es:"
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Per concludere, è possibile vedere come l’entità del danno provocato da questa vulnerabilità<br />
può variare dalla più totale innocuità a un feroce attacco. L’hacker potrebbe firmare dei<br />
messaggi a nome dell’utente oppure leggere i suoi dati sensibili. O ancora lo script potrebbe<br />
consegnare nelle mani dell’hacker la password dell’utente per quel forum/blog. Quanto queste<br />
credenziali possano essere importanti <strong>di</strong>pende dall’accortezza dell’utente a non usarle, ad<br />
esempio, per l’accesso al proprio conto bancario. In sostanza anche i siti che si reputano a zero<br />
rischio per la bassa importanza del contenuto del proprio sito, possono creare <strong>una</strong> grave<br />
minaccia. Questo è un chiaro esempio <strong>di</strong> quanto la <strong>sicurezza</strong> sia <strong>una</strong> miscela costruita su più<br />
elementi e con tutti gli attori del sistema informatico.<br />
6.6 Buffer Overflow<br />
Il Buffer Overflow è un attacco che sfrutta <strong>una</strong> validazione errata dell’input, in cui non si<br />
controlla la lunghezza <strong>della</strong> sequenza <strong>di</strong> dati ricevuti dall’<strong>applicazione</strong>. Un utente, per errore o<br />
maliziosamente, può mo<strong>di</strong>ficare la parte <strong>di</strong> co<strong>di</strong>ce in esecuzione nello stack andando a<br />
cambiare il flusso <strong>di</strong> esecuzione del software prendendo il controllo <strong>della</strong> macchina.<br />
Tecnicamente esistono <strong>di</strong>verse strategie - stack overflow, heap overflow, format string - che<br />
possono però essere ricondotte ad un’unica grande famiglia <strong>di</strong> vulnerabilità in cui l’aggressore<br />
può riuscire ad eseguire coman<strong>di</strong> arbitrari. Nel caso delle applicazioni online è possibile<br />
riscontrare tale vulnerabilità sia nel web server stesso che all’interno <strong>di</strong> librerie custom<br />
utilizzate dalla web application.<br />
Questa vulnerabilità è al contempo <strong>una</strong> delle più <strong>di</strong>fficili da riscontrare e da sfruttare: un<br />
aggressore, senza il co<strong>di</strong>ce sorgente, <strong>di</strong>fficilmente riuscirà a creare un exploit per inviare<br />
141
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
coman<strong>di</strong> remoti al sistema; è molto più probabile che riesca solamente a bloccare il servizio,<br />
interrompendo in ogni caso la normale esecuzione del software.<br />
È opportuno ricordare che, con l’avvento delle tecnologie java (JSP) e gli altri linguaggi<br />
interpretati, tale problematica sta lentamente <strong>di</strong>minuendo e lasciando posto nella classifica a<br />
nuove sfide per garantire la <strong>sicurezza</strong>.<br />
6.7 Injection Flaw<br />
Gli attacchi <strong>di</strong> questo tipo agiscono inserendo co<strong>di</strong>ce all’interno dei parametri e possono<br />
causare vari problemi.<br />
Ogni <strong>applicazione</strong> scritta in linguaggi interpretati, o che faccia uso <strong>di</strong> chiamate al sistema per<br />
l’esecuzione <strong>di</strong> programmi esterni, può essere soggetta a questo tipo <strong>di</strong> attacco.<br />
Un esempio tipico è quello <strong>di</strong> un parametro scelto dall’utente ed utilizzato all’interno <strong>di</strong> <strong>una</strong><br />
system call; un utente potrebbe inserire, alla fine del parametro, dei coman<strong>di</strong> in aggiunta a<br />
quelli hardcoded già presenti all’interno dell’<strong>applicazione</strong> (esempio "; rm –rf<br />
/home/"). In casi eclatanti è possibile veicolare dei co<strong>di</strong>ci completi in PHP, Perl o altri<br />
linguaggi, per poi eseguire <strong>di</strong>rettamente il co<strong>di</strong>ce sul server.<br />
Oltre ai linguaggi <strong>di</strong> programmazione le iniezioni possono anche essere <strong>di</strong> co<strong>di</strong>ce SQL, questo<br />
compromette ovviamente la <strong>sicurezza</strong> dei dati.<br />
I suggerimenti per ovviare a questo tipo <strong>di</strong> attacchi sono:<br />
• Evitare <strong>di</strong> accedere a risorse esterne, nei limiti del possibile. Per un gran numero <strong>di</strong><br />
coman<strong>di</strong> shell e per alcune system call, ci sono delle librerie specifiche per ogni<br />
linguaggio in grado <strong>di</strong> eseguire la stessa operazione. L’utilizzo <strong>di</strong> queste librerie non<br />
142
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
coinvolge le risorse del S.O. In tal modo è possibile evitare un gran numero <strong>di</strong> problemi<br />
legati ai coman<strong>di</strong> shell.<br />
• Per tutte le chiamate che devono essere eseguite, come ad esempio quelle verso il DB<br />
nel backend, è necessario validare accuratamente i dati trasmessi per evitare che ci siano<br />
dati “malevoli”. E’ possibile strutturare la maggior parte delle request in modo da<br />
assicurarsi che tutti i parametri forniti all’<strong>applicazione</strong> siano trattati come dati, piuttosto<br />
che come contenuti potenzialmente eseguibili. L’utilizzo <strong>di</strong> procedure prememorizzate o<br />
<strong>di</strong> sintassi già preparate, può fornire <strong>una</strong> protezione in più assicurando che i dati forniti<br />
in ingresso siano trattati come tali. Queste soluzioni possono portare ad <strong>una</strong> riduzione,<br />
ma non riescono ad eliminare completamente il rischio.<br />
• Controllare i co<strong>di</strong>ci <strong>di</strong> ritorno <strong>di</strong> eventuali chiamate a programmi esterni, come minimo<br />
per sapere se l’esecuzione è andata a buon fine, ma anche per non essere ignari <strong>di</strong> un<br />
eventuale attacco in atto.<br />
6.8 Improper Error Handling<br />
Questa classe <strong>di</strong> vulnerabilità è un esempio concreto <strong>di</strong> come bastano piccoli accorgimenti per<br />
ridurre notevolmente il rischio <strong>di</strong> un’aggressione informatica.<br />
Arrivare a rubare dati dal server o eseguire co<strong>di</strong>ce su <strong>di</strong> esso implica <strong>una</strong> piena conoscenza del<br />
sistema che bisogna aggre<strong>di</strong>re e dei meccanismi <strong>di</strong> <strong>sicurezza</strong> da aggirare; all’aggressore<br />
servono informazioni sui servizi presenti, sulle loro versioni e configurazioni oltre che sulla<br />
struttura delle <strong>di</strong>rectory. Una <strong>gestione</strong> non corretta degli errori può rivelare in maniera <strong>di</strong>retta<br />
tali informazioni, trasformando un errore apparentemente innocuo in un messaggio utilissimo<br />
143
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
per scopi illeciti. Per accorgersi <strong>di</strong> quanto può essere rischioso, pensiamo ai seguenti messaggi,<br />
nei panni <strong>di</strong> un cyber criminale:<br />
“Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’<br />
[Microsoft][ODBC SQL Server Driver][SQL Server]<br />
All queries in an SQL statement containing a UNION operator must have an equal number of<br />
expressions in their target lists”<br />
Il messaggio precedente rivela alcune preziose informazioni: il tipo <strong>di</strong> piattaforma (Microsoft<br />
Windows), il tipo <strong>di</strong> database (SQL Server tramite ODBC) ed il particolare che la query SQL,<br />
molto probabilmente introdotta dall’utente, non combacia in numero con i parametri specificati<br />
nell’istruzione presente nel co<strong>di</strong>ce. A questo punto conosciamo il nostro target e possiamo<br />
scegliere opportune funzioni del DBMS per costruire la nostra SQL Injection. Con alta<br />
probabilità il nostro attacco andrà a buon fine.<br />
Anche il semplice File Not Found piuttosto <strong>di</strong> un Access Denied può essere un’informazione<br />
utile per un hacker, per non parlare degli stack trace, come è possibile vedere nell’esempio,<br />
dove vengono mostrate parte <strong>di</strong> co<strong>di</strong>ce:<br />
Access to the path "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET<br />
Files\root\c0c02afa\19017b74" is denied.<br />
Description: An unhandled exception occurred during the execution of the current web request.<br />
Please review the stack trace for more information about the error and where it originated in<br />
the code.<br />
Exception Details: System.UnauthorizedAccessException: Access to the path<br />
"C:\WINNT\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET<br />
Files\root\c0c02afa\19017b74" is denied.<br />
ASP.NET is not authorized to access the requested resource. Consider granting access rights<br />
to the resource to the ASP.NET request identity. ASP.NET has a base process identity<br />
(typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6) that is used if the<br />
144
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
application is not impersonating. If the application is impersonating via , the identity will be the anonymous user (typically<br />
IUSR_MACHINENAME) or the authenticated request user.<br />
To grant ASP.NET write access to a file, right-click the file in Explorer, choose "Properties"<br />
and select the Security tab. Click "Add" to add the appropriate user or group. Highlight the<br />
ASP.NET account, and check the boxes for the desired access.<br />
Per <strong>di</strong>fendersi, il principio base è quello <strong>di</strong> non fornire mai messaggi dettagliati ma, al<br />
contrario, errori generici <strong>una</strong> volta che la nostra <strong>applicazione</strong> è online. L’utente non deve<br />
leggere niente <strong>di</strong> più <strong>di</strong> quello che gli serve per comprendere lo stato <strong>della</strong> sua richiesta.<br />
Considerando Talete, se il login è errato, il messaggio <strong>di</strong> errore è il seguente: “Login non<br />
riuscito. Controlla i dati inseriti e riprova”, che è ben <strong>di</strong>verso da un messaggio del tipo: “Errore<br />
nella password per l’username xxx”. Quest’ultimo fornisce un’informazione importante e che<br />
bisognerebbe evitare <strong>di</strong> mostrare, cioè che quell’ username esiste. In questo caso ness<strong>una</strong><br />
informazione tecnica ma, un dato chiaro, che l’utente xxx esiste. All’interno <strong>di</strong> applicazioni<br />
come questa è possibile enumerare tutti gli utenti, provando poi a forzare eventuali password<br />
deboli.<br />
Una buona prassi è quella <strong>di</strong> loggare alcune classi <strong>di</strong> errore – solitamente le più critiche – per<br />
semplificare l’in<strong>di</strong>viduazione <strong>di</strong> errori <strong>di</strong> implementazione e smascherare eventuali tentativi <strong>di</strong><br />
attacco.<br />
145
6.9 Insecure Storage<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Nelle applicazioni web c’è spesso la necessità <strong>di</strong> salvare grosse quantità <strong>di</strong> dati: pensiamo alle<br />
informazioni <strong>di</strong> login, al profilo degli utenti e ai dati più riservati che vengono trattati durante<br />
gli acquisti online. La classe <strong>di</strong> vulnerabilità definita Insecure Storage considera infatti tutte<br />
quelle situazioni in cui i dati non sono conservati in maniera adeguata.<br />
Per fornire un ulteriore livello <strong>di</strong> <strong>sicurezza</strong> alla nostra <strong>applicazione</strong> è spesso consigliabile<br />
l’utilizzo <strong>di</strong> algoritmi <strong>di</strong> cifratura o hashing, in maniera da evitare che un utente che riesca ad<br />
accedere al database – per esempio tramite SQL Injection - riesca anche a leggere i dati.<br />
Durante la fase <strong>di</strong> login è bene effettuare il confronto tra un hash <strong>della</strong> password immessa<br />
dall’utente e l’hash precedentemente salvato sul sistema, invece che un semplice confronto tra<br />
stringhe in chiaro. Considerando che nei moderni linguaggi sono <strong>di</strong>sponibili moltissimi degli<br />
algoritmi <strong>di</strong> hashing noti (MD5, SHA-1, ecc), l’implementazione <strong>della</strong> fase <strong>di</strong> login, come<br />
quella descritta, non complica ulteriormente il lavoro dello sviluppatore.<br />
Anche quando vogliamo cifrare i dati attraverso algoritmi simmetrici è buona norma affidarsi<br />
ad algoritmi noti e ritenuti sicuri dagli esperti. Una delle massime <strong>della</strong> crittografia recita: “La<br />
<strong>sicurezza</strong> <strong>di</strong> un crittosistema non deve <strong>di</strong>pendere dal tener celato il crittoalgoritmo; la <strong>sicurezza</strong><br />
<strong>di</strong>penderà solo dal tener celata la chiave.”<br />
A margine <strong>di</strong> tutto, è comunque consigliabile limitare la <strong>gestione</strong> dei dati critici: invece <strong>di</strong><br />
cifrare i numeri delle carte <strong>di</strong> cre<strong>di</strong>to e conservarli, si potrebbe chiedere agli utenti <strong>di</strong> inserire<br />
l’informazione quando necessario.<br />
146
6.10 Denial of Service<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Come tutti i servizi <strong>di</strong> rete, anche le applicazioni web, soffrono degli attacchi <strong>di</strong> tipo DoS<br />
(Denial of Service) in cui, attraverso l’esaurimento delle risorse del sistema, si satura la sua<br />
capacità fino a determinarne il blocco temporaneo. In questa situazione i sistemi <strong>di</strong>ventano<br />
inutilizzabili per gli utenti legittimamente attivi.<br />
Una grossa quantità <strong>di</strong> richieste HTTP è un primo e semplice esempio <strong>di</strong> come poter saturare le<br />
risorse <strong>di</strong> un server web, bloccando l’accesso per tutti gli altri utenti. Pratiche <strong>di</strong> questo tipo<br />
sono sempre più frequenti durante i net strike e, purtroppo, come meccanismo d’estorsione<br />
verso siti che traggono profitto dalla pubblicità sul numero <strong>di</strong> visitatori.<br />
Sebbene particolari configurazioni possono mitigare il problema, questa problematica è<br />
comunque impossibile da risolvere. Si può attenuare un attacco tramite potenziamenti<br />
dell’hardware, attraverso l’uso <strong>di</strong> load balancing e instaurando accor<strong>di</strong> con i fornitori del<br />
servizio internet ma non è possibile escludere il problema: l’aggressore potrebbe potenziarsi a<br />
sua volta oppure attaccare risorse <strong>di</strong>verse (ampiezza <strong>di</strong> banda, numero <strong>di</strong> connessioni al<br />
database, spazio su <strong>di</strong>sco, utilizzo <strong>della</strong> CPU e <strong>della</strong> memoria e così via).<br />
Come regola generale conviene limitare, a livello software, il massimo numero <strong>di</strong> risorse<br />
allocate per un singolo utente.<br />
Per gli utenti autenticati, è possibile fissare <strong>una</strong> quota in modo da poter limitare il carico<br />
massimo che un utente può applicare al sistema. In particolare, dovrebbe essere considerata la<br />
possibilità <strong>di</strong> gestire <strong>una</strong> richiesta ad utente per volta, sincronizzandosi con le sessioni degli<br />
utenti. E’ utile bloccare ogni HTTP request che viene processata da un utente nel momento in<br />
cui la richiesta <strong>di</strong> un altro utente arriva al sistema.<br />
Per gli utenti non autenticati, bisogna evitare tutti gli accessi al DB o ad altre applicazioni avide<br />
<strong>di</strong> risorse ritenute superflue. E’ consigliabile progettare l’architettura dei flussi del sito, in modo<br />
tale che un utente non autenticato non possa richiamare ness<strong>una</strong> <strong>di</strong> queste funzioni onerose dal<br />
punto <strong>di</strong> vista dell’effort sulle risorse dell’<strong>applicazione</strong>. Si potrebbe pensare <strong>di</strong> mantenere in<br />
<strong>una</strong> cache il contenuto dei dati ricevuti da utenti non autenticati invece <strong>di</strong> eseguire delle query<br />
<strong>di</strong>rettamente sul DB. Inoltre sarebbe necessario controllare le modalità con cui vengono gestiti<br />
gli errori, in modo tale da non inficiare le altre funzioni dell’<strong>applicazione</strong>.<br />
147
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
Gli eventi Web possono essere avviati da <strong>una</strong> richiesta HTTP o dal co<strong>di</strong>ce <strong>di</strong> un'<strong>applicazione</strong><br />
che genera eccezioni o eventi. La capacità del provider <strong>di</strong> eventi può essere superata a causa <strong>di</strong><br />
un elevato numero <strong>di</strong> eventi o da eventi <strong>di</strong> gran<strong>di</strong> <strong>di</strong>mensioni. Un elevato numero <strong>di</strong> eventi può<br />
causare un utilizzo eccessivo del server o dell'<strong>applicazione</strong> Asp.NET, con effetti negativi sulla<br />
<strong>gestione</strong> <strong>della</strong> memoria, sullo spazio <strong>di</strong>sponibile su <strong>di</strong>sco e sul traffico <strong>di</strong> rete.<br />
Per quanto riguarda la protezione <strong>di</strong> Talete da questo attacco, ci siamo limitati a utilizzare il<br />
comportamento predefinito <strong>di</strong> Asp.NET, grazie al quale si riduce l'esposizione dell'<strong>applicazione</strong><br />
al rischio <strong>di</strong> attacchi <strong>di</strong> tipo Denial of Service:<br />
• ASP.NET seleziona <strong>una</strong> sola istanza <strong>di</strong> un evento al minuto. La frequenza <strong>di</strong> tale<br />
limitazione è configurata nell'elemento profiles e associata agli eventi e ai provider<br />
nell'elemento rules.<br />
• La memorizzazione degli eventi nel buffer viene isolata per ciascun tipo <strong>di</strong> provider per<br />
evitare conflitti <strong>di</strong> utilizzo dello spazio nel buffer. I provider possono essere configurati<br />
in modo da utilizzare un insieme specifico <strong>di</strong> impostazioni del buffer me<strong>di</strong>ante la<br />
definizione dell'elemento bufferModes che contiene le impostazioni richieste per un<br />
determinato provider.<br />
• Per generare un evento personalizzato, è necessario <strong>di</strong>sporre <strong>di</strong> un livello <strong>di</strong> atten<strong>di</strong>bilità<br />
me<strong>di</strong>o o alto.<br />
In questo modo si possono configurare adeguatamente le impostazioni delle limitazioni e del<br />
buffer ed evitare overflow, soprattutto per gli eventi che possono essere generati da richieste<br />
HTTP. Inoltre, è possibile impostare modalità <strong>di</strong> buffer <strong>di</strong>stinte per gestire eventi <strong>di</strong> importanza<br />
<strong>di</strong>versa.<br />
148
6.11 Insecure Configuration Management<br />
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
In ultima posizione troviamo la classe <strong>di</strong> vulnerabilità ricollegabile all’errata configurazione dei<br />
web server e degli application server. Sebbene questi errori non sono strettamente legati alle<br />
applicazioni eseguite, <strong>una</strong> cattiva configurazione può mettere a repentaglio, in termini <strong>di</strong><br />
<strong>sicurezza</strong>, l’intero lavoro dello sviluppatore.<br />
Ci sono molti problemi relativi alla configurazione <strong>di</strong> un server in grado <strong>di</strong> inficiare la<br />
<strong>sicurezza</strong> <strong>di</strong> un sito:<br />
- Vulnerabilità non corrette all’interno dei software installati nel server<br />
- Vulnerabilità all’interno dei software installati nel server oppure configurazioni errate che<br />
permettono <strong>di</strong> eseguire attacchi del tipo <strong>di</strong>rectory listing e il <strong>di</strong>rectory traversal<br />
- Presenza <strong>di</strong> contenuti non necessari quali pagine <strong>di</strong> defaut, backup <strong>di</strong> dati scripts,<br />
applicazioni, file <strong>di</strong> configurazione, e pagine web<br />
- Utilizzo improprio dei permessi su file e <strong>di</strong>rectory<br />
- Attivazione <strong>di</strong> servizi non necessari inclusi sistemi <strong>di</strong> amministrazione remota e <strong>di</strong> content<br />
management<br />
- Presenza <strong>di</strong> account <strong>di</strong> default con password <strong>di</strong> default<br />
- Abilitazione <strong>di</strong> funzioni <strong>di</strong> amministrazione o <strong>di</strong> debugging<br />
- Errata <strong>gestione</strong> dei messaggi <strong>di</strong> errore da parte dell’<strong>applicazione</strong> (questo tipo <strong>di</strong> errore è<br />
analizzato con maggior dettaglio all’interno <strong>della</strong> sezione error handling)<br />
- Errata configurazione dei certificati SSL e dei settaggi relativi ai meto<strong>di</strong> <strong>di</strong> cifratura<br />
- Utilizzo <strong>di</strong> certificati utente self-signed per l’autenticazione al sito<br />
- Uso <strong>di</strong> certificati <strong>di</strong> default<br />
- Autenticazione impropria con sistemi esterni<br />
Alcuni <strong>di</strong> questi problemi possono essere rilevati utilizzando degli strumenti <strong>di</strong> scansione <strong>di</strong><br />
<strong>sicurezza</strong>. Una volta riscontrate, queste problematiche possono essere facilmente sfruttate per<br />
ottenere la totale compromissione <strong>di</strong> un sito web. Una volta che l’attacco è andato a buon fine è<br />
possibile compromettere anche i sistemi collocati nel back end (ad esempio database e la<br />
Intranet aziendale). In conclusione, al fine <strong>di</strong> mantenere un web server “sicuro” è necessario<br />
149
CAPITOLO VI - Gli attacchi e il progetto OWASP<br />
tenere aggiornato il software allo stato dell’arte dal punto <strong>di</strong> vista delle patch, e avere <strong>una</strong><br />
configurazione sicura dei software installati sul server in esercizio.<br />
Da questo breve elenco risulta quin<strong>di</strong> evidente come sia in<strong>di</strong>spensabile curare la messa in opera<br />
dell’ambiente <strong>di</strong> fruizione. La <strong>sicurezza</strong> <strong>di</strong> un sistema è determinata dalla <strong>sicurezza</strong><br />
dell’elemento più debole: trascurare anche un solo aspetto può determinare la per<strong>di</strong>ta dei nostri<br />
dati o <strong>della</strong> nostra riservatezza.<br />
150
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong><br />
Talete<br />
151
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
7.1 Gli strumenti per la <strong>sicurezza</strong> delle web applications<br />
La parola au<strong>di</strong>ting identifica il processo attraverso il quale si verifica che certi requisiti e<br />
standard all’interno del software siano stati raggiunti, identificando eventualmente le aree che<br />
necessitano <strong>di</strong> mo<strong>di</strong>fiche e miglioramenti.<br />
Il tema dell’in<strong>di</strong>viduazione <strong>di</strong> falle <strong>di</strong> <strong>sicurezza</strong> è attuale oltre che estremamente interessante<br />
per i risvolti economici <strong>di</strong> tale attività: determinare e correggere gli errori software prima che<br />
l’<strong>applicazione</strong> sia effettivamente in produzione, permette <strong>di</strong> evitare ulteriori costi, ritar<strong>di</strong> sullo<br />
sviluppo e <strong>di</strong>sagi per gli utenti. Il problema <strong>della</strong> ricerca <strong>di</strong> vulnerabilità nelle applicazioni web<br />
trova prevalentemente soluzione in ambito commerciale, anche se esistono tool open source e<br />
progetti <strong>di</strong> ricerca in ambito universitario.<br />
È importare sottolineare come questi strumenti software sono solamente un tentativo <strong>di</strong><br />
soluzione <strong>di</strong> un problema complesso e con forte mutabilità: molte <strong>di</strong> queste applicazioni<br />
lavorano in maniera automatica cercando casi noti <strong>di</strong> vulnerabilità, mettendo quin<strong>di</strong> in campo<br />
<strong>una</strong> vasta base <strong>di</strong> conoscenza piuttosto che un vero e proprio riconoscimento automatico.<br />
Oltre a <strong>di</strong>stinguere gli strumenti tra online e offline, gli esperti utilizzano spesso <strong>una</strong><br />
categorizzazione basata sull’interazione umana necessaria allo svolgimento dell’attività: si<br />
parla quin<strong>di</strong> <strong>di</strong> strumenti automatici, semi-automatici o manuali. Come in tutte le attività che<br />
richiedono <strong>una</strong> forte componente d’intuito, intelligenza ed astuzia, l’uomo supera<br />
brillantemente la macchina: l’au<strong>di</strong>ting svolto da personale competente è un’attività<br />
insostituibile se si vuole garantire la <strong>sicurezza</strong> dei propri applicativi.<br />
Per la scelta degli strumenti automatici da adoperare è necessario, in primo luogo, identificare<br />
le tecnologie utilizzate e scegliere i tool più adatti al contesto applicativo; spesso però ci sono<br />
anche aspetti che si allontanano dalle considerazioni puramente tecniche come la <strong>di</strong>sponibilità<br />
o meno del co<strong>di</strong>ce sorgente, l’assoluta necessità <strong>di</strong> testare il software sull’ambiente finale <strong>di</strong><br />
deploy, <strong>di</strong> effettuare la revisione in <strong>di</strong>verse fasi del processo produttivo dell’applicativo stesse e<br />
cosi via. Parlando <strong>di</strong> strumenti per l’<strong>analisi</strong> e la scansione <strong>di</strong> web applications, sono state<br />
analizzate <strong>di</strong>verse metodologie usate dagli strumenti software.<br />
152
7.1.1 Analisi del co<strong>di</strong>ce sorgente<br />
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
Si parla <strong>di</strong> analizzatori <strong>di</strong> co<strong>di</strong>ce sorgente quando lo strumento utilizza, all’interno del processo<br />
<strong>di</strong> <strong>analisi</strong>, il co<strong>di</strong>ce sorgente dell’<strong>applicazione</strong>. Gli strumenti appartenenti a questa categoria<br />
(revisione statica) si basano principalmente sulla ricerca <strong>di</strong> pattern all’interno del co<strong>di</strong>ce<br />
sorgente al fine <strong>di</strong> identificare modelli <strong>di</strong> programmazione errati, che possono quin<strong>di</strong> introdurre<br />
problemi <strong>di</strong> <strong>sicurezza</strong>. Nei casi più semplici questi software ricercano sistematicamente ogni<br />
occorrenza <strong>di</strong> funzioni potenzialmente pericolose al fine <strong>di</strong> segnalare al tester tutti quei casi <strong>di</strong><br />
potenziale pericolo; è intuibile come questi software sono spesso inutilizzabili durante il testing<br />
<strong>di</strong> grosse applicazioni poiché la generazione <strong>di</strong> falsi positivi è troppo elevata. Molti degli<br />
strumenti avanzati cercano <strong>di</strong> ridurre significativamente il numero dei falsi positivi attraverso<br />
l’<strong>analisi</strong> del flusso <strong>di</strong> dati all’interno del co<strong>di</strong>ce (dataflow analysis).<br />
A <strong>di</strong>fferenza dei precedenti, gli analizzatori che effettuano revisione <strong>di</strong>namica attuano<br />
un’<strong>analisi</strong> in profon<strong>di</strong>tà nel co<strong>di</strong>ce sorgente cercando <strong>di</strong> ricostruire lo stack delle chiamate a<br />
runtime, determinando se la specifica invocazione viene effettivamente raggiunta dai dati<br />
ricevuti in ingresso; il principale problema <strong>di</strong> questa classe <strong>di</strong> strumenti è legato alla lentezza<br />
<strong>della</strong> scansione e alla necessità <strong>di</strong> fornire un set significativo <strong>di</strong> dati in ingresso.<br />
In generale gli analizzatori <strong>di</strong> co<strong>di</strong>ce sorgente, sia statici che <strong>di</strong>namici, risultano degli strumenti<br />
estremamente interessanti in quanto possono essere utilizzati sin dai primi momenti dello<br />
sviluppo del software, riducendo notevolmente i costi del processo produttivo<br />
7.1.2 Black-box scanner<br />
Con questo termine si identificano invece quegli scanner per applicazioni web che simulano la<br />
normale interazione tra web browser e server remoto cercando componenti con vulnerabilità<br />
153
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
note oppure effettuando l’invio <strong>di</strong> payload ritenuti potenzialmente pericolosi. L’efficacia <strong>di</strong><br />
questi strumenti è ovviamente legata alla base <strong>di</strong> conoscenza: più questa risulta aggiornata e<br />
personalizzata, migliori saranno i risultati. Generalmente questi software sono molto semplici<br />
da utilizzare poiché non richiedono ness<strong>una</strong> interazione da parte dell’utente. L’atten<strong>di</strong>bilità dei<br />
report finali <strong>di</strong>pende notevolmente dal genere <strong>di</strong> <strong>applicazione</strong> che si sta testando: mentre i siti<br />
web statici sono facilmente analizzabili dagli spider usati all’interno <strong>di</strong> questi tool, non si può<br />
<strong>di</strong>re lo stesso per le applicazioni che fanno largo uso <strong>di</strong> JavaScript, Ajax, Flash, form <strong>di</strong><br />
autenticazione e percorsi <strong>di</strong> navigazione che richiedono <strong>una</strong> costante interazione con l’utente.<br />
Purtroppo, per la natura stessa dell’<strong>analisi</strong>, è impossibile identificare precisamente dove<br />
effettivamente risiedono gli errori segnalati, lasciando agli sviluppatori l’ingrato compito <strong>di</strong><br />
scovare tali bug all’interno del co<strong>di</strong>ce.<br />
7.1.3 Altri strumenti<br />
Oltre alle categorie segnalate esistono certamente altre tipologie <strong>di</strong> strumenti: gli strumenti <strong>di</strong><br />
<strong>analisi</strong> su dati binari cercano <strong>di</strong> scovare falle <strong>di</strong> <strong>sicurezza</strong> all’interno <strong>di</strong> applicativi binari<br />
prevalentemente in C e C++; i database scanner replicano l’interazione tra client e server SQL<br />
in maniera da poter inviare delle query per testare la configurazione dei DBMS (procedure,<br />
utenti, ruoli, privilegi) oltre ad effettuare l’invio <strong>di</strong> classiche stringhe riconducibili a potenziali<br />
attacchi <strong>di</strong> SQL Injection; i configuration scanner operano dei test sulle configurazioni <strong>di</strong> web<br />
applications e web server per segnalare configurazioni erronee o impostazioni <strong>di</strong> default<br />
pericolose.<br />
154
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
Strumenti come quelli presentati <strong>di</strong> seguito possono però affiancare l’esperto nello svolgimento<br />
dell’au<strong>di</strong>ting, oltre ad assistere gli sviluppatori nelle fasi iniziali del progetto al fine <strong>di</strong><br />
determinare gli errori più banali.<br />
Il tool usato è un prodotto commerciale dell’azienda Acunetix chiamato Web Vulnerabilty<br />
Scanner che ricerca comuni vulnerabilità che affliggono i web server ed a livello applicativo<br />
simula situazioni <strong>di</strong> attacco alla ricerca <strong>di</strong> falle <strong>di</strong> <strong>sicurezza</strong>. Permette l’<strong>analisi</strong> delle <strong>di</strong>eci<br />
vulnerabilità critiche in<strong>di</strong>viduate da OWASP oltre a numerose altre; interessante il supporto<br />
legato alle nuove tecnologie del web (XML/SOAP Test, XPath Injection) e la buona capacità <strong>di</strong><br />
riconoscimento <strong>di</strong> XSS.<br />
7.2 “Web Vulnerability Scanner”<br />
Prima <strong>di</strong> iniziare la scansione col WVS è presente uno scan wizard che ci permette <strong>di</strong>:<br />
• Selezionare il target<br />
155
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
Figura 70 WVS: target e tecnologia da testare<br />
• Definire le opzioni <strong>di</strong> scansione: in questa fase si può decidere la modalità <strong>di</strong> scansione ed il<br />
grado <strong>di</strong> completezza che si desidera; con il profilo default si effettua <strong>una</strong> scansione<br />
completa mantenendo comunque un rapporto velocità del test/qualità dei risultati<br />
accettabile.<br />
156
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
Figura 71 WVS: opzioni <strong>di</strong> scansione<br />
• Configurare il login: poiché spesso le applicazioni web prevedono dei flussi <strong>di</strong> navigazione<br />
prefissati, oltre a sezioni che richiedono l’autenticazione attiva dell’utente, con Web<br />
Vulnerability Scanner è possibile impostare l’account nel caso <strong>di</strong> autenticazione HTTP<br />
(Basic o NTLM) ma anche nel caso <strong>di</strong> login applicativi (i classici web form con username e<br />
password); per quest’ultimo meccanismo <strong>di</strong> autenticazione lo strumento permette <strong>di</strong><br />
"registrare" <strong>una</strong> navigazione manuale dell’utente, che verrà ripetuta automaticamente<br />
durante i successivi test. In questo modo, lo strumento possiede tutte le informazioni per<br />
accedere in maniera automatizzata attraverso tutte le sezioni dell’<strong>applicazione</strong> web.<br />
Avendo terminato la fase <strong>di</strong> setup è unicamente necessario cliccare sul pulsante Finish per<br />
avviare la scansione. Dopo un po’ <strong>di</strong> tempo (256 minuti, per la precisione) e dopo oltre 15000<br />
richieste HTTP è possibile visionare i risultati del test: solo 10 vulnerabilità scoperte e <strong>di</strong> tipo<br />
157
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
broken links, che non sono <strong>una</strong> minaccia vera e propria, ma in<strong>di</strong>cano solo che non è possibile<br />
raggiungere quell’in<strong>di</strong>rizzo, che nel nostro caso è quello dei RadControls <strong>della</strong> Telerik.<br />
Figura 72 Risultati <strong>della</strong> scansione con WVS<br />
I risultati sono riportati in maniera molto chiara ed è facile, anche per l’utente inesperto, capire<br />
lo stato "<strong>di</strong> salute" <strong>della</strong> propria <strong>applicazione</strong> online, che nel caso <strong>di</strong> Talete è ottimo in quanto,<br />
come è possibile vedere dalla figura, il threat level è “Low”.<br />
Un comodo in<strong>di</strong>catore colorato fornisce un riassunto generale dell’<strong>analisi</strong>, presentando il<br />
numero <strong>di</strong> vulnerabilità <strong>di</strong>vise in base alla gravità. Un albero <strong>della</strong> struttura del sito e delle<br />
vulnerabilità evidenziate permette poi <strong>di</strong> visionare singolarmente ogni test effettuato.<br />
Da segnalare sicuramente la comoda funzionalità per l’aggiornamento <strong>della</strong> base <strong>di</strong><br />
conoscenza dello strumento stesso, in maniera da rimanere al passo con le ultime vulnerabilità<br />
scoperte e le più recenti tecniche <strong>di</strong> attacco.<br />
Tutte le firme delle vulnerabilità sono completamente consultabili; l’utente curioso può quin<strong>di</strong><br />
facilmente capire che tipo <strong>di</strong> richieste vengono effettuate e quali risposte si attendono nel caso<br />
<strong>di</strong> pagine vulnerabili.<br />
158
CAPITOLO VII - Test per valutare la <strong>sicurezza</strong> <strong>di</strong> Talete<br />
Interessante è anche il generatore <strong>di</strong> report, con il quale è possibile creare velocemente e<br />
facilmente dei report professionali che specificano le vulnerabilità identificate e suggeriscono<br />
cosa può essere fatto per eliminarle.<br />
159
Conclusioni e sviluppi futuri<br />
In questa tesi, inizialmente è stato implementato il sistema <strong>di</strong> autenticazione <strong>della</strong> piattaforma<br />
Talete, che è un’<strong>applicazione</strong> Asp.NET per l’erogazione <strong>di</strong> servizi <strong>di</strong> consulenza alle imprese;<br />
in altre parole è stato gestito il meccanismo <strong>di</strong> accesso all’<strong>applicazione</strong>. Considerando le pagine<br />
relative all’amministrazione <strong>di</strong> Talete, sono state analizzate attentamente le varie tipologie <strong>di</strong><br />
utenti che accedono alla piattaforma e, in base alla categoria <strong>di</strong> appartenenza, sono state<br />
assegnate le giuste autorizzazioni. Quin<strong>di</strong> l’amministratore può compiere qualsiasi azione sia<br />
in lettura (quin<strong>di</strong> può visualizzare tutti i dati) che in scrittura; il proprietario può visualizzare i<br />
dati e gli utenti relativi alla sua organizzazione e può mo<strong>di</strong>ficarli, e cosi via per tutte le altre<br />
categorie <strong>di</strong> utenti. L’accesso alla piattaforma è permesso solo ad utenti autenticati. Sono stati<br />
seguiti i passi previsti dalla “Ingegneria del software”, progettando il meccanismo <strong>di</strong><br />
autorizzazione con l’ausilio <strong>di</strong> alcuni <strong>di</strong>agrammi UML come quello dei casi d’uso e delle classi.<br />
In seguito è stato gestito l’accesso alle varie aree (CdG, Qualità, Ambiente, ecc) e applicazioni<br />
<strong>di</strong> Talete creando la pagina delle Autorizzazioni, che permette al proprietario <strong>di</strong><br />
un’organizzazione e ovviamente all’amministratore, <strong>di</strong> assegnare i permessi ai propri utenti,<br />
“spuntando” le caselle opportune nell’albero che mostra tutte le zone e le pagine <strong>di</strong> Talete.<br />
L’ultima fase del ciclo <strong>di</strong> vita <strong>di</strong> un software prevede il testing delle parti sviluppate, che in<br />
questo lavoro è stato attuato con la tecnica del black-box testing con cui è stata effettuata<br />
un’<strong>analisi</strong> del comportamento del software basandosi sui risultati degli output ottenuti<br />
eseguendo moduli con degli input prestabiliti. Fondamentale, per lo sviluppo e i miglioramenti<br />
del co<strong>di</strong>ce relativo alle autorizzazioni, è stato il Beta testing, in cui il sistema è stato fornito ad<br />
alcuni potenziali utenti che hanno accettato <strong>di</strong> usarlo per riportare eventuali problemi;<br />
ovviamente il Beta testing ha comportato la mo<strong>di</strong>fica del sistema e l’aggiunta <strong>di</strong> ottimizzazioni<br />
alla nostra piattaforma. Nell’implementazione del nostro software, fondamentale è la presenza<br />
dei design pattern che forniscono soluzioni riutilizzabili nel progetto senza dover ogni volta<br />
partire da zero per risolvere uno specifico problema; quelli da me usati sono l’abstract factory,<br />
il builder e il template method. Nella seconda parte del lavoro, sono state analizzate tutte le<br />
160
vulnerabilità critiche <strong>di</strong> applicazioni <strong>di</strong> questo tipo; in particolare sono state esaminate le<br />
vulnerabilità <strong>della</strong> piattaforma Talete seguendo le linee guida owasp 2.0, e i problemi che<br />
potrebbero nascere da <strong>una</strong> progettazione non sicura <strong>di</strong> <strong>una</strong> web application e quin<strong>di</strong> dalla sua<br />
architettura. Per fare questo, è stato usato un tool <strong>di</strong> Microsoft, il “Threat Analysis &<br />
Modeling”, grazie al quale è stata effettuata la mo<strong>della</strong>zione delle minacce; attraverso i reports<br />
<strong>di</strong> questo strumento sono state in<strong>di</strong>viduate tutte le possibili vulnerabilità dell’architettura <strong>di</strong><br />
Talete. Infine, dopo aver adottato tutte le eventuali contromisure agli attacchi e alle<br />
vulnerabilità segnalate, sono stati effettuati dei test con un software che ricerca vulnerabilità<br />
nelle web applications, il “Web Vulnerability Scanner”; i report del WVS hanno evidenziato<br />
che Talete è <strong>una</strong> piattaforma sicura.<br />
Per concludere va detto che la <strong>sicurezza</strong> assoluta non esiste, cosi come non esiste ad esempio la<br />
qualità totale, ma è un qualcosa a cui si può tendere e si deve farlo non applicando <strong>una</strong> tecnica,<br />
poi un’altra e cosi via (criptare i cookie, i parameters), ma creando un percorso a livello<br />
architetturale puntando i fari su ogni punto del ciclo <strong>di</strong> vita del software, come visto con la<br />
SDL <strong>di</strong> Microsoft, e considerando che:<br />
1 un livello <strong>di</strong> <strong>sicurezza</strong> del 100% non è raggiungibile, e comunque <strong>una</strong> strategia in merito<br />
alla <strong>sicurezza</strong> coinvolge <strong>di</strong>versi processi complessi e non tutti <strong>di</strong> tipo tecnico nel senso<br />
classico del termine.<br />
2 Le organizzazioni devono avere la convinzione <strong>di</strong> cercare <strong>di</strong> raggiungere un certo grado<br />
<strong>di</strong> <strong>sicurezza</strong> e protezione delle applicazioni software.<br />
3 Le aziende devono provvedere alla formazione degli operatori sin dai livelli più bassi.<br />
Inoltre nel corso del lavoro, abbiamo visto come nell’ultimo periodo sono stati molti gli<br />
incidenti <strong>di</strong> <strong>sicurezza</strong> informatica causati da co<strong>di</strong>ce mal scritto in applicazioni Web 2.0. Quin<strong>di</strong><br />
un ulteriore passo avanti potrebbe essere quello <strong>di</strong> potenziare le tecniche automatizzate o<br />
manuali <strong>di</strong> scansione con soli<strong>di</strong> meccanismi <strong>di</strong> in<strong>di</strong>viduazione degli errori che potrebbero<br />
intaccare il DOM lato client. Potrebbe essere <strong>una</strong> vera e propria sfida mettere in atto scansioni<br />
completamente automatiche per applicazioni Web 2.0, cosa che potrebbe essere risolta usando<br />
161
tecniche automatiche in combinazione con l’intelligenza dell’uomo. Inoltre il controllo delle<br />
applicazioni Web 2.0 deve essere eseguito con attenzione per scoprire possibili attacchi lato<br />
client e per mitigare il rischio sui sistemi degli utenti.<br />
Infine si può considerare il problema <strong>della</strong> <strong>sicurezza</strong> da un punto <strong>di</strong> vista manageriale: si può<br />
ipotizzare a tal fine che il livello <strong>di</strong> <strong>sicurezza</strong> da preventivare <strong>di</strong>penda solo dal valore dei dati,<br />
trascurando altri fattori <strong>di</strong> per se minori. Innanzitutto si deve tenere in considerazione che un<br />
eccessivo livello <strong>di</strong> <strong>sicurezza</strong> rende il prodotto finale poco usabile: basti immaginare il caso in<br />
cui un login richieda tre password, oppure l’inserimento <strong>di</strong> un co<strong>di</strong>ce <strong>di</strong> controllo ogni quarto<br />
d’ora.<br />
Si possono dare per scontate le basilari regole dell’ingegneria del software per cui apportare<br />
delle mo<strong>di</strong>fiche al progetto in fase <strong>di</strong> sviluppo implica un costo che non è trascurabile.<br />
Affrontando un progetto per la realizzazione <strong>di</strong> un servizio basato su tecnologia Internet, sono<br />
<strong>di</strong> primaria importanza l’<strong>analisi</strong> <strong>della</strong> riservatezza delle informazioni trattate e l’identificazione<br />
<strong>di</strong> quale sia il corretto livello <strong>di</strong> <strong>sicurezza</strong> da realizzare. Chiaramente, il costo dell’infrastruttura<br />
<strong>di</strong> <strong>sicurezza</strong> è intimamente legato al livello <strong>di</strong> affidabilità che si vuole raggiungere; dare<br />
specifiche <strong>di</strong> tutela troppo stringenti se comparate alla riservatezza dei dati contenuti nel<br />
sistema può comportare uno spreco <strong>di</strong> risorse superiore al danno potenziale del furto delle<br />
informazioni stesse. E’ quin<strong>di</strong> sempre necessario relazionare lo sforzo economico previsto con<br />
il potenziale danno giungendo al giusto compromesso.<br />
Per quanto riguarda Talete, i passi successivi da compiere a breve termine nell’ambito <strong>della</strong><br />
<strong>sicurezza</strong> sono <strong>di</strong>versi:<br />
• innanzitutto c’è bisogno <strong>di</strong> proteggere la macchina windows su cui gira il server virtuale,<br />
per evitare intrusioni da parte <strong>di</strong> utenti non autorizzati.<br />
• C’è bisogno <strong>di</strong> ottimizzare il co<strong>di</strong>ce, che in alcuni punti risulta poco leggibile e<br />
“<strong>di</strong>spen<strong>di</strong>oso” dal punto <strong>di</strong> vista del tempo <strong>di</strong> visualizzazione delle pagine, e delle risorse<br />
(come il db).<br />
162
• Aggiungere la tecnologia SSL e acquistare un certificato per proteggere le credenziali<br />
inserite dagli utenti al momento del login.<br />
• Perfezionare la pagina delle Autorizzazioni <strong>di</strong>stinguendo i permessi da assegnare agli utenti<br />
per le varie aree e applicazioni in due categorie: sola lettura (R) o lettura e scrittura (RW).<br />
• Infine si potrebbero testare parti <strong>di</strong> co<strong>di</strong>ce con la tecnica del white box testing, basato sulla<br />
nozione <strong>di</strong> copertura, cioè sull’esecuzione <strong>di</strong> elementi del grafo <strong>di</strong> controllo <strong>di</strong> un<br />
programma. Il white-box testing e il black-box testing da noi usato sono complementari in<br />
quanto quest’ultimo permette <strong>di</strong> testare le funzionalità del software ignorando il flusso <strong>di</strong><br />
manipolazione delle strutture dati e delle variabili utilizzate, mentre il white-box testing<br />
permette <strong>di</strong> analizzare le strutture dati interne e la copertura del co<strong>di</strong>ce testato. Il co<strong>di</strong>ce è<br />
rappresentato, infatti, tramite un grafo, il grafo del flusso <strong>di</strong> controllo (Control flow Graph ),<br />
i cui no<strong>di</strong> rappresentano statement (istruzioni e/o pre<strong>di</strong>cati) del programma e gli archi il<br />
passaggio del flusso <strong>di</strong> controllo. Il grafo è esaminato per identificare ramificazioni del<br />
flusso <strong>di</strong> controllo e verificare l’esistenza <strong>di</strong> eventuali anomalie quali co<strong>di</strong>ce irraggiungibile<br />
e non strutturazione.<br />
In letteratura esistono numerosi criteri <strong>di</strong> copertura del co<strong>di</strong>ce per i test strutturali, come<br />
quello dei coman<strong>di</strong>, delle decisioni, delle con<strong>di</strong>zioni e dei cammini.<br />
163
Ringraziamenti<br />
I miei ringraziamenti sono rivolti a tutti coloro che mi hanno aiutato durante la carriera<br />
universitaria giunta ormai al termine.<br />
Desidero iniziare i miei ringraziamenti con il professor Aldo Franco Dragoni, che mi ha dato la<br />
preziosa opportunità <strong>di</strong> svolgere questo lavoro <strong>di</strong> tesi in un ambiente motivante com’è quello<br />
dell’Equipe.<br />
Un grazie <strong>di</strong> cuore va a tutti i ragazzi dell’Equipe e all’ing. Gregorio Paccone, per avermi<br />
“ospitato” nella sua azienda e per aver instaurato con me un rapporto collaborativo che<br />
sicuramente mi aiuterà a crescere nel mondo del lavoro.<br />
Un sentito ringraziamento va all’ing. Mauro Mazzieri che ha seguito l’evolversi <strong>di</strong> questo<br />
lavoro e che è stato <strong>una</strong> presenza costante e preziosa sia dal punto <strong>di</strong> vista professionale che dal<br />
punto <strong>di</strong> vista umano; grazie per l’infinita pazienza, è bello lavorare con persone così.<br />
Francesca, non so come hai fatto a sopportarmi senza picchiarmi. Grazie per l’amorevole<br />
sostegno con cui mi hai accompagnato in questo periodo così impegnativo; avere accanto <strong>una</strong><br />
persona come te rende tutto più bello e più facile. La tua dolcezza durante questi anni<br />
universitari è stata un aiuto costante a cui è ormai impossibile rinunciare, anzi. Ti ringrazio<br />
anche perché, a volte, mi ricor<strong>di</strong> che lo stu<strong>di</strong>o è solo <strong>una</strong> parte <strong>della</strong> mia vita, fatta <strong>di</strong> tante altre<br />
cose speciali, come te.<br />
Grazie ai miei genitori, per aver apprezzato sempre il mio operato durante tutta la mia<br />
esperienza accademica, senza mai rimproverarmi o scoraggiarmi anche in momenti più bui, ma<br />
sostenendomi sempre con l’affetto e la passione che solo <strong>una</strong> mamma e un papà cosi sanno<br />
dare. Vi voglio bene, non avrei potuto desiderare genitori migliori.<br />
Una persona a cui son tanto legato è la mia sorellina Grazia, a cui auguro <strong>di</strong> raggiungere<br />
traguar<strong>di</strong> importanti che gli <strong>di</strong>ano slancio per <strong>una</strong> carriera fantastica; sorellina, i sacrifici alla<br />
fine danno sempre i loro frutti.<br />
Un enorme grazie va a tutti i miei coinquilini con cui ho vissuto nel corso del periodo<br />
universitario, da quelli <strong>della</strong> ex A13 a Marco e Domenico, a Peppe e l’ascolano, e infine<br />
Pierpaolo e Daniele.
Durante questi anni universitari sono tante le persone che ho incontrato e conosciuto; alcune<br />
sono per me un punto <strong>di</strong> riferimento, ottimi consiglieri, altre fondamentali nel gioco, nelle<br />
serate <strong>di</strong> <strong>di</strong>vertimento. Tra tutti voglio citare Pepe, “quelli <strong>di</strong> via Camerano” Nazario, Pitch,<br />
Mitch, Raffaele e Save, che un giorno impareranno anche a giocare a PES cosi come Mangini e<br />
quelli <strong>della</strong> A13....<br />
Un grazie agli “amici <strong>di</strong> giù” Marco, Giovanni, Matteo, Michele (u pallon) e Andrea che,<br />
quando torno a casa, mi ricordano che anche a San Nicandro ho degli amici su cui posso<br />
sempre contare.<br />
Infine un “saluto” va a mio nonno: anche se il tempo passa, tu resterai sempre nel mio cuore, e<br />
alla mia nonnina Grazia che sicuramente sarà tanto felice <strong>di</strong> vedere il suo nipote preferito<br />
(scusa sorellina) con la laurea in mano.
BIBLIOGRAFIA<br />
G. Naccarato, M. Valeri, “C# guida alla programmazione”, E<strong>di</strong>zioni Master, 2004<br />
Atzeni, Ceri, Paraboschi, Torlone, “Basi <strong>di</strong> dati”, McGrawHill, 1999<br />
Spalazzi L, Slide corso “Ingegneria del software” Unified Modeling Language, Ancona<br />
2004/05.<br />
M. MacDonald, “Beginning ASP.NET 2.0 in C# 2005: From Novice to Professional”, Apress,<br />
2006<br />
G. Andrew Duthie, “Microsoft ASP.NET Programming with Microsoft Visual C# .NET<br />
Version 2003 Step by Step”, Microsoft Press, 2003<br />
M. Howard, D. LeBlanc, “Writing secure code (Second E<strong>di</strong>tion)”, Microsoft Press, 2003<br />
E. Gamma, R. Helm, R. Johnson, J. Vlissides, “Design Patterns: Elements of Reusable<br />
Object-Oriented Software”, Ad<strong>di</strong>son-Wesley Publishing Company, 1998
M. Fowler, D. Rice, M. Foemmel, E. Hieatt, R. Mee, R. Stafford, “Patterns of Enterprise<br />
Application Architecture ”, Ad<strong>di</strong>son Wesley, 2002<br />
C. Skibo M. Young, B Johnson, “Working with Microsoft Visual Stu<strong>di</strong>o 2005”, Microsoft<br />
Press 2006<br />
SITI WEB<br />
http://msdn2.microsoft.com/en-us/security/aa570413.aspx<br />
http://naufraghi.free.fr/php/top10security.php<br />
http://<strong>sicurezza</strong>.html.it<br />
http://www.acunetix.com/vulnerability-scanner/<br />
http://www.asp.net/<br />
http://www.cert.org
http://ajax.asp.net/<br />
http://www.mysql.com<br />
http://www.owasp.org<br />
http://www.deit.univpm.it/~dragoni/presentazioni/Talk_SD_HTML/index.html<br />
DOCUMENTAZIONE ELETTRONICA<br />
- Microsoft .NET Framework 2.0 SDK Documentation<br />
- Microsoft Visual Stu<strong>di</strong>o 2005 Documentation<br />
- Telerik RadControls for Asp.NET 2.x Documentation