02.06.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!