Metodologie di autocongurazione,integrazione e testing di sistemi in
Transcript
Metodologie di autocongurazione,integrazione e testing di sistemi in
Università degli Studi di Firenze Dipartimento di Elettronica e Telecomunicazioni Dottorato di Ricerca in Ingegneria Informatica, Multimedialità e Telecomunicazioni XXIII Ciclo Metodologie di autoconfigurazione, integrazione e testing di sistemi in reti wireless per applicazioni critiche Tesi di Ing. Matteo Rosi Coordinatore: Prof. Giacomo Bucci Tutori: Prof. Romano Fantacci Ing. Laura Pierucci Anno Accademico 2009/2010 Indice Elenco delle figure v Elenco delle tabelle ix Pubblicazioni xi Introduzione I xiii Rete MANET autoformante ed integrazione con lo standard TETRA-DMO 1 1 CADAE: Channel Assignment DAEmon 3 1.1 La generazione automatica della rete MANET . . . . . . . . . 4 1.2 Il problema del interference detection . . . . . . . . . . . . . . 7 1.2.1 8 1.3 Assegnazione dei canali basato su una topologia ad albero Sviluppo demone CADAE . . . . . . . . . . . . . . . . . . . . 21 1.3.1 Macchina a stati . . . . . . . . . . . . . . . . . . . . . 23 1.3.2 Risultati prestazionali . . . . . . . . . . . . . . . . . . 24 2 TWNET: Tetra Wireless NETwork 2.1 27 Lo standard Tetra . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.1.1 Architettura DMO . . . . . . . . . . . . . . . . . . . . 31 i ii Indice 2.2 2.1.2 Canale a trama temporale . . . . . . . . . . . . . . . . 34 2.1.3 Indirizzi ed identità . . . . . . . . . . . . . . . . . . . . 35 2.1.4 Scenari di servizio TETRA DMO . . . . . . . . . . . . 37 2.1.5 La sicurezza nel Tetra DMO . . . . . . . . . . . . . . . 75 Integrazione rete Tetra DMO con rete wireless mesh . . . . . . 80 2.2.1 Elementi costitutivi la rete TWNET . . . . . . . . . . 82 2.2.2 Soluzione integrata Tetra/IP . . . . . . . . . . . . . . . 84 2.2.3 Nodo TWNET . . . . . . . . . . . . . . . . . . . . . . 86 2.2.4 Sviluppo software di intercomunicazione Pe2Ne: Pei to Network . . . . . . . . . . . . . . . . . . . . . . . . . . 91 2.3 II Risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Testing funzionale per la sicurezza dell’implemen- tazione di protocolli di rete 3 S.T.R.E.S.S. 3.1 3.2 3.3 125 Black-Box Testing . . . . . . . . . . . . . . . . . . . . . . . . . 126 3.1.1 Concetti di base . . . . . . . . . . . . . . . . . . . . . . 128 3.1.2 Testing per la sicurezza del software . . . . . . . . . . . 132 3.1.3 Tecnologie di Black-box testing e stato dell’arte . . . . 134 3.1.4 Stato dell’arte degli strumenti esistenti . . . . . . . . . 143 Sviluppo piattaforma S.T.R.E.S.S. . . . . . . . . . . . . . . . . 149 3.2.1 Generalità dei protocolli utilizzabili . . . . . . . . . . . 151 3.2.2 Componenti principali . . . . . . . . . . . . . . . . . . 164 Utilizzo della piattaforma . . . . . . . . . . . . . . . . . . . . 188 3.3.1 3.4 123 CLI: command line interface . . . . . . . . . . . . . . . 193 Risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Indice 3.5 iii 3.4.1 SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 3.4.2 DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 3.4.3 XMPP . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Sviluppi Futuri . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Conclusioni 205 Appendices 209 Definizione di ABNF in ABNF 211 Bibliografia 215 iv Indice Elenco delle figure 1.1 Primo grafo di esempio . . . . . . . . . . . . . . . . . . . . . . 10 1.2 Secondo grafo di esempio . . . . . . . . . . . . . . . . . . . . . 11 1.3 Terzo grafo di esempio . . . . . . . . . . . . . . . . . . . . . . 11 1.4 Profondità media dell’albero per blocchi di 200 simulazioni con numero di nodi variabili in area 300x300 . . . . . . . . . . . . 18 1.5 Profondità media dell’albero per blocchi di 200 simulazioni con numero di nodi variabili in area 400x400 . . . . . . . . . . . . 18 1.6 Numero di ripetizioni di canali, con scenario 300x300 al variare del numero di nodi. . . . . . . . . . . . . . . . . . . . . . . . . 19 1.7 Numero di ripetizioni di canali, con scenario 400x400 al variare del numero di nodi. . . . . . . . . . . . . . . . . . . . . . . . . 19 1.8 Metri quadri della zona di interferenza in un’area 300x300. . . 20 1.9 Metri quadri della zona di interferenza in un’area 400x400. . . 20 1.10 State machine dell’algoritmo implementato . . . . . . . . . . . 22 1.11 Caso di ricostruzione dell’albero . . . . . . . . . . . . . . . . . 26 2.1 Struttura della trama temporale nel set-up di una chiamata senza presence check tramite repeater . . . . . . . . . . . . . . 41 2.2 Call setup senza presence check . . . . . . . . . . . . . . . . . 43 v vi ELENCO DELLE FIGURE 2.3 Struttura della trama temporale nel set-up di una chiamata con presence check tramite repeater . . . . . . . . . . . . . . . 45 2.4 Call setup con presence check . . . . . . . . . . . . . . . . . . 47 2.5 Struttura temporale set-up chiamata di gruppo tramite DMGATEway . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.6 Sequenza degli scambi di PDU nel set-up della chiamata . . . 50 2.7 Diagramma temporale della segnalazione di set-up di chiamata con DM-GATE . . . . . . . . . . . . . . . . . . . . . . . . . . 52 2.8 Struttura temporale set-up chiamata di gruppo tramite DMGATEway . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.9 Occupazione slot durante una chiamata in DMO . . . . . . . . 54 2.10 Occupazione trama temporale durante pre-emption con la presenza di DM-Repeater . . . . . . . . . . . . . . . . . . . . . . 55 2.11 Occupazione trama temporale durante la richiesta di pre-emption con DM-GATEway . . . . . . . . . . . . . . . . . . . . . . . . 58 2.12 Scambio di messaggi durante la pre-emption al livello DMCC . 59 2.13 Scambio di messaggi durante la pre-emption al livello DMCC in presenza di DM-GATEway . . . . . . . . . . . . . . . . . . 60 2.14 Occupazione trama temporale durante una richiesta di changeover 61 2.15 Occupazione trama temporale durante una richiesta di changeover in chiamate di gruppo . . . . . . . . . . . . . . . . . . . . . . 63 2.16 Occupazione trama temporale durante una richiesta di changeover in presenza di DM-REPeater . . . . . . . . . . . . . . . . . . . 63 2.17 Occupazione trama temporale durante una richiesta di changeover in presenza di DM-GATEway . . . . . . . . . . . . . . . . . . 66 2.18 Scambio di messaggi durante changeover al livello DMCC . . . 67 ELENCO DELLE FIGURE vii 2.19 Scambio di messaggi durante changeover al livello DMCC in presenza di DM-GATEway . . . . . . . . . . . . . . . . . . . . 68 2.20 Occupazione della trama per l’invio di un SDS . . . . . . . . . 71 2.21 Occupazione della trama per l’invio di un SDS in presenza di DM-REPeater . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 2.22 Scambio di messaggi a livello DMCC durante l’invio di SDS . 73 2.23 Diagramma funzionale dei meccanismi di encryption e decryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 2.24 Schema dello scenario TWNET . . . . . . . . . . . . . . . . . 82 2.25 Interfacce e PDU presenti nello scenario integrato . . . . . . . 92 2.26 Macchina a stati finiti del Mobile Node sull’isola origine . . . . 97 2.27 Macchina a stati finiti del Mobile Node sull’isola destinataria . 97 2.28 TWNET Call Setup . . . . . . . . . . . . . . . . . . . . . . . 99 2.29 Sequenza dei messaggi scambiati durante una chiamata senza presence check . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 2.30 Diagramma delle classi . . . . . . . . . . . . . . . . . . . . . . 114 2.31 Diagramma sequenziale . . . . . . . . . . . . . . . . . . . . . . 115 2.32 Passaggio dei dati in ingresso lato rete multihop . . . . . . . . 120 3.1 Modello a V del processo di sviluppo software . . . . . . . . . 131 3.2 Schema del funzionamento della piattaforma S.T.R.E.S.S. . . . 151 3.3 Creazione dei messaggi utilizzando l’albero ABNF . . . . . . . 155 3.4 Modello ABNF del protocollo POP3: creazione di traffico valido156 3.5 Esempio di inserimento di anomalie all’interno del modello ABNF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 3.6 Esempio di pacchetto di login inviato durante una sessione valida del protocollo POP3 . . . . . . . . . . . . . . . . . . . . 159 3.7 Diagramma delle classi del modello ABNF . . . . . . . . . . . 165 viii ELENCO DELLE FIGURE 3.8 Rappresentazione della definizione ABNF del messaggio di login del POP3 . . . . . . . . . . . . . . . . . . . . . . . . . . 165 3.9 Diagramma delle classi della componente Parser . . . . . . . . 166 3.10 Diagramma sequenziale della procedura di parsing . . . . . . . 167 3.11 La classe Symbol . . . . . . . . . . . . . . . . . . . . . . . . . 167 3.12 Diagramma delle classi previsto secondo il pattern Strategy . . 171 3.13 Esempio: come vengono associate le classi del pattern Strategy 172 3.14 La classe ActionFactory . . . . . . . . . . . . . . . . . . . . . 173 3.15 Diagramma delle classi del sistema di inserimento automatico di anomalie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 3.16 Schema di funzionamento del monitor e scambio di messaggi con le componenti . . . . . . . . . . . . . . . . . . . . . . . . . 177 3.17 Diagramma delle classi del sistema di analisi del comportamento178 3.18 Diagramma delle classi delle risposte alle azioni dei test . . . . 182 3.19 Esempio di State risultanti dall’invio del pacchetto di login del POP3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 3.20 Diagramma delle classi della parte di scrittura dell’output . . 185 3.21 Schema generale del funzionamento del dissector . . . . . . . . 186 3.22 Diagramma delle classi del Dissector . . . . . . . . . . . . . . 188 3.23 Diagramma di sequenza del Dissector . . . . . . . . . . . . . . 189 3.24 Diagramma delle classi della componente di gestione dei test case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Elenco delle tabelle 1.1 Risultati delle simulazioni per un numero di nodi crescente . . 13 1.2 Numero di canali riutilizzati, per un numero di nodi crescente, con possibilità di marcare canali occupati . . . . . . . . . . . . 14 1.3 Profondità media dell’albero . . . . . . . . . . . . . . . . . . . 14 2.1 Struttura degli indirizzi Tetra . . . . . . . . . . . . . . . . . . 37 2.2 Occupazione di frame e slot nella chiamata diretta senza presence check . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.3 Occupazione di frame e slot nella chiamata con presence check 44 2.4 Schema del Header delle PDU TWNET . . . . . . . . . . . . . 90 2.5 Struttura dei pacchetti TWNET . . . . . . . . . . . . . . . . . 91 2.6 Campi del PDU CALL SETUP . . . . . . . . . . . . . . . . . 100 2.7 Valori dei campi del PDU CALL SETUP . . . . . . . . . . . . 103 2.8 Valori degli attributi di TwnetCallData . . . . . . . . . . . . . 104 2.9 Campi del TRAFFIC PDU . . . . . . . . . . . . . . . . . . . . 107 2.10 Valori dei campi del TRAFFIC PDU . . . . . . . . . . . . . . 108 2.11 Campi del CALL TERMIANTED PDU . . . . . . . . . . . . 109 2.12 Valori degli attributi del TERMINATED CALL PDU . . . . . 112 ix x ELENCO DELLE TABELLE Pubblicazioni 1. Rosi, M, Maccari, L, and Fantacci, R, S.T.R.E.S.S. : Stress Testing and Reverse Engineering for System Security, IEEE International Conference on Communications, Glasgow, 2007 2. Leonardo Maccari, Matteo Rosi , Romano Fantacci, Luca Maria Aiello, Marco Milanesio, Security analysis and improvement for Kademlia DHT, IEEE 2009 Internation conference on communications, Dresda, 2009 3. Luca Maria Aiello, Leonardo Maccari, Marco Milanesio, Matteo Rosi, Eclipse attacks in Kad networks, Italian Networking Workshop, Cortina, 2009 4. Luca Adamo, Romano Fantacci, Matteo Rosi, Daniele Tarchi, Federico Frosali, Analysis and Design of a TETRA-DMO and IEEE 802.11 integrated network, Emergency Management-Communication and Computing Platforms Workshop 2010 5. Documentazione per il software C.A.Dae. Implementazione dell’algoritmo di Network Auto-Forming 6. Report per Selex-Comms sullo studio di un algoritmo di Network AutoForming e risultati di simulazioni xi xii Pubblicazioni 7. Maccari, L, Mando’, G, Piccinocchi, L, and Rosi, M, EPO Patent Request PCT/IT/2008/000359: Modified Ad-Hoc On-Demand DistanceVector Routing Protocol (2008) 8. Richiesta di brevetto Nodo TWNET 9. Richiesta di brevetto Trasmissione su seriale del traffico TETRA DMO 10. Richiesta di brevetto Estensione delle funzionalità Changeover e Preemption tipiche dello standard DMO allo scenario multi isola TWNET 11. Richiesta di brevetto Soluzione di sicurezza per la negoziazione di chiavi crittografiche per applicazioni Tetra DMO su reti etorgenee 12. N.3 Report per la Convenzione con Selex-Comms su: Design ed implementazione di un sistema di AAA e provisioning convergente per reti multifunzione Tetra WiMAX basato su RADIUS 13. Report per progetto europeo N I 2 S 3 D1.1: NEC/SOA state of the art 14. Report per progetto europeo N I 2 S 3 D4.1: Analysis and classification of software insecurities 15. Report per progetto europeo N I 2 S 3 D4.2: Definition of a suitable grammar to express networking protocols and design of the testing platform Introduzione Il lavoro di ricerca svolto in questi anni si può suddividere in due filoni, il primo, in collaborazione con Selex-Communications, è incentrato sulla realizzazione di un’infrastruttura di rete sicura e dinamica in grado di configurarsi autonomamente, al fine di fornire supporto a sistemi di comunicazioni professionali. Il secondo filone di ricerca invece è incentrato sulla realizzazione di una piattaforma di testing per la verifica della sicurezza in applicativi di rete. Nel contesto delle reti professionali i moderni sistemi di telecomunicazioni hanno riportato importanti risultati per quanto riguarda affidabilità, copertura ed ampiezza di banda, permettendone l’uso in un ampia varietà di applicazioni e servizi. Tra le opzioni disponibili all’interno nel mercato professionale il sistema Tetra ed in particolare modo la sua opzione DMO (modalità che permette la comunicazione diretta half duplex fra utenti senza il supporto di alcuna infrastruttura) ricopre un ruolo di rilevo. Questa modalità di comunicazione è stata oggetto di una collaborazione fra Università di Firenze e Selex-Comms per individuare una soluzione ai limiti tecnici e di design che da cui è limitata, il Tetra-DMO infatti non supporta comunicazioni multi hop, con vincoli sia sulla copertura che sulla scalabilità dell’intera rete. L’obiettivo di fondo raggiunto durante la tesi è stato quindi quella di integrare il Tetra-DMO con un sistema di comunicazioni wireless più flessibile xiii xiv Introduzione (per esempio basato su IEEE 802.11), dove la tecnologia DMO costituisse l’accesso al servizio e che quindi permettesse l’interoperabilità con gli altri terminali Tetra-DMO, mentre la tecnologia IEEE 802.11 potesse essere utilizzata per fornire una flessibile e scalabile rete di backbone multi hop per interconnettere diverse isole Tetra-DMO. Uno scenario applicativo preso in considerazione è quello di situazioni di emergenza in caso di disastro naturale per fornire supporto alle unità di soccorso. In questi scenari gli operatori devono agire in situazioni ambientali critiche, come per esempio all’interno di una metropolitana, dove le comunicazioni giocano un ruolo chiave per permettere soccorsi ed interventi tempestivi. Spesso però per fornire tali servizi non è possibile disporre, per impedimenti ambientali, di infrastrutture presenti. La rete integrata oggetto della tesi andrebbe a fornire quel supporto alle telecomunicazioni fondamentale per le procedure di emergenza. Il deployment di una rete multi hop permetterebbe quindi la creazione di un backbone di comunicazione per coprire luoghi difficilmente raggiungibili, in modo da fornire copertura wireless a banda larga per trasmissioni video e permettendo, tramite l’integrazione con il Tetra-DMO, la comunicazione con un isola DMO all’interno del luogo delle operazioni con le isole all’esterno e con il centro operativo. Vedremo quindi il lavoro svolto in collaborazione con SelexComms che vedrà per prima cosa lo sviluppo di una rete wireless multi hop auto configurante, che ne permette il dispiegamento e l’attivazione facilitata e completamente automatica, con particolare attenzione all’ottimizzazione della banda dati e alla minimizzazione delle interferenze elettromagnetiche tipiche delle reti MANET. Successivamente verrà presentata la soluzione di integrazione TWNET (Tetra Wireless NETwork) per permettere il collegamento fra isole DMO differenti tramite la backbone multi hop. Il secondo filone di ricerca, sviluppato all’interno del progetto europeo N I 2 S 3 , xv è stato incentrato sullo sviluppo di una metodologia di testing funzionale per implementazioni di protocolli di rete e sulla creazione di una piattaforma per l’esecuzione di testing di robustezza. Informatica e telecomunicazioni stanno sempre più diffondendosi nella società moderna, diventando parte integrante di un gran numero di attività, molto comuni sia in quelle commerciali sia nella pubblica amministrazione, Certamente questo ha portato moltissimi vantaggi, sia da un punto di vista economico, per esempio aumentando la produttività dei lavoratori, sia da un punto di vista dei servizi forniti, aumentandone l’accessibilità e la fruibilità. Il numero di utenti di tipologie diverse, dal professionista al ragazzo delle scuole medie che usufruiscono di sistemi di comunicazione ed accedono alla rete aumentano sempre di più. I mezzi con cui ci si connette cambiano, prima si utilizzavano prevalentemente PC, oggi si utilizzano smartphone, notebook, netbook, tablet pc, ebook reader ed addirittura le televisioni; anche gli elettrodomestici sono dotati di schede di rete wireless o ethernet per poter essere integrati in un sistema di domotica. Quindi è logico aspettarsi che nel portare l’utilizzo della rete al centro di ogni aspetto della società moderna ci siano molti aspetti che richiedono particolare attenzione soprattutto dal punto di vista della sicurezza. A conferma di questo è sufficientepensare ad applicazioni di home banking, ma anche più semplicemente ai database centralizzati a livello regionale contenenti tutti i dati sensibili sanitari di tutti i cittadini italiani. Fondamentale diventa una corretta gestione della sicurezza dei sistemi e delle informazioni in essi contenuti, con un attenta configurazione ed analisi delle componenti coinvolte. Per compromettere la sicurezza dei sistemi infatti basta un dettaglio, un solo anello debole per rendere inutili tutte le precauzione prese. Si rende quindi necessario assicurarsi che gli applicativi utilizzati non presentino alcun tipo di vulnerabilità che possa essere sfruttata de un eventuale attaccante. Quindi xvi Introduzione si rende fondamentale la necessità di eseguire dei test per assicurare che non vi siano errori nei componenti software e soprattutto in quei programmi che vanno ad implementare delle funzionalità di comunicazione via rete. Errori che se si manifestano, possono venir sfruttati da attaccanti e quindi produrre quelle vulnerabilità dei sistemi che causano danni sia economici che lesivi dei diritti personali (per esempio violazione della privacy). Durante l’attività di ricerca svolta in questi anni è stata ideata una metodologia per svolgere attività di testing di robustezza su varie implementazioni di protocollo e che potesse essere utilizzata con standard differenti ed in differenti layer della pila ISO/OSI, inoltre illustreremo lo sviluppo di una piattaforma per permettere l’esecuzione dei test, introducendo elementi di automazione ed analisi del comportamento delle componenti sotto test per agevolare il processo. Parte I Rete MANET autoformante ed integrazione con lo standard TETRA-DMO Capitolo 1 CADAE: Channel Assignment DAEmon La prima parte del progetto di collaborazione prevede la creazione di un sistema per il deploy facilitato di una rete mesh in grado di ovviare a problemi di interferenze elettromagnetiche sia con altre reti wireless già presenti sia con rami della medesima rete di backbone; verrà quindi presentato sia l’algoritmo ideato per l’auto forming di tale rete che il prototipo di software che andrà ad implementare tale algoritmo e che girerà sui nodi della rete mesh di backbone. La rete auto formante sarà costituita da router dotati di 4 interfacce wireless, 3 di queste saranno dedicate alla costruzione della rete di backbone e saranno interfacce wi-fi di tipo IEEE 802.11a quindi con portante a 5 Ghz mentre la quarta sarà un’interfaccia wi-fi di tipo IEEE 802.11g per la fornitura del servizio di connettività dati. I router saranno dotati di una particolare versione sistema operativo GNU/Linux specifica dei dispositivi embedded, per l’esattezza OpenWRT Kamikaze 8.09 [1]. Questi device necessitano di una alimentazione Power over Ethernet e saranno dotati di sistema di alimentazione a batteria in modo da poter essere facilmente dislocati senza 3 4 Capitolo 1. CADAE: Channel Assignment DAEmon alcun problema. Le schede di rete wireless sono tutte basate su chipset atheros ed il loro funzionamento sarà gestito dai driver presenti nel kernel linux MadWIFI [2] 1.1 La generazione automatica della rete MANET L’assegnazione dei canali su una rete mesh, con lo scopo di minimizzare il grado di interferenza tra due link della stessa rete è un tema su cui si sta sviluppando un filone di ricerca nuovo ed attivo. Il problema del channelassignment, da un punto di vista teorico rimane un problema irrisolto, se non con soluzioni parziali o che fanno leva su euristiche non applicabili a tutti i contesti, visto che le implicazioni teoriche del problema stesso sono particolarmente difficili da affrontare. Da un punto di vista generale, il problema di scegliere i canali su una rete mesh è assimilabile ad una delle varianti del problema teorico di colorazione di un grafo. Tale problema è ben noto in letteratura, e può essere descritto come segue: dato un grafo, e un insieme finito di colori, associare ad ogni arco del grafo un colore preso dall’insieme a disposizione in modo che non esista un nodo della rete collegato a due archi dello stesso colore. Calato nella pratica delle reti mesh, ogni arco è un link, ogni colore è un canale, in questo modo si garantisce che ogni nodo non possieda due link sulla stessa frequenza, e quindi che si fanno interferenza. Alcune precisazioni sono necessarie: • il miglior algoritmo per la risoluzione del problema della colorazione del grafo è dimostrato essere NP-completo, quindi non esiste un algoritmo efficiente per trovare una soluzione. Inoltre, non sempre esiste una soluzione al problema; 1.1. La generazione automatica della rete MANET 5 • il modello della colorazione del grafo non descrive efficacemente il problema in tutti i suoi lati. Un nodo può provocare interferenza anche verso un altro nodo con cui non condivide nessun link, per il noto problema del nodo nascosto; • gli algoritmi di colorazione del grafo, presuppongono la conoscenza a priori di tutto il grafo ed agiscono come un’entità centralizzata. In una rete mesh non si può fare un’assunzione di questo tipo, ma l’algoritmo dovrebbe funzionare in modo distribuito e cooperativo tra i nodi; • una volta trovata una soluzione, l’assegnazione dei colori agli archi non è indipendente, ma cambiare il colore di un solo arco può implicare una riconfigurazione di altri archi del grafo. In altre parole, una volta trovata una soluzione per un dato grafo, non è detto che trovare una soluzione per lo stesso grafo leggermente modificato (ad esempio per la caduta di un link) sia più facile che trovare una partendo da zero. Inoltre, la riassegnazione di un canale non può essere effettuata in modo efficiente utilizzando le informazioni posseduta da un singolo nodo, perché si rischia sempre di produrre l’effetto del nodo nascosto. Da queste basi, esistono articoli in letteratura che presentano soluzioni particolari, applicabili in contesti limitati, o che prevedono grossi interventi sullo strato MAC. Ad esempio , Raniwala [3] introduce un algoritmo centralizzato per la channel-assignment in reti mesh. In un successivo articolo si introduce anche la possibilità di realizzarne una variante distribuita, ma con un notevole aumento di complessità. Altre tecniche si concentrano sull’assegnazione di un set di canali in cui ogni scheda di rete viene collegata sempre allo stesso canale, ed all’utilizzo di tecniche per la decisione del link da utilizzare per ogni pacchetto [4], o ad euristiche basate sui dati di una 6 Capitolo 1. CADAE: Channel Assignment DAEmon parte limitata della rete [5] . Dovendo realizzare una soluzione attuabile nella pratica sugli apparati mesh forniti, si è scelto un algoritmo che non prevede cambiamenti ai livelli MAC (condizione necessaria per poter essere applicato), e che pur rappresentando una soluzione sub ottima nel contesto generale, fornisce buone prestazioni nel contesto di rete identificato dalla convenzione. Tale contesto è il seguente: • rete di piccole dimensioni (5 nodi fissi più un gateway) ma estendibile ad un numero di nodi superiore • nodi equipaggiati con 3 schede di rete per la formazione del backbone • assenza di mobilità • necessità di riconfigurazione solo temporanea. L’ultimo punto deriva da quanto detto in precedenza sulla riorganizzazione di una rete già formata. Una volta stabilita una configurazione iniziale ottima, questa non viene rimessa in discussione se un link si rende indisponibile. Quello che succede è che un nodo che si ritrova momentaneamente isolato si appoggerà su un canale già occupato da altri nodi, almeno fino a quando il link iniziale non viene ripristinato. L’algoritmo descritto nella sezione successiva è stato realizzato su un simulatore, con lo scopo di verificare la bontà dello schema di allocazione dei canali scelto. Lo scenario simulato è un’astrazione di una rete mesh reale, quindi serve a giudicare la distribuzione dei canali, nella fase implementativa si verificheranno le prestazioni e le modifiche necessarie perché sia funzionante sulle piattaforme hardware scelta per lo sviluppo del prototipo. 1.2. Il problema del interference detection 1.2 7 Il problema del interference detection Algoritmi avanzati di interference detection esistono in letteratura, ma possono essere utilizzati avendo il controllo dei parametri di basso livello della comunicazione. Il driver madwifi maschera il comportamento dei componenti di basso livello della scheda di rete e si interfaccia con un modulo proprietario chiamato hal, che include tutta la parte di elaborazione del segnale. Le uniche informazioni che vengono restituite allo spazio utente sono i risultati delle scansioni prodotte dalla scheda di rete. Le scansioni restituiscono il numero di altre reti trovate nel raggio di copertura dell’apparato, insieme al rapporto segnale/rumore per ciascuna di esse. Avendo a disposizione solo questi dati, l’algoritmo di interference detection si riduce ad un semplice ranking dei canali a disposizione, escludendo quelli già occupati da altri access point ordinati per la potenza del segnale ricevuto. La funzione di scan fornita dal driver madwifi infatti restituisce una lista degli AP il cui segnale è ricevuto dalla stazione client, insieme al valore dell’intensità del segnale ricevuto. Con questi strumenti a disposizione, dopo la scansione si dà un giudizio sul grado di interferenza relativo al canale prescelto, tale valore può essere calcolato come la somma delle potenze ricevute dagli AP circostanti. Considerato che il traffico all’interno di una rete wifi può essere molto variabile nel tempo, a seconda del numero di utenti e del tipo di traffico che essi generano, non sembra plausibile introdurre una fase di scansione temporale limitata, in cui su ogni canale il nodo prescelto ascolta in modalità monitor per un periodo prolungato, con lo scopo di stimare il carico della rete con cui si fa interferenza. Con una strategia simile, infatti, un nodo potrebbe spenderebbe alcuni secondi per ogni canale prescelto, ascoltare tutto il traffico su quel canale e stimare con più precisione il livello di interferenza che incontrerebbe su quella frequenza. Tale stima deve essere ripetuta nel tempo, altrimenti perde di 8 Capitolo 1. CADAE: Channel Assignment DAEmon significato, ma per poterla realizzare è necessario cambiare la modalità usata dalla scheda (che viene spostata in modalità monitor), interrompendo cosı̀ il suo normale funzionamento. Durante la fase di scansione, che può essere effettuata anche in background, ovvero senza che la scheda cambi modalità o si disconnetta dal proprio access point (se viene utilizzata in modalità client), la scheda non rimane un tempo sufficiente sullo stesso canale per poter ricevere sufficiente traffico e poter realizzare una stima del carico sulla rete. L’unica soluzione rimane quella di basare il ranking delle frequenze su due parametri, il numero di AP che vengono individuati su un determinato canale, e la potenza del segnale ricevuto da quegli AP. La potenza è un valore in db che viene esportato dalle schede di rete attraverso le interfacce standard wireless extension del kernel di linux, quindi una somma normalizzata del valore di potenza riportato per ogni AP su quel canale sembra essere la stima migliore per definire il livello di occupazione del canale. 1.2.1 Assegnazione dei canali basato su una topologia ad albero Il tipico scenario di rete associabile all’utilizzo degli apparati mesh è quello di una rete in cui un gateway, equipaggiato con una o due schede di rete fornisce connettività verso l’esterno, e gli altri nodi vengono utilizzati per costruire una “magliatura” che copra la maggiore superficie possibile. Più che di una vera rete mesh, si può parlare di una topologia ad albero, in cui il nodo gateway divide la rete in due tronconi. Si immagina anche che la maggior parte del traffico sia diretto da e verso i nodi della rete all’esterno, e che venga comunque instradato dal gateway stesso. L’algoritmo sfrutta questa naturale gerarchia della rete suddividendo l’insieme dei canali utilizzabili in 1.2. Il problema del interference detection 9 due sottoinsiemi e introducendo delle politiche di fail-over in caso di problemi di connessione. L’algoritmo può essere descritto brevemente come segue: • ogni nodo, gateway escluso, utilizzerà una scheda di rete in modalità managed, con cui si lega al suo padre, e due schede di rete in modalità master a cui si legheranno i suoi figli. Ogni scheda in modalità master accetta un unico figlio come client, l’albero che si crea è binario. • Il nodo gateway, se equipaggiato con due schede di rete, le utilizza entrambe in modalità master, e nel pacchetto di beacon specifica due parametri: il primo indica la sua profondità nell’albero (che sarà ovviamente 0), il secondo è il sotto albero a cui è associata la scheda di rete (destro o sinistro). Da notare che se il gateway è equipaggiato con una sola scheda di rete, lo stesso principio può essere applicato usando due sotto reti virtuali appoggiate sulla stessa scheda. Il gateway quindi divide la rete in due tronconi, sulla sotto rete destra si useranno i canali pari, su quella sinistra si useranno i canali dispari. • I nodi che non sono gateway, inizieranno una scansione con la scheda in modalità client. In questo modo riceveranno la presenza dei beacon del gateway e tenteranno di connettersi ad una delle sue schede, ma solo uno per scheda di rete (reale o virtuale) sarà in grado di autenticarsi. Inoltre la scansione serve a capire se ci sono altri nodi che utilizzano altri canali nella stessa zona. Un nodo associato al gateway sponsorizzerà nei propri beacon una profondità pari a 1. • se un nodo non riesce a collegarsi al gateway perché non riceve i suoi beacon o perché non viene autenticato, ripeterà la procedura di scan per cercare dei nodi a profondità 1, e tentare di connettersi. Una volta trovato un padre, il risultato della ultima scansione viene utilizzato 10 Capitolo 1. CADAE: Channel Assignment DAEmon anche per scegliere i canali più liberi su cui impostare le schede master a cui si connettono i propri figli. Preferibilmente, il nodo sceglierà un canale libero, superiore a quello usato dal padre. In questo modo scendendo nell’albero si scelgono canali con indice più alto, e si evita il fenomeno del nodo nascosto. Una volta arrivati in fondo alla lista dei canali utilizzabili si riparte dal primo. Figura 1.1: Primo grafo di esempio La suddivisione dei canali in pari e dispari fa sı̀ che avvenga una distribuzione migliore delle frequenze. Due nodi che sono in range di trasmissione infatti si accorgono della presenza reciproca e possono evitare di scegliere lo stesso canale. Se i due nodi non sono in range invece non possono accordarsi, quindi potrebbero produrre interferenza su un terzo nodo che è nel range di entrambi, per il problema del nodo nascosto. L’impatto di tale problema può essere limitato se nodi in posizioni geografiche diverse utilizzano canali diversi. Questo viene garantito nella profondità dell’albero utilizzando i canali in modo incrementale, e viene reso più efficace anche discriminando i canali tra la metà destra e sinistra dell’albero. Lo schema cosı̀ descritto realizza in mo- 1.2. Il problema del interference detection Figura 1.2: Secondo grafo di esempio Figura 1.3: Terzo grafo di esempio 11 12 Capitolo 1. CADAE: Channel Assignment DAEmon do molto semplice un’allocazione dei canali che per reti di piccole dimensioni si rivela, secondo le simulazioni effettuate molto efficiente. In reti di piccole dimensioni basate su IEEE 802.11a [6] (in cui esistono 12 canali separati in frequenza) il problema della colorazione del grafo si riduce di complessità visto che aumentando i canali a disposizione in relazione al grado del grafo (il numero massimo di vicini di ogni nodo) si alleggeriscono i vincoli. Le modifiche necessarie al MAC per realizzare l’algoritmo sono minime, le informazioni aggiuntive nel beacon possono essere inserite in un campo ad-hoc se il driver lo permette, o più semplicemente direttamente nel nome della rete (essid). Il fail-over viene gestito utilizzando una scheda virtuale di backup per ogni nodo. Può succedere infatti che se un link diviene inutilizzabile un nodo si trovi isolato dalla rete. Ad esempio, se il suo unico vicino ha già due figli e quindi non accetta più connessioni. Questa situazione, che si genera molto raramente nella fase di deployment (le simulazioni mostrano che per 1000 topologie differenti con 5 nodi più un gateway solo 9 nodi rimangono isolati) può avvenire in presenza di cambi di topologia (per qualche motivo un link diventa inutilizzabile). La situazione viene risolta aggiungendo per ogni scheda di rete in modalità master un essid virtuale, di backup. Su questo essid non c’è limite di client connessi contemporaneamente, quindi se un client rimane orfano in un dato istante, può connettersi ad un essid di backup che riesce a trovare. L’essid di backup condivide il canale con una scheda in modalità master, quindi la banda a disposizione è condivisa tra due client, due osservazioni sono necessarie: • In un contesto di rete ad albero, la condivisione dello stesso link non implica automaticamente limitazione di banda. Per comprendere questa affermazione si osservino le figure 1.1, 1.2 e 1.3. Il link tra il nodo gateway e il nodo 1 rappresenta comunque un collo di bottiglia per 1.2. Il problema del interference detection 13 Nodi Nodi orfani Altezza media 5 0 0.27 6 0 3 7 1 3.2 Tabella 1.1: Risultati delle simulazioni per un numero di nodi crescente il traffico da e verso la rete, quindi la disposizione dei nodi nel sotto albero sinistro non influisce realmente sulle prestazioni della rete nel traffico di ingresso e uscita. Chiaramente però aumentare il numero di nodi sullo stesso link può rendere il MAC più inefficiente, quindi è consigliabile tornare, quando possibile alla configurazione iniziale. • Per questo motivo, il client può produrre delle scansioni in background alla ricerca del suo vecchio link e ricollegarcisi nel caso in cui il link ritorni disponibile. Risultati delle simulazioni L’algoritmo è stato valutato utilizzando il framework Omnet++ su piattaforma GNU/Linux. Le simulazioni hanno dimostrato che in reti fino a 7 nodi di backbone più un gateway l’algoritmo è molto efficiente. In tabella 1.1 si riportano alcuni risultati prodotti su 100 simulazioni con topologie random. Dalla tabella si evidenzia che all’aumentare dei nodi di backbone il numero di nodi orfani (nella seconda colonna della tabella è riportata la somma totale su tutte e 100 le simulazioni) non è rilevante, i nodi avrebbero comunque la possibilità di connettersi ad una interfaccia di backup (possibilità che nella simulazione non è stata implementata). La terza colonna riporta l’altezza media dell’albero nelle simulazioni effettuate. Una ulteriore valutazione è stata effettuata permettendo ai nodi della backbone di 14 Capitolo 1. CADAE: Channel Assignment DAEmon 0 1 2 3 5 1.03 0.85 0.8 0.71 6 1.56 1.35 1.22 1.4 7 2.28 2.07 1.9 1.78 Tabella 1.2: Numero di canali riutilizzati, per un numero di nodi crescente, con possibilità di marcare canali occupati 0 1 2 5 2.62 2.59 2.61 3 2.6 6 2.97 2.91 2.93 2.97 7 3.21 3.18 3.19 3.19 Tabella 1.3: Profondità media dell’albero scegliere, in modo casuale fino a tre canali che non possono essere utilizzati. In questo modo si simula la possibilità di un nodo di non poter utilizzare un dato canale per l’interferenza generata da parte di reti terze. Nel momento in cui deve scegliere i canali da assegnare alle proprie schede di rete master, oltre ai risultati della scansione si scelgono anche fino a tre canali marcati come occupati. Il numero di nodi orfani che si misurano dopo 1000 simulazioni di questo tipo è inferiore allo 0.5% del totale dei nodi utilizzati. In tabella 1.2 si riporta il numero di volte che un canale viene riutilizzato (in media) per ogni simulazione, all’aumentare (sulle colonne) del numero massimo di canali marcati occupati da un nodo. Si vede che le interferenze anche dovute al nodo nascosto, con un tasso di riutilizzo delle frequenze cosı̀ basso non producono un danno rilevante, in ogni caso, ci si aspetta che la scelta incrementale del numero di canale minimizzi l’effetto del nodo nascosto. Aumentando il numero di nodi, si aumenta anche la profondità media dell’albero, come riportato nella tabella 1.3. 1.2. Il problema del interference detection 15 Sono poi stati valutati degli scenari più generali, in particolare sono state considerate situazioni con un numero maggiore di nodi e una area geografica maggiore. Lo scopo delle simulazioni era verificare la scalabilità dell’algoritmo. Utilizzando un numero di nodi maggiore il numero di volte che lo stesso canale viene riutilizzato aumenta, ma aumenta anche la superficie totale coperta dalla rete quindi usare più volte lo stesso canale non significa automaticamente generare interferenze. Per valutare l’ampiezza delle zone di sovrapposizione quindi è stato necessario modificare il codice delle simulazioni per produrre un’analisi più dettagliata sul numero di metri quadri in cui c’è sovrapposizione, piuttosto che sul numero di riutilizzi del canale stesso. Sono state effettuate prove con un numero di nodi da 5 a 15, in aree di quadrate di lato 300m e 400m. Per ogni nodo si considera una zona di copertura circolare di raggio 150m, secondo le stime effettuate con il simulatore. Per ogni scenario sono state effettuate 200 simulazioni, ognuna con topologia casuale. Dai risultati sono state eliminate le simulazioni che rappresentavano un caso irrisolvibile, ovvero quelle simulazioni in cui un nodo, per via della disposizione casuale, cascava all’esterno della zona di copertura di ogni altro nodo, rimanendo isolato. Le grandezze misurate sono: • i metri quadrati dell’area di copertura ovvero la somma delle aree coperte da ogni AP, senza contare più volte le intersezioni; • l’area totale della zona di interferenza, ovvero la somma delle aree di intersezione in cui gli AP che si sovrappongono usano lo stesso canale. Questa grandezza ci dà una stima della percentuale della superficie totale in cui possono avvenire collisioni; • la profondità media dell’albero che si viene a creare; 16 Capitolo 1. CADAE: Channel Assignment DAEmon • il numero di ripetizioni nell’utilizzo di un determinato canale, per tutti i canali; • il numero di nodi orfani, ovvero nodi che hanno come unico punto di attacco alla rete un altro nodo che ha già le sue interfacce occupate con altri, quindi non accetta più connessioni. Il primo valore significativo è quello che riguarda i nodi orfani che è minore dello 1% in ogni simulazione effettuata. Nello scenario 400x400, per un blocco di 200 simulazioni con una media di 10 nodi per simulazione, si ha una media di 11 nodi orfani, quindi immaginando di avere 200 deployment diversi della stessa rete contenente mediamente 10 nodi, solo 11 non riescono a collegarsi, con una percentuale dello 0.55%. Nello scenario 300x300 la percentuale è ancora inferiore. Per quello che riguarda la profondità dell’albero, il grafico 1.4 mostra la distribuzione delle profondità al variare del numero dei nodi della simulazione. La profondità massima è di 5 hop, e la maggioranza delle simulazioni producono una profondità tra 3 e 4 hop, con la simulazione con 9 nodi a fare da elemento intermedio. In figura 1.5 si riporta lo stesso grafico per la superficie 400x400, in cui i risultati sono molto simili, si nota però un lieve spostamento verso sinistra del grafico, aumenta il numero di simulazioni con profondità 5 e la simulazione con 9 nodi ha una maggioranza di risultati con profondità 4. Lo spostamento è dovuto all’incremento dell’area, che dispone i nodi mediamente più lontani, quindi non sempre è possibile costruire un albero bilanciato. La figura 1.6 mostra il numero di volte che nella stessa rete viene riutilizzato un canale per la topologia 300x300. Ogni volta che un canale viene riutilizzato, anche in zone diverse della rete si incrementa questo valore di uno. Non vengono considerati i canali scelti dalle foglie dell’albero per le schede in modalità master, perché pur occupando un canale, 1.2. Il problema del interference detection 17 non producono traffico non avendo figli. Avendo a disposizione molti canali (12) il numero di ripetizioni rimane molto basso. Per la topologia 400x400 l’effetto è lo stesso che per la profondità dell’albero, aumentando la profondità c’è anche un maggiore riuso dei canali. Infine, nella figura 1.8 viene riportata l’area totale coperta dagli AP, e l’area totale di sovrapposizione dei canali. Si osservi che su una superficie totale di 90.000 MQ, già con 10 nodi si ha una copertura quasi totale della zona ed aumentando il numero di nodi, l’unico effetto è quello di aumentare la superficie in cui avvengono collisioni. Nella figura 1.9 lo stesso grafico viene riportato per un’area di 160.000 MQ. Anche in questo caso aumentando il numero di nodi si aumenta il numero totale di MQ di copertura ma si aumenta anche il numero di MQ di interferenza, anche se le distanze mediamente maggiori allontanano i nodi tra loro e quindi diminuisce l’area di sovrapposizione. Conclusioni Le simulazioni dimostrano che l’area di interferenza su superfici di 300x300 e 400x400 metri rimane comunque limitata specialmente nel caso della superficie maggiore. Questo ha come conseguenza l’aumento della profondità dell’albero, quindi l’aumento del numero di hop medi di un pacchetto verso il gateway. Da notare anche come l’aumento della profondità dell’albero comporta anche maggiore spesa di riconfigurazione nel caso di cambio di topologia, ma una maggiore densità di AP nella stessa area permette collegamenti migliori tra gli AP stessi. Dalle simulazioni non è possibile stimare le prestazioni in termini di traffico. Appare chiaro che deve essere trovato un trade-off sul numero di nodi utilizzati, visto che aumentalo significa garantire maggiore copertura e migliori collegamenti, ma anche maggiore delay e maggiore interferenza. 18 Capitolo 1. CADAE: Channel Assignment DAEmon Figura 1.4: Profondità media dell’albero per blocchi di 200 simulazioni con numero di nodi variabili in area 300x300 Figura 1.5: Profondità media dell’albero per blocchi di 200 simulazioni con numero di nodi variabili in area 400x400 1.2. Il problema del interference detection 19 Figura 1.6: Numero di ripetizioni di canali, con scenario 300x300 al variare del numero di nodi. Figura 1.7: Numero di ripetizioni di canali, con scenario 400x400 al variare del numero di nodi. 20 Capitolo 1. CADAE: Channel Assignment DAEmon Figura 1.8: Metri quadri della zona di interferenza in un’area 300x300. Figura 1.9: Metri quadri della zona di interferenza in un’area 400x400. 1.3. Sviluppo demone CADAE 1.3 21 Sviluppo demone CADAE Una prima implementazione dell’algoritmo è stata sviluppata in ruby e implementata sulle macchine costituenti la rete mesh, in un testbed composto da un nodo fisso con una sola interfaccia (il gateway) e tre nodi equipaggiati con 4 interfacce di rete, di cui tre per il backbone e una per la copertura. Inoltre iè stato scelto di utilizzare per comunicare e pilotare le schede wireless solamente strumenti di sistema presenti in tutte le distribuzioni linux, in modo da assicurarci un funzionamento delle schede omogeneo anche su macchine diverse. Per la precisione sono stati usati i seguenti pacchetti software: • wireless-tools: una serie di tool per configurare la modalità di configurazione delle schede, il canale di ascolto e tutte le configurazioni base della scheda; • wpa-supplicant: tool per lo scanning dei canali e per l’autenticazione verso access point utilizzando i vari algoritmi di comunicazione previsti dallo standard; • hostapd: software di emulazione di access point e autenticator, implementa funzionalità avanzate che non vengono fornite da una scheda in modalità master, come ad esempio il numero massimo di client associati e autenticazioni WPA. L’implementazione dell’algoritmo è quella descritta nella macchina a stati di figura 1.10, nella fase attuale non sono state implementate le procedure di backup. 22 Capitolo 1. CADAE: Channel Assignment DAEmon SEARCH_PARENT scan found_ap connect_timeout retry_max go_search CONNECTING ENABLE_BK connect to best AP enable_bk_ssid found_parent found_bk CONNECTED BK set_params set no_params_bk reconnect_timeout go_watch go_watch WATCH_CONNECTION watch_loop lost reconnected LOST retry_and_check Figura 1.10: State machine dell’algoritmo implementato 1.3. Sviluppo demone CADAE 1.3.1 23 Macchina a stati L’applicazione se avviata con il parametro gateway si aspetta di trovare una sola scheda di rete, fa una scansione dei canali liberi, una volta effettuato il ranking basandosi sul numero e sulla potenza degli AP presenti in ogni canale, sceglie un canale e fissa tre essid virtuali, 0 L, 0 R, backup. Per ogni essid si fa partire un’istanza di hostapd, impostando il parametro max num sta ad 1 in modo che ad ogni ssid non si possa collegare più di una stazione. Se avviato senza tale parametro, una scheda di rete viene avviata in modalità managed e si inizializza una macchina a stati composta da 7 stati: • SEARCH PARENT: In questo stato si richiamano le funzioni di scan, utilizzando l’applicativo wpa cli. Si fa il ranking delle risposte, e si configura wpa supplicant attraverso wpa cli rendendo enabled le reti migliori e rispettando il ranking realizzato nella scansione, tra le risposte ricevute si eliminano gli essid backup. A quel punto si va nello stato CONNECTING. Se non si trovano essid validi dopo un numero parametrizzabile di tentativi ci si sposta nello stato ENABLE BK • ENABLE BK Questo stato è uno stato fittizio, realizzato solo per chiarezza e per esigenze di logging. In questo stato vengono abilitati anche gli ssid backup e si torna allo stato SEARCH PARENT. • CONNECTING: attraverso wpa cli si iniziano i tentativi di connessione alle reti identificate nella fase di scan. Se dopo 5 secondi la scheda non è ancora connessa, si setta a disable l’essid scelto e si passa al successivo. Se tutta la lista fallisce si torna a SEARCH PARENT, se si ottiene una connessione si passa a CONNECTED, se la connessione ottenuta è su un essid backup si passa a BK. 24 Capitolo 1. CADAE: Channel Assignment DAEmon • CONNECTED: si impostano le 2 interfacce master su due canali liberi, dopo aver effettuato una nuova scansione, e gli si assegnano degli essid del tipo X L, X R dove X è la profondità del padre aumentata di uno. Si passa in WATCH CONNECTION. • BK: senza impostare le schede in modalità master si passa allo stato WATCH CONNECTION. Un nodo collegato ad un’interfaccia di backup infatti è il terzo nodo collegato al genitore, altrimenti avrebbe trovato libero uno degli altri due essid. Si vuole evitare che altri nodi scelgano questo nodo come genitore a loro volta, sovraccaricando quel ramo. Dalle simulazioni effettuate risulta comunque che il caso in cui un nodo abbia bisogno di un’interfaccia di backup è molto raro. • WATCH CONNECTION: in questo stato, periodicamente si controlla lo stato della connessione verso il padre, se la connessione viene persa, si passa nello stato LOST • LOST: per tre tentativi intervallati da un secondo si controlla se la connessione è stata recuperata, alternativamente, si abbattono le schede in modalità master, si aspetta un secondo per dare il tempo ai propri figli di scollegarsi e si ritorna nello stato SEARCH PARENT 1.3.2 Risultati prestazionali Sono state effettuate dieci prove in sequenza per validare l’approccio e le prestazioni del codice, che è tuttora sperimentale. L’instabilità delle macchine utilizzate nel testbed ha reso più difficile lo svolgimento dei test stessi. Durante le prove effettuate l’albero viene sempre costruito correttamente, a differenza delle simulazioni però le scansioni sono più imprevedibili, non sempre dopo una scansione un nodo riesce a riconoscere tutti i suoi vicini, 1.3. Sviluppo demone CADAE 25 il numero di scansioni è quindi stato aumentato a 3 consecutive prima di passare nello stato connecting. Inoltre, il figlio destro di un nodo aspetta sempre un secondo, per permettere all’eventuale figlio sinistro di collegarsi per primo. Altrimenti i due nodi faranno scansioni contemporaneamente e non si troveranno a vicenda. Su 10 test effettuati il primo nodo a connettersi alla rete impiega mediamente circa 12 secondi, il secondo nodo intorno ai 40, perché generalmente prova a connettersi allo stesso ssid già occupato dal primo fallendo. Il terzo, fallisce due volte di seguito, perché prova prima gli ssid a livello 0 che sono già occupati, quindi cercherà di connettersi ad un nodo di livello 1, mediamente impiega un minuto per connettersi. I fallimenti sono dovuti al fatto che altri nodi potrebbero già essere collegati all’AP scelto, quindi l’AP non permetterà altre connessioni per mantenere l’albero al più in forma binaria. Durante le prove sono stati effettuati dei tentativi di disconnessione e riconnessione di un nodo intermedio nell’albero, come descritto in figura 1.11. Come ci si attendeva, dalla situazione iniziale (1) per un evento di disconnessione (spegnimento della macchina) la macchina L2 diventa la L1 ovvero il secondo figlio del GW (2), nel momento in cui la macchina viene riaccesa non trovando più libere le interfacce del GW che vengono scelte con preferenza sulle altre, il nodo diventa figlio di uno dei due nodi già connessi all’albero (3). 26 Capitolo 1. CADAE: Channel Assignment DAEmon Figura 1.11: Caso di ricostruzione dell’albero Capitolo 2 TWNET: Tetra Wireless NETwork La seconda parte della collaborazione con Selex-comms prevede l’utilizzo della rete mesh auto configurata dal software CADAE per estendere il sistema di comunicazione Tetra DMO. Il protocollo Tetra [7] fornisce un sistema di telecomunicazioni in gradi di garantire sia sicurezza che affidabilità delle comunicazioni, a testimonianza di ciò questi sistemi sono in dotazione alle principali forze dell’ordine e militari italiane ed estere. La sicurezza delle trasmissioni viene garantita da due livelli di sicurezza implementati in due livelli protocollari distinti; il grado di affidabilità invece viene determinato principalmente da quanta copertura del segnale viene data ad i vari terminali, per questo il Tetra fornisce due tipi diversi di funzionamento: • Trunked Mode (TMO): modalità infrastrutturale dove il servizio viene garantito sotto la copertura di una Base Station Tetra, • Direct Mode (DMO): modalità non infrastrutturale dove i vari terminali comunicano direttamente l’uno con l’altro senza l’ausilio di una BS. 27 28 Capitolo 2. TWNET: Tetra Wireless NETwork L’obbiettivo del progetto TWNET è quindi quello di superare alcuni limiti della modalità di comunicazione DMO per poter ampliare ulteriormente la possibilità di copertura per riuscire a garantire affidabilità delle comunicazioni anche in situazioni ambientali difficili o in scenari di emergenza. Per far questo si è pensato di ampliare il funzionamento dei terminali DMO con l’adattabilità e la facilita di deploy delle reti mesh presentate precedentemente, in modo da fornire una backbone di supporto alle normali comunicazioni Tetra. L’idea è quindi quella di dotare i nodi mesh di un’interfaccia Tetra per poter esportare e importare segnalazioni e traffico voce fra i due mezzi di telecomunicazioni, da una parte una rete mesh basata su IP e dall’altra isole Tetra DMO. Per far questo è necessario avere un’interfaccia in grado di accedere in ricezione ed invio al mezzo Tetra per poi riuscire a tradurre queste informazioni in traffico IP e viceversa. Presenteremo quindi i servizi che saranno interessati dal nostro sistema, la nuova struttura dei nodi mesh con l’interfaccia Tetra/IP scelta ed eventuali estensioni che dovranno essere implementate per garantirne la corretta funzionalità, ed infine il software che è stato sviluppato per permettere lo sviluppo del prototipo di questa rete mista. 2.1 Lo standard Tetra Nell’ambito dei sistemi radio professionale l’ETSI ha sviluppato il protocollo di comunicazione TETRA (TErrestrial Trunked RAdio), protocollo che per completezza e funzionalità può essere paragonato al più famoso GSM utilizzato per i sistemi pubblici di radiocomunicazione mobile. A differenza delle reti pubbliche, TETRA va a soddisfare esigenze più specifiche e prevede fun- 2.1. Lo standard Tetra 29 zionalità avanzate andando cosı̀ a coprire il settore di mercato delle utenze professionali. Infatti va a soddisfare specifiche esigenze di sicurezza, privacy, flessibilità e soprattutto affidabilità tanto da essere considerato protocollo di riferimento per le telecomunicazione da parte degli enti governativi europei. I sistemi TETRA sono in grado di inviare simultaneamente sia dati che traffico voce, il collegamento radio è dotato di 4 canali indipendenti in grado di garantire la trasmissione contemporanea delle due tipologie di traffico. Un’altra caratteristica che permette questa trasmissione simultanea è la separazione in slot temporali di una singola portante e la possibilità, da parte di un device , di farsi allocare più slot temporali per l’invio dei dati. Secondo lo standard ETSI, si prevede l’uso di una tecnologia digitale in grado di garantire una buona qualità audio paragonabile al GSM ed un basso rate di errori per le trasmissioni dati. Queste caratteristiche sono abbinate ad alti livelli di sicurezza paragonabili ai sistemi di telefonia fissa, grazie a diversi livelli di autenticazione: • l’utente con la radio; • la radio con la rete; • la rete con la radio; • fra reti diverse; • fra gli utenti; Queste feature rendono questa tecnologia il principale punto di riferimento nelle comunicazioni radio professionali. TETRA è in gradi di lavorare in 3 principali modalità: 1. DMO (Direct Mode Operation): che permette la comunicazione fra i terminali quando si è fuori copertura della rete; 30 Capitolo 2. TWNET: Tetra Wireless NETwork 2. V+D (Voice + Data): in modalità trunked permette l’invio simultaneo dei due tipi di traffico; 3. PDO (Packet Data Optimized): permette di raggiungere le massime velocità di trasmissione dati. Vi sono alcuni ruoli fondamentali ed alcuni concetti base indispensabili per la corretta comprensione dello standard: • Master : ruolo ricoperto dal terminale che è in possesso del canale • Slave: tutti gli altri terminali presenti sul canale; • le modalità operative di utilizzo del canale sono due: 1. normal mode: solamente una chiamata può essere eseguita su una certa frequenza, indipendentemente dal tipo di chiamata se di gruppo o individuale; 2. frequency efficient mode: in questa modalità si possono attivare al massimo due chiamate su una stessa frequenza; • in modalità DMO sono premesse solo chiamate simplex sia che siano di gruppo o individuali; • nel DMO non vi è alcuna correlazione fra indirizzi e frequenze di trasmissione, per esempio possono essere attivate chiamate ad uno stesso destinatario ma su frequenze diverse; • in modalità DMO un terminale può ricevere una chiamata solo se ha selezionato la frequenza sulla quale viene effettuata tale chiamata; 2.1. Lo standard Tetra 31 • gli indirizzi identificano un terminale o un gruppo di terminali, un indirizzo è costituito da una prima parte chiamata MNI (Mobile Network Identity) che rappresenta l’identificativo di rete a cui appartiene il terminale e da una seconda parte univoca che identifica il device; • su un terminale sono configurati vari indirizzi: 1. un ITSI Address; 2. due Open Group GTSI: indirizzi di gruppo che consentono di identificare tutti i terminali presenti su di una frequenza o tutti quelli aventi uno stesso MNI; oltre a questi tre indirizzi possono essere configurati altri indirizzi di tipo GTSI; • un terminale può ricevere una chiamata solo se questa è indirizzata ad uno degli indirizzi in esso configurati. 2.1.1 Architettura DMO Lo stack protocollare DMO ha tre layer che implementano varie funzionalità a basso livello, andremo adesso a presentarle in modo da chiarire le varie entità che vengono coinvolte durante il funzionamento del sistema di telecomunicazione. Air interface layer 1 Il primo e il più basso layer nello stack protocollare si occupa della comunicazione del mezzo fisico ed in particolar modo gestisce la definizione della modulazione, sincronizzazione radio del TDMA, codifica del canale e multiplexing dello stesso. Il progetto TWNET prevede la conservazione della 32 Capitolo 2. TWNET: Tetra Wireless NETwork struttura di comunicazione del DMO originale, sorvoliamo quindi su approfondimenti tecnici poiché non è stato argomento di studio al fine del progetto. Air interface layer 2 Il secondo livello dello stack è paragonabile al livello data link della pila ISO/OSI, si occupa cioè della parte di accesso al canale; questo layer può essere suddiviso in due parti principali: la prima, definita user plane adibita al trasporto delle informazioni, sia dati che voce, utilizzate dalle applicazioni utente, la seconda, control plane a cui viene delegata la gestione del traffico per la segnalazione. L’obbiettivo di questo livello di protocollo è quello di gestire le connessione logiche delle comunicazioni fornendo un’interfaccia agli strati superiori per un accesso semplificato al mezzo fisico. • Codifica di canale e schemi di scrambling/de-scrambling interleaving/deinterleaving; • Controllo di accesso al canale: – sincronizzazione dei frame tenendo traccia del Frame Number e dello Slot Number – controllo di accesso al canale DM con rilevazione dello stato dello stesso (libero occupato o riservato) – rilevamento di collisione con i terminali slave durante gli stati del canale riservati o occupati tramite un sistema di accesso casuale – frammentazione di un SDU in più PDU e la successiva ricomposizione – multiplexing dei canali logici all’interno di un burst di livello 2 2.1. Lo standard Tetra 33 – creazione e sincronizzazione della struttura multiframe. Ogni frame viene numerato in modo ciclico ed ogni blocco di sincronizzazione deve indicare i numeri di frame di time slot. • Gestione della radio: – gestione indirizzi per le chiamate – controllo di potenza – creazione del collegamento radio – gestione di un buffer per il traffico dell’utente e di controllo fino a quando non avviene l’effettiva trasmissione – interfacciare le applicazioni a commutazione di circuito con lo strato fisico – scambiare le informazioni con lo strato superiore • Crittografia: il DMO è in grado di garantire la sicurezza delle comunicazioni tramite un sistema di cifratura basato sull’utilizzo di chiavi crittografiche statiche (SCKs) e l’uso di una sincronizzazione di un parametro dipendente dal tempo (TVP) contro gli attacchi di replica dei pacchetti cifrati. Air interface layer 3 In questo livello protocollare sono previste soltanto le funzionalità riferite al control plane, quindi gestione del traffico e la segnalazione. La componente principale di questo layer è il Direct Mode Call Control (DMCC) che implementa le seguenti funzionalità: • Inizializzazione, mantenimento e rilascio dei servizi di base per le chiamate 34 Capitolo 2. TWNET: Tetra Wireless NETwork • Indirizzamento delle chiamate (destinazione, repeater e gateway) • Short Data Service (SDS): brevi messaggi di testo simili agli SMS del GSM • Supporto per servizi correlati alle chiamate: livello di priorità dell’utente, identificazione pre-emption e late entry. Un altro aspetto che viene gestito dal control plane è la Security Management che si occupa di: • Identity Management e le procedure di autenticazione, anche se nel DMO non esistono vere e proprie procedure di autenticazione perché l’autenticità del chiamante viene garantita dalla conoscenza di un segreto condiviso, cioè la chiave SCK usata per la cifratura della chiamata; • Enable/Disable Mechanism: un terminale autorizzato può abilitare o disabilitare l’accesso al canale radio di un secondo terminale. Inoltre se un terminale deve poter comunicare anche con una rete Tetra TMO tramite un DM-GATEway, dobbiamo aggiungere alle funzionalità di questo layer anche la componente che implementa le procedure di registrazione verso la rete infrastrutturale, componente denominata Direct Mode Mobility Management (DMMM). 2.1.2 Canale a trama temporale Il sistema Tetra DMO utilizza due diversi metodi di suddivisione ed accesso al canale, il primo metodo è un Time Division Multiplexing (TDM) come anche il secondo, più nuovo, che però utilizza due frequenze portanti. Al fine di garantire la massima compatibilità possibile, anche con terminali Tetra di 2.1. Lo standard Tetra 35 vecchia fattura, il progetto TWNET si appoggerà al primo metodo e quindi verrà utilizzata solo una frequenza portante. Il canale non viene scelto automaticamente ma viene impostato sul terminale che si vuole utilizzare, una volta attivo sulla frequenza questo verrà utilizzato per trasmettere tutte le tipologie di dato: segnalazione, voce, messaggi e dati. Lo standard DMO utilizza per ogni banda una struttura fissa di allocazione del canale suddivisa in tre sotto trame: 1. la separazione più grande è organizzata in multi frame, 2. ciascuno dei quali e suddiviso in 18 frame, 3. ogni frame è ulteriormente suddiviso in 4 frame slot 2.1.3 Indirizzi ed identità I terminali e i gruppi di device Tetra vengono identificati all’interno della rete tramite indirizzi di diverso tipo. Tali indirizzi di suddividono in categorie differenti in base alla lunghezza ed all’utilizzo: MCC : Mobile Country Code di 10 bit identifica la nazione di appartenenza dell’operatore Tetra MNC : Mobile Network Code di 14 bit identifica l’operatore stesso MNI : Mobile Network Identity di 24 bit è formato da MCC+MNC SSI : Short Subscriber Identity di 24 bit identifica un terminale e deve essere univoco all’interno di una sotto rete Tetra TSI : Tetra Subscriber Identity di 48 bit è formato da MNI+SSI identificando univocamente il terminale 36 Capitolo 2. TWNET: Tetra Wireless NETwork TEI : Tetra Equipment Identity si 15 bit • Indirizzi di device Tetra tipo repeater e gateway sono di 10 bit Gli indirizzi di gruppo hanno la stessa lunghezza e struttura di quelli individuali e vengono utilizzati nello stesso modo e negli stessi campi del protocollo durante le comunicazioni, per chiarire potremmo paragonare questo tipo di indirizzamento a quello IP, in questo caso ci riferiremmo all’indirizzamento unicast nel caso di indirizzi di terminale o a quello multicast nel caso di quelli di gruppo. Si distingue quindi l’ITSI ed il GTSI come indirizzi individuali o di gruppo, e conseguentemente possiamo parlare dell’ISSI o nel secondo caso del GSSI. Ogni terminale Tetra ha assegnato un TSI individuale ed un numero variabile di TSI di gruppo, l’insieme di questi indirizzi costituiscono la TSI Family. Fra tutti i gruppi disponibili ve ne è uno che è associato a tutti i terminali, chiamato open group; i device che trasmettono a questo gruppo comunicano con tutte le stazioni presenti su quel canale. L’indirizzo di questo gruppo è identificato dal SSI con i bit settati tutti a 1, se invece vogliamo chiamare in broadcast tutte le stazioni anche all’esterno della sotto-rete Tetra anche i bit del MNI devono essere settati a 1. Il sistema di indirizzamento viene utilizzato sia dal livello 2 che dal livello 3, la destinazione può essere sia un indirizzo Unicast che uno di gruppo, mentre quello di mittente può essere solamente un indirizzo ISSI. Un caso particolare sono gli indirizzi associati a differenti device Tetra: repeater e gateway hanno degli address lunghi 10 bit che però non hanno il vincolo dell’univocità all’interno di una rete Tetra ma solamente all’interno della stessa isola DMO. Un terminale DMO riconosce la presenza di questi device tramite la segnalazione periodica che questi trasmettono sul canale su cui sono attivi. In questo caso tali indirizzi di 10 bit non vengono utilizzati 2.1. Lo standard Tetra 37 Tetra Subscriber Identity (TSI) 48 bit Mobile Network Identity (MNI) 24 bit Mobile Country Code Mobile Network Code (MCC) 10 bit (MNC) 14 bit Short Subscriber Identity (SSI) 24 bit Tabella 2.1: Struttura degli indirizzi Tetra per destinare il traffico ma bensı̀ solo per indicare il tramite cui veicolare tali dati, per fare un esempio possiamo paragonare tale sistema al funzionamento nelle reti IP dei gateway e il differente uso di indirizzi IPv4 e ARP. 2.1.4 Scenari di servizio TETRA DMO Il Tetra DMO è in grado di trasmettere due tipologie di informazioni: traffico dati e traffico voce. Entrambe vengono fornite dei servizi di sicurezza tramite cifratura del canale di trasmissione utilizzando i due principali sistemi previsti dallo standard: • AIE: Air Interface Encryption • E2EE: End-to-End Encryption La modalità DMO rappresenta una delle caratteristiche più importanti del TETRA ed è anche l’oggetto del progetto TWNET, in questa modalità sono previsti due tipi principali di servizi: • bearer : questo tipo di servizio per l’invio di informazioni fra le interfacce di rete interessa i livelli più bassi della pila protocollare, per esattezza i 3 livelli inferiori. L’utente utilizza per accedere alle funzionalità del 38 Capitolo 2. TWNET: Tetra Wireless NETwork device radio un protocollo di livello superiore il quale utilizza i servizi bearer per trasmettere sulla rete le informazioni, sia dati che voce; • teleservice: il servizio che fornisce la capacità di comunicazione fra gli utenti tramite lo standard TETRA, si tratta dei servizi che vengono forniti all’utilizzatore tramite le varie applicazioni del device che si appoggiano ai servizi bearer per il trasposto dei dati sulla rete. Come accennato precedentemente, il progetto TWNET prevede l’utilizzo del canale fisico con modalità normale quindi con la possibilità di attivare una sola chiamata simplex su un canale e tale chiamata può essere stabilita soltanto fra terminali operanti su quella frequenza. Andiamo quindi a analizzare i meccanismi di funzionamento dei vari servizi Tetra DMO che dovranno essere supportati dalla rete TWNET. Chiamata diretta senza presence check In modalità normale ogni MS può operare su di un solo canale configurato dall’utente, tale portante viene utilizzata per tutte le tipologia di trasferimento: dati, voce o segnalazione. Nel Tetra DMO il mezzo di comunicazione viene suddiviso in una struttura fissa descritta nel capitolo 2.1.2 che prevede 4 time slot per frame e 18 frame costituiscono un hyperframe. Il canale può risultare libero (quando cioè non viene rilevata alcuna attività), occupato, riservato o in uno stato sconosciuto. Durante una chiamata vengono utilizzati gli slot 1 e 3 all’interno del frame. Quando una radio vuole effettuare una chiamata su un canale libero, ne prenota l’utilizzo ed inizia la procedura per attivare la chiamata voce: Il master trasmette i burst di sincronizzazione (DSBs: Direct Mode Synchronization Bursts) nei frame numero 6, 12 e 18 mentre viene allocato il traffico (DNBs: Direct Mode Normal Bursts) nei 2.1. Lo standard Tetra 39 frame dal 1 al 17. Nella fase di prenotazione del canale il master usa i frame per: • indicare che il canale è riservato; • indicare per quale gruppo o terminale è riservato; • segnalare la durata della prenotazione. L’occupazione del canale da parte del master risulta conclusa dopo il termine della chiamata, dopo un changeover (procedura che cambia il ruolo del master quindi il canale risulterà occupato da un altro terminale) o dopo che il timer della prenotazione è scaduto. Quando un canale è occupato, vengono usati per la chiamata i seguenti frame: • il frame 18 è usato per la sincronizzazione con un DSB negli slot 1 e 3 • i frame 6 e 12 hanno un DSB nello slot 3 e possono trasportare traffico con un DNB nello slot 1 • nei frame 6 e 12 vengono anche allocate anche informazioni sulla prenotazione del canale con un DSB negli slot 1 e 3 • la segnalazione di pre-emption si trova negli slot 3 dei frame 2, 5, 8, 11, 14 e 17 • durante una chiamata i frame dal 1 al 17 trasportano il traffico DNB nello slot 1 Un terminale che vuole effettuare una chiamata, per prima cosa effettua un monitoraggio sul canale per verificarne lo stato: nel caso la frequenza sia libera, la radio diventa il master della chiamata e inizia a sincronizzare 40 Capitolo 2. TWNET: Tetra Wireless NETwork Frame # 17 18 1 Slot # 1 2 3 4 1 2 3 4 1 Channel su su su su su su su su tc Frame # 5 Slot # 1 Channel tc 2 2 p? 4 1 tc 2 4 1 2 occ 4 1 tc 2 4 p? 7 3 3 3 tc 6 3 2 3 1 2 tc 4 1 tc 2 4 ich 8 3 4 3 1 2 p? 4 1 tc 2 4 3 4 tc 9 3 3 10 3 4 1 2 tc Tabella 2.2: Occupazione di frame e slot nella chiamata diretta senza presence check il canale inviando burst DSP (su nella tabella 2.2) che informano i terminali slave su quale numero di frame sta avvenendo la chiamata cosı̀ da poter allineare le strutture multi frame. Successivamente nel primo frame libero il master inizia a trasmettere il traffico (tc nella tabella 2.2). Nella trama temporale vengono rilasciati alcuni slot liberi per eventuali richieste di preemption sul canale (p? nella tabella 2.2) e vengono trasmessi burst di sincronia sullo slot 3 dei frame 6, 12 e 18 per indicare che il canale è attualmente occupato (occ nella tabella 2.2). Ogni scambio di dati in una comunicazione in DMO consiste in una trasmissione indipendente con un master e vari slave coinvolti. In questo esempio, le opportunità di pre-emption sono nello slot 3 dei frame 2, 5 e 8 del link slave. Una richiesta di questo tipo fatta nello slot 3 del frame 2 sul link slave sarebbe ritrasmessa 5 slot dopo nello slot 3 del frame 4 del link master. La figura mostra inoltre la trasmissione del segnale di presenza da parte del DM-REP nello slot 3 del frame 7 sul master link (questo slot potrebbe venir utilizzato per la ritrasmissione di una richiesta di pre-emption eventualmente ricevuta nello slot 3 del frame 5 del link slave). La procedura per passare da una trasmissione della chiamata ad un’altra prende il nome di Changeover. Per prima cosa il chiamante, che vuole rilas- 2.1. Lo standard Tetra 41 ciare il ruolo di master, invia una segnalazione “transmit ceased message” nello stesso formato del traffico DNB nello slot 1 in almeno due frame consecutivi indicando cosı̀ che sta per concludere la comunicazione. Una radio slave che vuole eleggersi nuovo master della nuova transazione di chiamata, invia un “changeover request message” in uno slot 3 riservato. Nell’eventualità di collisioni di richieste di changeover o pre-emption, queste vengono risolte tramite un meccanismo di ritrasmissione con intervallo casuale. Una volta che una richiesta viene ricevuta con successo, il master rilascia il canale tramite un “changeover acknowledgement” al termine del quale diviene a tutti gli effetti uno slave per la successiva transazione. In caso si utilizzi il protocollo MS-REP la procedura di call set-up senza presence check è modificata come in figura 2.1 Figura 2.1: Struttura della trama temporale nel set-up di una chiamata senza presence check tramite repeater Dopo essersi assicurato che lo stato del canale è libero, il terminale DMMS può linearizzare il trasmettitore. Quindi stabilisce la sincronizzazione al canale e il suo ruolo di master trasmettendo una sequenza di messaggi di call set-up sul master link inviati su un numero appropriato di frame. I burst di sincronizzazione contengono le informazioni sul conteggio del frame (in 42 Capitolo 2. TWNET: Tetra Wireless NETwork figura 2.1 i 17 e 18 del master-link) e dello slot di appartenenza (in figura 2.1 da 1 a 4). Il terminale DM-MS master quindi si mette in ascolto dei burst di sincronizzazione ritrasmessi dal DM-REP sul link slave a conferma che la sua segnalazione è stata ricevuta e gestita con successo dal dispositivo. Il DM-REP può variare il numero di frame ritrasmessi sul link slave, in questo esempio invia i burst di sincronizzazione in 2 frame per un totale di 8 burst. Il terminale DM-MS master quindi trasmette il traffico (tc in figura 2.1) nel successivo frame disponibile che nell’esempio è il frame 3 del master link. La figura illustra inoltre la posizione degli slot allocati alle richieste di pre-emption (p? in figura 2.1 vedi anche capitolo 2.1.4), gli slot per la linearizzazione (lch in figura 2.1) e i burst di sincronizzazione che indicano l’occupazione del canale (occ in figura 2.1) inviati nello slot 3 dei frame 6 e 12, e negli slot 1 e 3 del frame 18. Ai livelli più alti della pila, la chiamata inizia con l’invocazione della primitiva DMCC-SETUP request da parte dell’applicazione utente. Se il canale risulta libero il Direct Mode Call Control (DMCC) inizia la procedura di attivazione della chiamata creando ed inviando al livello MAC un messaggio di DM-SETUP. Se i livelli inferiori riescono con successo a stabilire la chiamata questa informazione viene comunicata all’applicazione utente con un messaggio di conferma e con l’avvio del timer DT311 (300ms) in modo che la comunicazione non superi il tempo della prenotazione del canale. Nel caso le procedure di attivazione della chiamata non vadano a buon fine per la presenza di una chiamata già attiva sul canale, la procedura può essere interrotta tramite l’invio di un messaggio di DMCC-RELEASE o può essere invocata la procedura per il pre-emption. Nel caso in cui il canale risulti libero, il DMCC degli altri terminali viene allertato della presenza di una chiamata entrante con la ricezione del DM-SETUP PDU, questi reagisce inviando al- 2.1. Lo standard Tetra 43 l’applicazione utente una segnalazione tramite il messaggio DMCC-SETUP e si mette in attesa di una risposta. Se l’applicazione è in grado di ricevere la chiamata invia come replica un messaggio di DMCC-SETUP response, il quale configura il livello MAC per la ricezione del traffico e quindi assume il ruolo di slave. In caso contrario l’applicazione segnala la sua impossibilità di ricevere la chiamata inviando un DMCC-RELEASE request, in questo caso il DMCC configura lo stato del MAC come idle ed abbandona la procedura di set-up. Figura 2.2: Call setup senza presence check In presenza di un DM-REP intermedio la messaggistica scambiata a livello di processi è analoga; il DM-REP si limita infatti a re-inoltrare quanto ricevuto seguendo lo schema aria visto in precedenza. 44 Capitolo 2. TWNET: Tetra Wireless NETwork Frame # 16 2 17 3 4 1 2 18 3 4 1 2 1 Slot # 1 3 Master sup sup sup sup sup sup sup sup sup sup sup 4 1 2 lch 4 Slot # 1 Master tc 2 5 3 4 1 tc 2 cn 6 3 p? 4 1 tc 2 4 1 2 cn 4 1 2 3 4 occ 1 2 tc cnk 8 3 4 1 tc 4 cn 7 3 3 3 cnk Slave Frame # 2 3 2 9 3 p? 4 1 2 3 4 tc Slave Tabella 2.3: Occupazione di frame e slot nella chiamata con presence check Chiamata individuale con presence check Le chiamate di gruppo possono essere stabilite soltanto tramite la modalità descritta precedentemente mentre, per le chiamate dirette ad un destinatario singolo, esiste la possibilità di attivare la comunicazione voce solo con terminali che riscontrino la propria presenza. La procedura per stabilire una chiamata con il presence check è simile a quella senza il riscontro ma successivamente al burst di frame dedicati al set-up della chiamata (sup in figura 2.3) il master attende una risposta da parte del destinatario per poter trasmettere i primi dati di traffico. Il destinatario della chiamata, che assumerà inizialmente il ruolo di slave, risponde trasmettendo un messaggio di connect (cn in figura 2.3) su più frame per segnalare la propria presenza sul canale di trasmissione. Dopo la segnalazione il master risponde inviando un messaggio di ack (cnk in figura 2.3) per convalidare la creazione effettiva della connessione fra i due terminali. L’opzione del presence check a fronte di un ritardo nei tempi di setup della chiamata permette di ottimizzare l’utilizzo del canale e il risparmio energetico dei terminali impedendo di iniziare chiamate senza la presenza del destinatario. Analizziamo adesso il comportamento della procedura in caso di presenza di un repeater considerando la trama in aria. 2.1. Lo standard Tetra 45 Figura 2.3: Struttura della trama temporale nel set-up di una chiamata con presence check tramite repeater La procedura inizia in maniera simile al caso di set-up senza presence check, ma il messaggio di set-up nel burst di sincronizzazione (sup in figura 2.3, con 7 inviati in questo esempio) ora richiede una risposta indicante la presenza della DM-MS che è destinatario della chiamata. Lo slave per la comunicazione risponde sul link slave con il messaggio connect (cn in figura 2.3) che indica la sua disponibilità a ricevere la trasmissione. In questo esempio, lo slave linearizza il trasmettitore nello slot 1 del frame 2 del link slave, inviando un messaggio di connect nello slot 3 di questo frame e ripetendo poi il messaggio di connect nel frame seguente. Tale messaggio è ritrasmesso dal DM-REP alla master DM-MS nel frame apposito sul link master (in questo caso i frame 4 e 5). Al ricevimento del connect il master risponde con un messaggio di riscontro della connessione (cnk in figura 2.3) inviandolo in almeno un frame e quindi inizia la trasmissione del traffico nel frame 7 del link master. La procedura di call set-up con presence check al livello superiore viene avviata se il DMCC-SETUP request indica che è richiesto il controllo di presenza. Il DMCC converte la richiesta di set-up in un messaggio DM- 46 Capitolo 2. TWNET: Tetra Wireless NETwork SETUP PRES PDU, lo invia ed entra nello stato CALL SETUP PRESCHECK ORIGINATING. Dopo la trasmissione aspetta un DMAREPORT indication dal livello 2 che lo informa del progresso della procedura. Se il DMSETUP PRES PDU è stato trasmesso correttamente il DMCC avvia il timer DT303 (250ms) ed aspetta una risposta. Se infine riceve una DM-CONNECT PDU, accetta la richiesta di servizio e: • invia come risposta un DM-CONNECT ACK PDU; • entra nello stato CALL ACTIVE TX OCCUPATION; • invia all’applicazione utente DMCC-SETUP confirm; • crea un DMC-CONFIGURE request; • interrompe il timer DT303 (250ms); • avvia il DT311 (300ms). Quando invece si riceve un DM-DISCONNECT PDU viene inviato un DMRELEASE PDU e si ritorna in uno stato IDLE. Anche nel caso che termini il timer DT303 il DMCC invia un DM-RELEASE PDU; successivamente potrà inviare di nuovo un DM-SETUP PRES PDU oppure notificare all’applicazione utente un DMCC-RELEASE indication. La notifica di una chiamata in entrata ad un DMCC sarà fatta dalla ricezione di un DM-SETUP PRES PDU. Se l’applicazione utente non può ricevere la chiamata sarà immediatamente inviato un DMCC-RELEASE request: il DMCC invierà un DM-DISCONNECT PDU indicando la causa del rifiuto e ritornerà nello stato IDLE. Altrimenti se il DMCC desidera ricevere la chiamata: • risponderà con un DMCC-SETUP response; 2.1. Lo standard Tetra 47 • invia un DM-CONNECT PDU contenente le informazioni del servizio offerto; • avvia il timer DT307 (350ms) e aspetta la risposta dal DM-MS chiamante. Se entro il tempo fissato dal timer riceve un DM-CONNECT ACK PDU allora notifica un DMCCCOMPLETE indication ed entra nel nuovo stato CALL ACTIVE RX OCCUPATION. Altrimenti il timer DT307 termina, il DMCC notifica un DMCCRELEASE indication e ritorna allo stato IDLE. Figura 2.4: Call setup con presence check Anche in questo caso, in presenza di repeater, la procedura è sostanzialmente identica; si noti però che i timer hanno un valore (consigliato) maggiore: 550 ms per il DT303 e 450 ms per il DT 307. 48 Capitolo 2. TWNET: Tetra Wireless NETwork Chiamata tramite DM-GATEway Nel caso sia presente un DM-GATE la procedura di set-up si differenzia nel caso di chiamata individuale o di gruppo e se generata lato TMO o DMO. Se generata dal lato TMO è con presence check, se individuale, e senza presence check, se di gruppo; non considereremo in seguito tali procedure poiché non coinvolte nel progetto oggetto di questa tesi. Ci soffermeremo invece sulle procedure di set-up di chiamata sia di gruppo che individuale generate lato DMO: in tal caso le chiamate sono senza presence check anche se una procedura implicita fra DM-MS e DM-GATE è presente come sarà più chiaro in seguito. Chiamata di gruppo da DM-MS attraverso il DM-GATE Il diagramma temporale in figura 2.5 mostra la call set-up da un DM-MS attraverso il DM-GATE. Il disallineamento iniziale tra lo slot 1 della trama DMO e lo slot 1 del down link TMO è supposto essere di 3 slot. Dopo aver seguito le procedure per la verifica dello stato del canale, e supposto che sia stato trovato libero, il terminale DM-MS chiamante può linearizzare il trasmettitore. Fatto ciò, invia il messaggio di richiesta di set-up gsu sul canale DMO indirizzandolo al gateway. In questo esempio il gateway invia il messaggio USETUP usu sull’uplink TMO, 3 slot dopo aver decodificato con successo il primo burst di set-up dalla DM-MS. E’ una scelta del gateway se inviare o no delle DM-GACK intermedie alla DM-MS chiamante durante la gestione del set-up di chiamata lato TMO (usu + dscn). La SwMI ha immediatamente risorse disponibili e risponde inviando la D-SETUP e la D-CONNECT ai membri del gruppo TMO e al gateway, rispettivamente, nello stesso slot (dscn). Al tempo stesso richiede anche un riscontro di livello 2 (l2a) dal gateway in un sub slot riservato sul canale di 2.1. Lo standard Tetra 49 Figura 2.5: Struttura temporale set-up chiamata di gruppo tramite DM-GATEway traffico allocato (slot 3). Se la SwMI risponde velocemente non c’è necessità di un riscontro intermedio alla DM-MS e quindi il gateway può rispondere alla DM-MS chiamante con il messaggio DM-GCONNECT. Il messaggio è anche usato per riallineare lo slot e la numerazione dei frame sul canale DMO. Nel frattempo, in assenza di traffico reale, il gateway genera PDU nulle nell’uplink TMO. La DM-MS, dopo aver ricevuto il DM-GCONNECT dal gateway, assume il ruolo di master, applica la nuova temporizzazione stabilita dal gateway e genera i messaggi di DM-SETUP sul canale DMO per avvertire i membri del gruppo chiamato; infine procede ad inviare il suo traffico che è trasmesso dal gateway sul canale TM uplink 3 slot dopo e dalla SwMI sul canale TM downlink dopo altri 2 slot. La figura 2.5 illustra, lato DMO, la posizione degli slot allocati alle richieste di pre-emption (p? in figura 2.5) ed ai burst di sincronizzazione che denotano l’occupazione del canale (occ in figura 2.5) che sono gli slot 3 del frame 6 e 12 e gli slot 1 50 Capitolo 2. TWNET: Tetra Wireless NETwork e 3 del frame 18. E’ mostrato anche, nello slot 3 del frame 1 sul canale DMO, il segnale di presenza che viene trasmesso dal gateway nello slot 3 dei frame 1, 7 e 13 durante l’occupazione da parte di una DM-MS come master. In generale, una chiamata di gruppo iniziata da una DM-MS verso membri presenti sia sul canale DMO che nel sistema TMO deve tenere conto del tempo di risposta del sistema TMO, poiché può impiegare anche molto tempo per rispondere ad un set-up di chiamata: lato DMO il DM-GATE deve mantenere aperta la procedura di set-up mediante l’invio delle DM-GACK e abilitare la conclusione del set-up stesso (invio su) solo quando l’apertura della chiamata lato TMO gli viene confermata. La figura 2.6 mostra le PDU inviate in aria lato DMO e TMO durante un set-up di chiamata via DMGATE. Figura 2.6: Sequenza degli scambi di PDU nel set-up della chiamata 2.1. Lo standard Tetra 51 L’approccio di base della sequenza dei messaggi per una richiesta di chiamata (individuale o di gruppo) originata da una DM-MS prevede la richiesta iniziale, un riscontro intermedio opzionale ed un riscontro positivo o negativo finale. Durante la call set-up il gateway è il master del canale, la DM-MS chiamante inizia la procedura con il messaggio DM-GSETUP che è inviato sul canale DMO verso il gateway. Questo inoltra una U-SETUP al SwMI e aspetta per un D-CONNECT in risposta che contiene l’allocazione del canale, in attesa del messaggio può essere inviato un riscontro alla DM-MS chiamante (DM-GACK) per prevenire il ripetersi delle richieste di call set-up e quindi la generazione della segnalazione di prenotazione. Alla ricezione del D-CONNECT il gateway invia un DM-GCONNECT alla DM-MS chiamante che quindi assume il ruolo di master e inizia la chiamata seguita dal traffico. I messaggi di DM-SETUP e il traffico sono ricevuti sia dal gateway che dai membri DMO del gruppo. Chiamata individuale da DM-MS attraverso il DM-GATE Il diagramma temporale in figura 2.7 mostra la segnalazione per il set-up di una chiamata individuale da una DM-MS ad una MS nel sistema TMO. Il processo inizia quando la DM-MS invia la richiesta di chiamata DMGSETUP (gsu in figura 2.8) dopo aver determinato la numerazione di frame e di slot sul link stabilito dal segnale di presenza del gateway. La richiesta di set-up viene inoltrata alla SwMI che a sua volta contatta la TM-MS (è una scelta del gateway se, durante la procedura, inviare un riscontro intermedio alla DM-MS chiamante prima di inviare la call set-up alla SwMI). In questo esempio, la richiesta è inviata al sistema TMO (usu) prima che il riscontro intermedio del gateway (gak ) sia inviato alla DM-MS. Alla ricezione di un U-CONNECT dalla TM-MS contattata, la SwMI invia un D-CONNECT e 52 Capitolo 2. TWNET: Tetra Wireless NETwork Figura 2.7: Diagramma temporale della segnalazione di set-up di chiamata con DM-GATE 2.1. Lo standard Tetra 53 un D-CONNECT ACKNOWLEDGE (dcnk in figura 2.8) al gateway ed alla TM-MS rispettivamente inviando cosı̀ l’allocazione di canale nello slot 3 della stessa portante (in questo esempio). Il gateway quindi invia il riscontro finale, DM-GCONNECT (gcn), alla DM-MS chiamante ridefinendo la numerazione di slot se necessario per l’allineamento con il canale TM. In questo caso, il messaggio ritarda la numerazione di slot di due, mantenendo la differenza di tre slot fra canali DM e TM. Il gateway invia anche PDU nulle alla SwMI finché la DM-MS chiamante non è pronta ad inviare traffico. Dopo la ricezione del riscontro finale, il terminale chiamante diventa master del canale DM, e quindi segue lo standard DM per le procedure di call set-up inviando i messaggi di DM-SETUP seguiti dal traffico. Figura 2.8: Struttura temporale set-up chiamata di gruppo tramite DM-GATEway 54 Capitolo 2. TWNET: Tetra Wireless NETwork Chiamata di emergenza L’interfaccia aria DM supporta le chiamate di emergenza: un terminale DMMS che inizia una chiamata di emergenza può usare un canale DM e, se necessario, fare la pre-emption di qualunque comunicazione a più bassa priorità eventualmente presente sul canale. Il servizio DMO permette ad una comunicazione DM di essere inibita per supportare il servizio di chiamate di emergenza. Pre-emption Durante una chiamata DM un terminale DM-MS, che può o non può essere implicato nella chiamata corrente, potrebbe voler accedere al canale per una ragione di priorità come una chiamata di emergenza. In questo caso esiste un meccanismo di pre-emption del canale già occupato come illustrato in figura 2.9. Figura 2.9: Occupazione slot durante una chiamata in DMO La prima sequenza master mostra il normale progresso di una chiamata con burst di traffico nello slot 1. Un terminale DM-MS che vuole usare il canale deve, se non partecipante alla chiamata, aver prima determinato il suo stato scoprendo cosı̀ la chiamata in corso. Successivamente deve sincronizzarsi con il terminale DM-MS master e determinarne poi lo stato temporale, incluso i numeri di frame e di slot. Quindi per eseguire la pre-emption, il ter- 2.1. Lo standard Tetra 55 minale DM-MS trasmette un messaggio di richiesta (prq in figura 2.9) in uno degli slot allocati per questo scopo (durante l’occupazione, la pre-emption è permessa nello slot 3 dei frame 2, 5, 8, 11, 14, e 17). Quando il master decodifica con successo la richiesta, assunto che sia una richiesta valida, annuncia la sua accettazione e la conseguente chiusura della chiamata in corso sia al terminale DM-MS che ne ha fatto richiesta sia agli altri terminali coinvolti nella chiamata. Questo annuncio è fatto per mezzo del messaggio di riscontro specifico della procedura (par e pa in figura 2.9), successivamente al suo invio il master cede il proprio ruolo e rilascia il canale. Il terminale che ha richiesto la pre-emption con successo trasmette i messaggi di set-up per la nuova chiamata, con un nuovo indirizzo di gruppo o individuale, e ne diventa il master. In figura 2.10 è illustrata tale procedura in presenza di DM-REP. Figura 2.10: Occupazione trama temporale durante pre-emption con la presenza di DM-Repeater La prima sequenza master mostra il normale progresso di una chiamata attraverso un DM-REP con burst di traffic nello slot 1 di ogni frame (dal 1 al 17) sul link master ritrasmessi poi dal DM-REP sul link slave. Una 56 Capitolo 2. TWNET: Tetra Wireless NETwork DM-MS che vuole usare il canale deve, se non partecipante alla chiamata, per prima cosa determinare lo stato del canale e in questo caso identificare che è presente una chiamata in corso attraverso un DM-REP. La DM-MS che fa pre-emption si deve quindi sincronizzare con la trasmissione del DM-REP sul link slave e determinare lo stato temporale del canale, incluso il numero di frame e di slot del link slave. Per effettuare la pre-emption, la DM-MS trasmette un messaggio di richiesta (prq in figura 2.10) in una posizione appropriata della struttura a frame nel link slave (durante l’occupazione, la procedura è permessa solo nello slot 3 nei frame 2, 5, 8, 11, 14 e 17). Quando la stazione master decodifica con successo la richiesta di pre-emption ripetuta dal DM-REP sul link master, assumendo sia una richiesta valida, informa che il canale è stato prenotato sia alla DM-MS che esegue la richiesta che alle altre DM-MS, che erano parte della chiamata in corso. Questa informazione è inviata attraverso il messaggio di riscontro (par e pa in figura 2.10) inviati sul link master e quindi ripetuti sul link slave, una volta inviati i messaggi di riscontro il master cessa il suo ruolo e rilascia il canale. La DM-MS che ha avviato la procedura con successo trasmette i messaggi di set-up al DMREP usando il link master per la nuova chiamata, con un nuovo indirizzo di gruppo o individuale, e diventa master per la sua transazione iniziale. In questo esempio la trasmissione del traffico inizia allo slot 1 del frame 15 del link master. Si noti che in questo esempio la DM-MS che fa pre-emption non include un aggiustamento temporale all’interno della richiesta e quindi, nella nuova set-up, mantiene lo stesso riferimento temporale e numerazione dei frame usati dalla vecchia DM-MS master. Durante la chiamata attraverso un gateway una DM-MS, indipendentemente dal fatto che stia o no partecipando alla chiamata in corso, può voler accedere al canale DMO per ragioni di priorità come un’emergenza. Anche 2.1. Lo standard Tetra 57 in questo caso esiste un meccanismo di pre-emption per il canale attualmente occupato. E’ illustrato in figura mostrando il caso in cui una TM-MS stia trasmettendo attraverso il gateway e una DM-MS debba fare pre-emption. Analizzando il comportamento in aria, per effettuare la pre-emption la DM-MS invia un messaggio di richiesta (gprq in figura 2.11) in una posizione apposita della struttura a frame DM (durante l’occupazione la procedura è permessa solo nello slot 3 dei frame 2, 5, 8, 11, 14 e 17). Al ricevimento della richiesta il gateway invia il messaggio U-TX DEMAND alla SwMI nello slot 3 del frame 7 sul TM uplink, questo è il primo frame possibile poiché lo slot 3 del frame 6 non avrebbe avuto un tempo sufficiente per decodificare la richiesta di pre-emption ricevuta nello slot precedente. In questo esempio la SwMI ordina alla TM-MS trasmittente di fermare la trasmissione e contemporaneamente assegna il permesso di trasmettere al gateway (dtgi in figura 2.11), chiedendo un riscontro di livello 2 da ambedue le parti. Il gateway quindi informa la DM-MS che fa pre-emption di questo usando il messaggio DM-GPRE ACCEPT che viene inviato negli slot di traffico (slot 1) dei frame 8 e 9 sul canale DM insieme con il messaggio DM-TX CEASED (gpac). Il messaggio DM-GPRE ACCEPT è ripetuto nello slot 3 di ambedue i frame per incrementarne l’affidabilità (gpa). Alla ricezione di questi frame di riscontro la DM-MS richiedente trasmette una sequenza di messaggi di set-up come master (su in figura 2.11). Si noti che, dopo l’assegnazione della trasmissione da parte della SwMI, il gateway invia PDU nulle fino a che non viene ricevuto traffico dalla DM-MS. Analizzando il diagramma temporale di scambio dei messaggi di livello superiore, la pre-emption viene usata quando un terminale C vuole interrompere o subentrare ad una chiamata fra un terminale A e un terminale B. La chiamata con pre-emption può essere fatta unicamente se la chiama- 58 Capitolo 2. TWNET: Tetra Wireless NETwork Figura 2.11: Occupazione trama temporale durante la richiesta di pre-emption con DM-GATEway 2.1. Lo standard Tetra 59 ta in corso è ad una priorità minore o non ha la priorità settata. Nel caso in cui la pre-emption sia valida, il DMCC invia un DM-PREEMPT alla stazione master ed entra nello stato PRE-EMPTION attendendo la risposta. Se riceve un DM-PRES ACCEPT PDU, il terminale C procede con una call setup in maniera analoga a quanto visto precedentemente. Se invece riceve un DM-REJECT PDU il DMCC informa l’applicazione utente con un DMCC-RELEASE indication e ritorna allo stato IDLE. Figura 2.12: Scambio di messaggi durante la pre-emption al livello DMCC In presenza di un repeater la sequenza temporale di scambio dei messaggi sostanzialmente non varia, limitandosi il repeater a re-inoltrare in aria i messaggi ricevuti. In presenza di gateway una DM-MS può sempre fare pre-emption ad un’altra DM-MS. Si noti comunque che, tranne il caso in cui un’altra DMMS stia parlando, in presenza di gateway quest’ultimo è sempre il master. In questo caso, infatti, la DM-MS dovrà inviare una PDU particolare, la 60 Capitolo 2. TWNET: Tetra Wireless NETwork DM-GPREEMPT PDU. Il gateway risponde la DM-GACK PDU indicando che la richiesta è stata ricevuta e quindi la DM-MS si mette in attesa per DT308 (30 s). Entro tale tempo deve ricevere una DM-GPRE ACCEPT PDU o una DM-GREJECT PDU che indicano l’accettazione o meno della richiesta. Diverso il caso in cui sia il gateway a fare pre-emption: in questo caso la DM-MS master deve sempre rispettare la richiesta di pre-emption del gateway indipendentemente dalla sua priorità. Figura 2.13: Scambio di messaggi durante la pre-emption al livello DMCC in presenza di DM-GATEway In questo esempio una TM-MS sta inviando traffico che è poi trasmesso dal gateway sul canale DM, il quale agisce come master. Per fare la pre-emption, la DM-MS invia un messaggio DM-GPREEMPT. Quando il 2.1. Lo standard Tetra 61 gateway decodifica con successo la richiesta, assumendo sia una richiesta valida, invia una richiesta di trasmissione alla SwMI usando un’U-TX DEMAND PDU con la priorità fissata in modo appropriato. E’ una scelta del gateway se riscontrate il ricevimento della richiesta di pre-emption usando un messaggio intermedio di riscontro (DM-GACK) prima di inviare la U-TX DEMAND alla SwMI. La SwMI ordina alla TM-MS trasmittente di fermarsi usando il messaggio D-TX INTERRUPT e, in questo esempio, contemporaneamente assegna il permesso di trasmettere al gateway usando il messaggio D-TX GRANTED. Alla ricezione di questo messaggio il gateway consegna il canale alla DM-MS usando il messaggio DM-GPRE ACCEPT e inviando anche il messaggio DM-TX CEASED. La DM-MS richiedente quindi invia un DM-SETUP come master seguito dal traffico. In figura 2.13 è illustrata la temporizzazione della procedura di pre-emption. Changeover Una chiamata DM è costituita da una o più call transaction ognuna delle quali avente un suo master (che può anche rimanere lo stesso) e uno o più slave. La procedura che consente di effettuare un cambio di ruoli, che permette cioè ad uno slave di diventare il nuovo master, è denominata changeover ed è illustrata in figura 2.14. Figura 2.14: Occupazione trama temporale durante una richiesta di changeover 62 Capitolo 2. TWNET: Tetra Wireless NETwork Giunti al termine del periodo di trasmissione del traffico voce, il master DM-MS indica che la sua call transaction è arrivata alla fine, inviando un messaggio di cessazione della fase di trasmissione (txc in figura 2.14). Questo messaggio è inviato almeno due volte nello slot 1 in frame consecutivi e usando lo stesso formato di burst del traffico normale. I riceventi della chiamata sono quindi a conoscenza della terminazione della chiamata e che il master DM-MS sta riservando il canale DM per la stessa chiamata per un certo periodo di tempo. Durante questo periodo, uno qualunque degli slave della chiamata può richiedere di diventare il nuovo master mediante l’invio del messaggio di richiesta di changeover (txr in figura 2.14) che è inviato in uno degli slot 3 allocati dal protocollo a questo tipo di richieste. Le collisioni fra messaggi di richiesta di changeover e di pre-emption può talvolta avvenire, ma il protocollo è progettato per controllare tale contesa con un meccanismo di ritrasmissione con accesso casuale. Alla ricezione di una richiesta valida di changeover, il master rilascia il canale al richiedente usando una serie di messaggi di riscontro di changeover (txa in figura 2.14). Al termine della trasmissione dei messaggi di riscontro, il richiedente trasmette una sequenza di messaggi di set-up in burst di sincronizzazione (su in figura 2.14), il cui effetto è di far diventare il terminale il nuovo master della chiamata e dare inizio ad una nuova call transaction. La figura 2.14 si applica sia a chiamate di gruppo che a quelle individuali ma, nelle chiamate di gruppo, ci potrebbe essere una collisione fra più terminali DM-MS che richiedono contemporaneamente di effettuare questo procedimento. In questo caso una procedura di riprova casuale del controllo a contesa è effettuata come illustrato nella figura 2.15. In questo esempio due slave DM-MS trasmettono una richiesta di changeover contemporaneamente. Queste richieste possono interferire e produrre un 2.1. Lo standard Tetra 63 Figura 2.15: Occupazione trama temporale durante una richiesta di changeover in chiamate di gruppo risultato illeggibile. Il master pertanto non riceve nessuna richiesta chiara e mantiene il canale nella modalità riservata, trasmettendo il segnale apposito (rsv in figura 2.15), fino a che un’altra richiesta di changeover viene ricevuta con successo o il timer di prenotazione scade e il canale è rilasciato totalmente. Nell’esempio lo slave 1 trasmette una seconda richiesta di changeover, che in questo caso ha successo e diventa quindi il nuovo master. Analizziamo adesso il caso in cui sia presente un terminale DM-REP. In figura 2.16 è illustrata la procedura di changeover in questo caso. Figura 2.16: Occupazione trama temporale durante una richiesta di changeover in presenza di DM-REPeater 64 Capitolo 2. TWNET: Tetra Wireless NETwork Per cambiare il mittente di una chiamata, il master indica prima che la sua chiamata è terminata, usando un messaggio di cessazione chiamata (txc in figura 2.16). Questo messaggio è inviato almeno due volte nello slot 1 di frame consecutivi sul link master e usando lo stesso formato dei burst del traffico normale, questi messaggi vengono quindi ritrasmessi dal DM-REP sul link slave (tcx’ ). I destinatari della chiamata che sono in ascolto sul link slave sono quindi a conoscenza del termine della chiamata e possono quindi richiedere al master, attraverso il DM-REP di continuare con una nuova chiamata. Il messaggio di richiesta di changeover (txr in figura 2.16) in questo esempio è inviato dalla DM-MS richiedente nel prossimo slot 3 disponibile sul link slave seguente la ricezione del txc’. Questa richiesta viene ritrasmessa dal DM-REP nel frame appropriato sul link master. Alla ricezione di una richiesta di changeover valida (txr’ ), il master consegna il canale al richiedente usando una serie di messaggi di riscontro (txa in figura 2.16), trasmessi i riscontro sul link master, il master diventa slave e non ha più responsabilità sul canale. Alla ricezione del messaggio di riscontro di changeover ripetuto (txa’ ), il richiedente trasmette una sequenza di messaggi di set-up nei burst di sincronizzazione (su in figura 2.16) sul link master usando in questo caso la stessa temporizzazione di frame e di slot del precedente master. L’azione di inviare la sequenza di set-up mette in atto il changeover con il richiedente che diventa il nuovo master della prossima chiamata. La numerazione di frame in figura 2.16 è stata scelta arbitrariamente come esempio ma, in questa figura, il primo burst di traffico nel nuovo master deve essere nel frame 5 (non mostrato in figura 2.16) sul link master. Si noti che la procedura di changeover quando operante con un DM-REP impiega più tempo che nel caso di link diretto MS-MS. Consideriamo adesso la procedura in presenza di gateway. In figura 2.17 2.1. Lo standard Tetra 65 è illustrata la temporizzazione del processo di changeover. La TM-MS indica che la sua chiamata è arrivata a fine, usando il messaggio U-TX CEASED (utxc in figura 2.17). La SwMI informa il gateway e riscontra la TM-MS usando i messaggi D-TX CEASED e richiede un riscontro di livello 2 ad ambedue, il gateway a turno informa la DM-MS usando il messaggio DMTX CEASED (txc in figura 2.17). Il messaggio di richiesta di changeover (gtxr in figura 2.17) in questo esempio è inviato da un terminale richiedente nel prossimo slot 3 disponibile sul canale DM seguente la ricezione del txc, assumendo che il gateway renda lo slot 3 del frame 7 disponibile per l’accesso random del DM-TX CEASED. Il gateway quindi effettua la richiesta di trasmissione alla SwMI (utxd ) prima di aver riscontrato la ricezione del messaggio di richiesta di changeover sul canale DM (gak in figura 2.17). Successivamente la SwMI dà il permesso di trasmettere e ricevere al gateway e alla TM-MS rispettivamente usando i messaggi D-TX GRANTED e chiedendo un riscontro di livello 2 ad ambedue. Alla ricezione di questo permesso dalla SwMI, il gateway quindi rilascia il canale alla DM-MS usando una serie di messaggi finali di riscontro (gtxa in figura 2.17), alla ricezione dei messaggi di riscontro, la DM-MS richiedente trasmette una sequenza di messaggi di set-up come master. Si noti che dopo la trasmissione concessa dalla SwMI, il gateway invia PDU nulle fino a che non riceve traffico dalla DM-MS. Analizziamo adesso la procedura dallo scambio di messaggi a livello più alto. Quando un terminale DM-MS ha finito una comunicazione invia una DM-TX CEASED PDU in broadcast per avvertire della fine della comunicazione. Tale PDU viene ricevuta dagli altri terminali DM-MS coinvolti nella chiamata. Un altro terminale DM-MS, che si suppone voglia richiedere il changeover, una volta ricevuta la PDU, invia una DM-TX REQUEST al- 66 Capitolo 2. TWNET: Tetra Wireless NETwork Figura 2.17: Occupazione trama temporale durante una richiesta di changeover in presenza di DM-GATEway l’attuale master che, nel caso in cui il primo terminale accetti la richiesta di changeover, invierà un DM-TX ACCEPT verso lo slave. La procedura continua quindi con la procedura di call set-up discussa precedentemente. In presenza di un DM-REP la procedura rimane sostanzialmente analoga. Nel caso di gateway, per la procedura di changeover sono necessarie le seguenti precisazioni. Innanzitutto c’è da dire che a termine di una chiamata il gateway assume sempre il ruolo di master, pertanto non sarà possibile avere una DM-MS master. Analizziamo adesso il caso di una procedura di changeover richiesta da un DM-MS slave in presenza di gateway. Questi deve inviare una DM-GTX REQUEST PDU diretta al gateway che risponderà con una DM-GACK PDU, a questo punto la DM-MS setterà il timer DT309 (10 s) entro il quale deve ricevere una DM-GTX ACCEPT PDU o una DMGREJECT PDU. Nel caso in cui il change-over venga accettato il terminale 2.1. Lo standard Tetra Figura 2.18: Scambio di messaggi durante changeover al livello DMCC 67 68 Capitolo 2. TWNET: Tetra Wireless NETwork potrà inviare una DM-SETUP PDU come master. In presenza di gateway, in una chiamata DM, ognuna costituisce una chiamata separata, con un certo master e uno o più slave, analogamente, in TMO, ogni chiamata comprende trasmissioni separate. Figura 2.19: Scambio di messaggi durante changeover al livello DMCC in presenza di DM-GATEway In questo esempio, il traffico è inviato come una chiamata individuale di una MS nel sistema TMO. Per fare il changeover il chiamante prima indica 2.1. Lo standard Tetra 69 che la sua chiamata è terminata, usando un messaggio U-TX CEASED, la SwMI informa il gateway usando in messaggio D-TX CEASED e successivamente il gateway a turno informa la DM-MS usando il messaggio DM-TX CEASED. In questo esempio la DM-MS vuole trasmettere e richiede il permesso dal gateway inviando il messaggio DM-GTX REQUEST, la ricezione di questo messaggio di richiesta di changeover può opzionalmente essere riscontrato dal gateway con il messaggio DM-GACK. Il gateway inoltra la richiesta alla SwMI usando il messaggio U-TX DEMAND, La SwMI quindi dà il permesso di trasmettere al gateway e riceve allo stesso tempo il permesso dalla TM-MS usando i messaggi D-TX GRANTED. Alla ricezione di questo permesso dalla SwMI, il gateway come master rilascia il canale alla DM-MS usando il messaggio DM-GTX ACCEPT, la DM-MS richiedente ora diventa il master, inviando il messaggio DM-SETUP seguito dal traffico. Servizi dati narrowband Il TETRA DM SDS supporta sia servizi punto-punto che punto-multipunto. L’SDS punto-punto offre l’opzione dei riscontri mentre il punto-multipunto è solo senza riscontri. L’SDS è essenzialmente un servizio di messaggistica ottimizzato al fine di garantire un servizio veloce per lo scambio di brevi messaggi di testo o di un breve messaggio predefinito come un messaggio di emergenza. Il messaggio è veicolato all’interno del canale di segnalazione e può essere inviato o ricevuto in parallelo con una chiamata voce o dati in corso. L’SDS può essere anche utilizzato per applicazioni come la localizzazione automatica dei veicoli (LIP) o per il supporto della sicurezza (OTAR). L’SDS in DM supporta l’invio di messaggi la cui lunghezza in bit non superi i 2047. I messaggi possono essere inviati su canale libero oppure tramite stealing (solo STATUS) o call transaction all’interno di una chiamata. Possono 70 Capitolo 2. TWNET: Tetra Wireless NETwork essere inviati attraverso un DM-REP ed essere diretti verso o ricevuti dal sistema V+D tramite un DM-GATE. Un messaggio breve punto-punto è inviato da una MS mittente ad una MS ricevente utilizzando la frequenza radio portante DM selezionata. La MS destinataria è indirizzata attraverso il suo ITSI usando lo schema di indirizzamento standard, la ricevente riscontra la ricezione del messaggio, se è stato richiesto, e la MS mittente può riprovare l’invio un certo numero di volte se il riscontro è atteso e non viene ricevuto. Un messaggio breve punto-multipunto è inviato da una MS mittente a un gruppo di una o più MS riceventi usando la frequenza radio portante DM selezionata. Il gruppo è indirizzato attraverso il suo GTSI utilizzando lo schema di indirizzamento standard. Non ci sarà riscontro dalle MS riceventi in questo caso, ma la MS mittente potrà ritrasmettere il messaggio un certo numero di volte per aumentare il livello di affidabilità dell’invio. Una DM-MS che vuole inviare un messaggio breve senza riscontro segue le procedure per accertarsi dello stato del canale, se il canale è nello stato free, la DM-MS può linearizzare il suo trasmettitore. Quindi stabilisce la sincronizzazione con il canale e contemporaneamente si pone come master trasmettendo una sequenza di intestazioni DM-SDS UDATA usando la struttura DSB (sdu in figura 2.20, dove sono 8 i messaggi inviati in questo esempio). Il messaggio intestazione DM-SDS UDATA contiene le informazioni sul conteggio del frame che, in questo esempio, definisce la loro posizione nella struttura temporale nei frame 17 e 18 della struttura multi frame ciclica a 18 frame. La stazione master DM-MS trasmette quindi le parti rimanenti del messaggio breve (sd in figura 2.20), senza la ripetizione e usando la struttura DNB, nello slot 1 dei frame successivi. In questo esempio le parti rimanenti del messaggio occupano tre slot e sono inviate nei frame da 1 a 3. Per affidabilità, la stazione DM-MS può ripetere l’invio del messaggio completo 2.1. Lo standard Tetra 71 immediatamente, senza ricontrollare che il canale sia libero, e iniziando di nuovo con le DSB. In esempio c’è la ripetizione completa di un messaggio, con le DSB inviate nei frame 4 e 5, e le tre DNB inviate nei frame 6 e 8. La figura 2.20 illustra inoltre dove la segnalazione di pre-emption è permessa durante la trasmissione di un SDS. Brevi DSB di occupazione sono inviati nello slot 3 dei frame 6, 12 e 18 durante la trasmissione dei DNB. Figura 2.20: Occupazione della trama per l’invio di un SDS Si considera adesso il caso di un SDS inviato attraverso un DM-REP. Una DM-MS che vuole inviare un SDS senza riscontro attraverso un DMREP segue le procedure per accertarsi dello stato del canale, a condizione che il canale sia trovato libero la DM-MS può linearizzare il trasmettitore. Quindi stabilisce la sincronizzazione con il canale e contemporaneamente il suo ruolo a master inviando una sequenza di intestazioni DM-SDS UDATA sul link master, in un appropriato numero di frame. Le intestazioni DMSDS UDATA contengono informazioni sul conteggio dei frame, che definisce la loro posizione nella struttura temporale ciclica multi frame a 18 frame, nell’esempio mostrato in figura 2.21, sono inviati 7 burst di sincronizzazione (sdu in figura 2.21) contenenti informazioni sul conteggio di frame e definendo la loro posizione nei frame 17 e 18. Il master DM-MS quindi rimane in ascolto di DM-SDS UDATA ritrasmesso dal DM-REP sul link slave come conferma che la sua segnalazione al DMREP è avvenuta con successo. Il DM-REP può trasmettere in un numero 72 Capitolo 2. TWNET: Tetra Wireless NETwork diverso di frame dal numero usato dal master DM-MS. Comunque, in questo esempio, invia i burst di sincronizzazione in 2 frame per un totale di 8 burst. Il master DM-MS quindi trasmette la parte rimanente dell’SDS (sd in figura 2.21), senza ripetizione nello slot 1 del seguente frame. In questo esempio le parti rimanenti del messaggio occupano due slot e sono inviate nel frame 3 e 4. Per affidabilità, la master DM-MS può ripetere il messaggio completo immediatamente (senza verificare di nuovo che il canale sia libero), in esempio c’è una ripetizione del messaggio, inviato nei frame 5 e 6. La figura 2.21 illustra anche dove il segnale di pre-emption è permesso durante la trasmissione di un SDS. Figura 2.21: Occupazione della trama per l’invio di un SDS in presenza di DMREPeater Il protocollo per l’invio di DM SDS in presenza di un gateway è simile a quello base, in presenza di sole DM-MS. Gli SDS possono essere inviati in tutti i modi consentiti e le PDU sono le stesse. Esistono però alcune differenze infatti gli SDS sono riscontrati solo a livello 2 sul sistema TMO. Per coerenza quando una DM-MS invia un SDS attraverso un gateway usando il servizio con riscontro, il riscontro è generato dal gateway come equivalente del riscontro a livello 2 del TMO. I gateway quindi inoltrano gli SDS alla 2.1. Lo standard Tetra 73 SwMI usando le procedure appropriate definite per il caso base. Gli SDS possono essere inviati anche da utenti TMO a una o più DM-MS attraverso il gateway: questo riceve l’SDS dalla SwMI e genera un riscontro di livello 2 se richiesto, quindi inoltra l’SDS sul canale DM verso la o le DM-MS. Analizziamo adesso la procedura di invio di SDS senza riscontro dal punto di vista dello scambio di messaggi ad alto livello. Tale procedura può essere avviata solo in caso di canale libero e prevede l’invio di un certo numero di DM-SDS UDATA consecutivi. Poiché tale procedura è senza riscontro, maggiore è il numero di DM-SDS UDATA PDU che vengono inviate e maggiore è l’affidabilità della procedura. Figura 2.22: Scambio di messaggi a livello DMCC durante l’invio di SDS Status messages Gli status messages sono inviati dai terminali al fine di comunicare in automatico lo stato del nodo. Gli status messages sono caratterizzati da: • i dati sono inviati come valori numerici a 16 bit; • 32768 valori sono liberi mentre il resto sono riservati al sistema; • sono convertiti in testo al terminale e workstation ricevente; 74 Capitolo 2. TWNET: Tetra Wireless NETwork • veloci ed efficienti; • facili da usare. Text messages I messaggi di testo sono invece messaggi inviati dagli operatori che utilizzano i terminali. Sono caratterizzati da: • ne esistono 4 tipi diversi: SDS-1, SDS-2, SDS-3 and SDS-4; • SDS-1, -2 e -3 sono a lunghezza fissa (16, 32, 64 bits); • SDS-4 è a lunghezza variabile (massimo 2047 bits). L’identificatore di protocollo definisce come SDS-4 è usato; l’uso più comune e messaggio di testo (140/160 caratteri) e Authomatic Vehicle Location; • il testo è inserito attraverso la tastiera del telefono, dispositivo unico per voce e dati. Servizi dati a circuito Una connessione bearer è una comunicazione dati punto-punto o punto-multipunto fra una MS chiamante e una o più MS chiamate. Può essere effettuata solo fra MS che hanno selezionato la stessa frequenza portante radio DM con modo di operazione simplex. TETRA DMO offre tre tipi di connessioni dati a circuito dipendentemente dal fatto che i dati siano meno protetti, dal livello di protezione desiderato. La differenza fra servizi bearer protetti e non protetti è che il servizio bearer protetto fornisce la protezione di errore come definito nella clause 8 di [8]. Il risultato è un canale più affidabile e robusto a spesa di una riduzione del data rate effettivo di utente. 2.1. Lo standard Tetra 75 Servizi a circuito non protetti I servizi a circuito non protetti supportano connessioni punto-punto (chiamate individuali) e punto-multipunto (chiamate di gruppo). Il throughput dati all’interfaccia utente è 7,2 kbit/s. Servizi a circuito protetti I servizi a circuito protetti supportano connessioni punto-punto e punto-multi punto. Sono definiti sei tipi di servizi protetti in TETRA DMO offrendo due livelli differenti di protezione contro gli errori usando una protezione di tipo forward nello stream di dati trasmessi. La protezione agli errori è come definita in [8] e i sei servizi offrono throughput dati all’interfaccia utente con 4,8 kbit/s o 2,4 kbit/s con rate di protezione agli errori di approssimativamente 2/3 e 1/3, rispettivamente. Per avere una protezione ulteriore contro gli errori, interleaving con profondità 1, 4 o 8 possono essere usati insieme ai due livelli di protezione dell’errore, risultando cosı̀ sei opzioni di servizio. La trasmissione della voce attraverso connessioni a circuito protette non è standardizzata ma il suo uso non è specificatamente escluso. 2.1.5 La sicurezza nel Tetra DMO La modalità DMO permette agli utenti Tetra di parlare e scambiare dati sfruttando il collegamento radio diretto senza la gestione delle BS Tetra. Le stazioni vengono organizzate in gruppi, all’interno dei quali ogni utente è implicitamente autenticato attraverso la conoscenza dei parametri di cifratura comuni al gruppo. Esistono due ulteriori modalità di utilizzo del Tetra DMO: la modalità Repeater e Gateway. La prima modalità viene utilizzata per connettere all’interno del gruppo un device Tetra con un altro sfruttando un nodo intermedio (il repeater), qualora la copertura radio del singolo dispositivo non dovesse essere sufficiente a raggiungere il destinatario. La 76 Capitolo 2. TWNET: Tetra Wireless NETwork seconda invece viene utilizzata per interfacciare la rete Tetra TMO con un gruppo DMO che potrebbe non trovarsi sotto copertura delle BS. Air interface encription Nella modalità DMO, Tetra offre quattro possibili livelli di sicurezza: • DM-1: E’ il livello base, in cui non vengono implementate primitive crittografiche e tutto il contenuti informativo viene fatto passare in chiaro sulla rete. • DM-2-A: Viene criptato il traffico utente e segnalazione. La parte del pacchetto contenente gli indirizzi è in chiaro. Questa classe permette di usare un repeater con address check indipendentemente che questo sia in possesso delle chiavi crittografiche. • DM-2-B: Viene criptato anche la parte dell’indirizzo di destinazione (SSI) e tutto il traffico SDU. La funzione di repeater non è compromessa (il repeater non deve possedere le chiavi) ma non viene verificato l’indirizzo di destinazione. La sorgente del messaggio è in chiaro, quindi un eventuale terzo terminale può effettuare pre-emption. • DM-2-C: Viene criptato tutto il pacchetto di sincronismo e tutto il traffico SDU e PDU, in particolare tutti gli indirizzi. Eventuali dispositivi intermedi devono essere a conoscenza delle chiavi. Il primo compito dei terminali Tetra quando vogliono iniziare una chiamata è quello di stabilire e concordare il livello di sicurezza da usare. La classe di sicurezza usata dovrà essere mantenuta per tutta la durata della comunicazione. Ogni MS deve mantenere un profilo di sicurezza associato a ciascun indirizzo destinatario. Ogni singolo profilo di sicurezza consta di: 2.1. Lo standard Tetra 77 • Un Identificativo del KSG usato per la cifratura (KSG-Identifier) • L’identificativo della chiave (Static Cipher Key) SCK usata per la trasmissione (SCKN) • L’identificativo della chiave SCK in ricezione • La classe sicurezza di preferenza e quella minima usata per la trasmissione • La minima classe accettata per la ricezione • La classe minima accettata da parte del master della chiamata per le operazioni di pre-emption. Nella fase di set-up della chiamata vengono comunicati, da parte del master, i parametri di sicurezza contenuti nel frame DMAC-SYNC. Il destinatario della chiamata confronta tali parametri di sicurezza con quelli propri predefiniti per la comunicazione con quell’indirizzo chiamante: se risultano essere identici i KSG usati, le chiavi appartenenti allo stesso Key Association Group (KAG) e il livello di sicurezza uguale o superiore a quello minimo, la chiamata viene accettata. In caso contrario viene inviato un messaggio di “security parameter mismatch” se si sta usando la modalità presence-check, altrimenti viene semplicemente ignorata la richiesta. Lo stesso procedimento viene usato anche da parte del master qualora gli venga fatta una richiesta di pre-emption da parte dello slave. In modalità DMO una procedura di autenticazione esplicita non è prevista, la conoscenza delle chiavi SCK per un determinato gruppo DMO prova implicitamente l’autenticità della MS. Le chiavi SCK possono essere installate, fino ad un massimo di 30, direttamente sui singoli terminali con procedure off-line o alternativamente possono 78 Capitolo 2. TWNET: Tetra Wireless NETwork essere distribuite utilizzando l’infrastruttura Tetra TMO attraverso il protocollo OTAR. Ogni MS dispone di 30 Static Cipher Keys utilizzabili, per far si che la comunicazione possa avvenire, tra due dispositivi deve esistere almeno una chiave in comune da poter usare per la cifratura. Lo stesso vale nel caso in cui per la comunicazione venga usato un repeater con address check o un gateway. Ogni chiave ha un durata di utilizzo, al termine del quale viene sostituita da un’altra chiave scelta all’interno del set di chiavi di quel gruppo DMO. Per facilitare tali procedure di gestione delle chiavi durante una chiamata, è previsto un ulteriore sotto-raggruppamento delle chiavi, associando uno o più identificativi SCKN con un Group Short Subscriber Identity GSSI. Ogni sottogruppo di chiavi SCK associati ad un GSSI, prende il nome di Key Association Group KAG, ogni MS individua una chiave di default in un KAG per la trasmissione, mentre potrà utilizzare le altre per la ricezione. Ogni GSSI associato ad un SCKN avrà tante corrispondenti chiavi associate quante sono i subset, cioè uno per ogni subset, per esempio, se vengono creati tre subset, ciascuno sarà formato da 10 chiavi e se un determinato GSSI era associato al numero SCKN 3, dopo la suddivisione, sarà associato alla chiave 3 di ciascun subset ovvero la SCKN 13 e la SCKN 23. Oltre alla suddivisione statica delle chiavi in sottogruppi esiste anche una procedura dinamica. Il meccanismo OTAR può essere utilizzato se il terminale ha un accesso TMO per associare una determinata chiave di cifratura ad un certo indirizzo destinatario. E2E encryption Questo meccanismo di cifratura viene applicato solo al traffico e alla segnalazione proveniente dallo strato dell’utente (U-plane). Lo standard ETSI non si occupa di descrivere gli algoritmi di cifratura da usare o come gestire le chiavi cifratura, ma definisce un meccanismo di sincronia 2.1. Lo standard Tetra 79 quando vengono usati degli stream cipher per criptare il traffico. La cifratura end-to-end ha i seguenti requisiti: • lo stesso meccanismo deve essere usato in entrambe le direzioni • i processi di sincronizzazione nelle due tratte devono risultare indipendenti • la cifratura E2E fa parte dell’user plane (è quindi indipendente dall’AIE) • il trasporto dell’informazione in chiaro e cifrata devono mantenere la struttura temporale Assumiamo che il processo di cifratura avvenga attraverso un KSG che in questo caso prenderà il nome di End-to-End KSG (EKSG). Il KSG ha due input: una chiave di cifratura (CK) ed un vettore di inizializzazione (IV). Il blocco funzionale F1 cifra il testo in chiaro con il bit stream in uscita dall’EKSS (un generatore di numeri pseudo random), generando il testo cifrato. Dall’altro lato la funzione F1 inversa decifra il testo in chiaro utilizzando il bit stream sincronizzato. La funzione F2 introduce delle informazioni di sincronia che al ricevitore verranno estratte dalla funzione F3 per sincronizzare l’EKSS. Collegato al blocco funzionale per le cifratura/decifratura, sarà presente un interfaccia di controllo che avrà i compiti di: • selezione della chiave CK • selezione dell’algoritmo KSG • gestire l’encryption state (on/off) 80 Capitolo 2. TWNET: Tetra Wireless NETwork Figura 2.23: Diagramma funzionale dei meccanismi di encryption e decryption Per evitare la ripetizione nella generazione dello streaming del KSG, il parametro IV può essere reso variabile in base al tempo. Nell’architettura TETRA il blocco funzionale dell’E2EE trova posto nell’User Plain allo strato superiore dell’AIE, che svolge le sue funzionalità in modo indipendente. Non esistono quindi requisiti sugli strati inferiori, se non il trasporto del bit di informazione negli header necessario a segnalare che il traffico è cifrato con cifratura E2E. 2.2 Integrazione rete Tetra DMO con rete wireless mesh L’obbiettivo prefissato del progetto TWNET è quello di creare una rete di accesso wireless basata sullo standard Tetra DMO per applicazioni di enti istituzionali in ambiti di emergenza. La rete sfrutta la modalità di comunicazione diretta dello standard e viene estesa utilizzando una rete wireless di 2.2. Integrazione rete Tetra DMO con rete wireless mesh 81 tipo ad-hoc, creando cosı̀ un’infrastruttura con i requisiti: • auto instradante; • non gerarchica; • facilmente collocabile; • adatta per applicazioni di emergenza. Inoltre la rete ad-hoc deve essere in grado di supportare connessioni multihop, aumentando la copertura della rete DMO che da standard non supporta questa funzionalità. Per garantire tali feature abbiamo selezionato una soluzione che prevede l’integrazione, nel sistema di telecomunicazione Tetra, di una rete MANET: Mesh Ad-hoc NETwork. Questo tipo di reti hanno la caratteristica di essere costituite da terminali dotati delle medesime funzionalità, in grado di auto organizzarsi rendendo superflua una qualsiasi infrastruttura fissa per fornire supporto alle comunicazioni. Il sistema risulterà quindi autonomo con sia i terminali utente Tetra che i nodi di accesso della rete MANET liberi di muoversi ed in grado di auto configurarsi dinamicamente per la creazione della rete TWNET. Gli scenari di rete che sono stati presi in considerazione sono principalmente due: • scenario isolato; • scenario interconnesso tramite gateway. La rete di supporto MANET viene fornita tramite il sistema di autoforming CADAE presentato nel capitolo 1 che garantirà una rete di supporto il più efficiente possibile, in grado di ridurre al minimo le interferenze elettromagnetiche per ottimizzare le comunicazioni wireless; quindi sarà garantita 82 Capitolo 2. TWNET: Tetra Wireless NETwork una estensione dei servizi Tetra su tale infrastruttura affrontando problematiche con complessità crescente col numero di terminali mobili che andranno ad utilizzare tale rete. 2.2.1 Elementi costitutivi la rete TWNET Lo scenario preso in considerazione per questo progetto, presentato in figura 2.24, costituisce l’obbiettivo ultimo del lavoro. Figura 2.24: Schema dello scenario TWNET Nella figura 2.24 si possono distinguere i tre agenti principali presenti nella rete TWNET: 1. Mobile Node 2. Terminale Tetra 3. Gateway Mobile Node Il Mobile Node è l’elemento costituente la rete ad-hoc ed ha il compito di interconnettere le varie isole Tetra DMO con la rete MANET, per far 2.2. Integrazione rete Tetra DMO con rete wireless mesh 83 questo deve essere in grado di trasportare la segnalazione DMO da e verso la rete di backbone. Quindi il fulcro dell’integrazione Tetra/Wi-fi risiede nelle caratteristiche eterogenee del nodo, che sarà, inoltre, in grado di svolgere sia il ruolo del comune terminale Tetra che di router mesh IP. Il Mobile Node deve quindi essere in grado di connettersi all’isola DMO come terminale ed implementare le funzionalità di controllo dei servizi di telefonia, deve avere funzionalità di routing cosı̀ da poter gestire l’instradamento dei pacchetti nella rete mesh ed infine essere in grado di connettersi sia con gli altri nodi mobili che con device IP, come per esempio un telefono VoIP o un Laptop. Inoltre devono essere implementate funzionalità per permettere ai nodi mobili di gestire la sicurezza delle comunicazioni, con particolare attenzione al supporto dei sistemi di cifratura forniti dallo standard Tetra DMO. Il Gateway Mobile Node è in tutti gli effetti un Mobile Node, dal quale eredita tutte le funzionalità, ma con alcune particolarità aggiuntive: infatti deve essere in grado di connettersi ad una rete integrata Tetra e comunicare con una Base Station. Infine il Terminale Tetra costituito da un device Tetra DMO standard che senza alcuna modifica deve essere in grado di comunicare con gli altri elementi della rete in maniera completamente trasparente, senza cioè accorgersi della presenza dell’infrastruttura TWNET. Quindi i macro-requisiti che il sistema TWNET deve rispettare sono: • L’interfaccia aria fra TETRA Terminal e Mobile Node deve essere conforme allo standard TETRA DMO al fine di rendere interoperabile il nodo mobile con TETRA Terminal di altri produttori. • Deve supportare la presenza di eventuali DM-REP (repeater secondo lo standard TETRA DMO) nelle isole. 84 Capitolo 2. TWNET: Tetra Wireless NETwork • Deve supportare la presenza di eventuali DM-GATE (gateway fra reti TETRA DMO e reti TETRA TMO) all’interno della rete. • La rete TwNET dovrà essere non gerarchica di tipo ad-hoc, fast-deployable, self-Forming and self-Configuring. • La rete TwNET deve sfruttare la modalità di comunicazione diretta (DMO) dello standard TETRA, interoperante con tecnologie Wireless LAN. • La rete TwNET dovrà esporre un’interfaccia di gestione per le funzioni di: Fault, Configuration, Accounting, Performance and Security. • La rete TwNET deve essere costituita da Nodi Mobili trasportabili su veicoli attrezzati (nodi di accesso trasportabili), pertanto facilmente dispiegabili nel territorio in condizioni di emergenza. • I Nodi Mobili trasportabili devono supportare modalità di comunicazione diretta Single hop e Multihop. • La rete TwNET deve prevedere l’utilizzo di Nodi Mobili Gateways trasportabili su veicoli attrezzati (nodi gateway trasportabili), pertanto facilmente dispiegabili nel territorio in condizioni di emergenza. • I Nodi Gateway devono supportare modalità di comunicazione verso infrastrutture GPRS/GSM, WiFi, WiMAX. 2.2.2 Soluzione integrata Tetra/IP Una delle possibili soluzione per l’integrazione fra due sistemi cosı̀ diversi come il Tetra DMO e una rete IP è quella di adottare una rete eterogenea. Infatti un sistema DMO non permette comunicazioni multihop ma soltanto 2.2. Integrazione rete Tetra DMO con rete wireless mesh 85 singlehop, l’unica estensione prevista da standard è costituita dall’adozione di DM-REP (Repeater) che permettono di estendere il raggio di copertura ma che non costituisce un nodo attivo della rete. Quindi la nostra soluzione permette di separare la rete di accesso che supporta lo standard DMO mentre la parte di trasporto dati e segnalazione (backbone) viene implementata su protocollo IP che risulterà però completamente trasparente alla rete di accesso. In questo modo riusciremo ad ottenere una rete ad-hoc multihop a banda larga sul lato di backbone, e una rete di accesso in grado di fornire gli stessi servizi implementati dalle reti Tetra DMO (chiamata, changeover, pre-emption, SDS). La scelta, lato backbone, di appoggiarci ad una rete WiFi permette l’utilizzo di una tecnologia molto diffusa ed a basso costo che però permette l’estensione dei servizi di rete DMO in ambienti dove fino ad ora non era possibile. Le caratteristiche delle reti WiFI sono principalmente: • basso costo di realizzazione; • la possibilità di creare reti mesh costituite da nodi multi-interfaccia; • alta diffusione; • interfacce con protocolli di routing: in ambito IEEE 802.11 sono state sviluppate metriche ed interfacce che permettono una gestione efficiente delle politiche di instradamento [9]; • ampiezza di banda diversi ordini di grandezza superiore rispetto a quella fornita dal Tetra DMO 50kbps contro 54Mbps dello standard IEEE 802.11 variante a o g; • il supporto a meccanismi di sicurezza avanzati forniti dallo standard IEEE802.11i; 86 Capitolo 2. TWNET: Tetra Wireless NETwork • la Quality of service fornita tramite il supporto a code di pacchetti differenziate per tipologia di servizio per supportare differenti priorità di traffico secondo lo standard IEEE 802.11e. 2.2.3 Nodo TWNET Il nodo mobile risulta essere l’elemento base di tutto il sistema TWNET, come abbiamo visto deve integrare sia le funzionalità di un terminale Tetra che quelle di un router mesh. Le funzionalità che devono essere implementate sono derivate dall’implementazione DM-MS, inoltre non può essere introdotta alcuna modifica nell’interfaccia aria prevista dallo standard ETSI. Quindi per rendere possibile l’interfacciamento con la rete MANET si rende necessaria un’estensione dell’implementazione DMO sui terminali DM-MS che permetta lo scambio delle informazioni legate al progetto TWNET. Il Mobile Node può essere visto come costituito da due componenti fondamentali: 1. Mobile Terminal (MT): si sviluppa dal DM-MS standard che gestisce i servizi lato DMO 2. Terminal Equipment (TE): che realizza la connessione fra DM-MS e la rete TWNET Ogni nodo mobile può ricoprire tre macro stati: • Idle: il nodo non è coinvolto nel routing di una chiamata o di un sds, quindi nell’isola DMO di appartenenza non è attiva alcuna chiamata. • Master: il nodo mobile è attivo nel routing di una chiamata TWNET dove l’isola di appartenenza è destinataria. 2.2. Integrazione rete Tetra DMO con rete wireless mesh 87 • Slave: il nodo mobile è attivo nel routing di una chiamata TWNET, in questo caso la sorgente della chiamata proviene dall’isola di appartenenza. Il nodo mobile è attivo nel indirizzamento della chiamata ma non è in grado di parteciparvi come destinatario, ne di attivarne una; i suoi compiti si limitano alla gestione del traffico ed alla sua esportazione/importazione verso/dalla rete TWNET. I suoi compiti dipendono strettamente dallo stato in cui si trova il nodo: quando questi è il Master della chiamata, il suo compito è quello di memorizzare le informazioni contenute nelle PDU ricevute dalla rete multihop per ricostruire i dati da inviare sull’isola DMO; inoltre deve accertare la presenza nella propria isola di competenza di device Tetra, come repeater o gateway, per poter stabilire correttamente il protocollo da utilizzare. Nel caso in cui il nodo mobile sia Slave deve elaborare le informazioni esportate dall’isola DMO, prelevare i campi delle PDU, creare il pacchetto di comunicazione TWNET per inviarlo all’interno della rete IP. Il protocollo TWNET Per permettere il corretto invio e ricezione delle informazioni prelevate da un isola DMO e per renderne possibile il re-invio all’interno delle isole destinatarie si è reso necessario la definizione di un protocollo di trasmissione per coordinare i vari cambiamenti di stato dei nodi mobili all’interno della nostra rete. La comunicazione delle segnalazioni e dei dati (voice + data) tipici del DMO verranno cosı̀ incapsulati in pacchetti IP/UDP composti a livello applicativo da due sezioni: header TWNET e payload TWNET. Header TWNET Sono stati definiti vari tipi di pacchetti TWNET, per poter distinguere le segnalazione dal traffico voce e per meglio gestire le fasi 88 Capitolo 2. TWNET: Tetra Wireless NETwork di start-up di una chiamata. L’header (Tabella 2.4) risulta essere uguale per tutti i vari tipi di frame ed è costituito da vari campi: • PDU Type: lunghezza 8 bit, distingue le varie tipologie di PDU. • AIE settings: lunghezza 40 bit, contiene i campi necessari per ricostruire la cifratura AIE nell’isola di destinazione; è costituito da 4 sotto campi: 1. Air interface encryption state (2 bit); 2. Time variant parameter (29 bit); 3. KSG number (4 bit); 4. Encryption key number (5 bit). • Unique ID: lunghezza 8 bit, identifica in maniera univoca la PDU all’interno della rete TWNET per evitare ambiguità e risolvere problemi generati da eventuale replicazione dei messaggi a livello della rete IP. Tale campo è costruito nel seguente modo: se è possibile ricavare il numero del frame contenuto nella PDU proveniente dall’isola DMO (numero compreso fra 1 e 18) il campo sarà costituito da: 1. 3 bit impostati a 0; 2. 5 bit contenenti il Frame Number esportato dal DMO. Se il numero non permette un’identificazione univoca (nel caso degli SDS la stessa PDU viene ripetuta su più frame non rendendo univoco il Frame Number), tale campo sarà del tipo: 1. 1 bit impostato a 1; 2.2. Integrazione rete Tetra DMO con rete wireless mesh 89 2. 7 bit generati a partire dal frame number e da altre informazioni presenti in modo da generare un numero che possa essere associato univocamente con la PDU. In questo modo associando lo Unique ID insieme ai campo Called party TSI e Calling party TSI è possibile identificare in modo quasi univoco la PDU. Resta l’ambiguità in cui venga inviata una stessa PDU dallo stesso mittente, allo stesso destinatario, nello stesso Frame Number ma in un superframe diverso. • Destination address type: lunghezza 4 bit, identifica il tipo di indirizzo del destinatario e viene utilizzato a livello 2. Indica se l’SSI è o true o pseudo. • Called party TSI: contiene il GTSI o l’ITSI del destinatario della chiamata o del SDS. Si tratta, rispettivamente, o di indirizzo di gruppo o individuale. • Source address type: identifica il tipo dell’indirizzo del mittente. • Calling party TSI: contiene l’indirizzo del mittente. • Area selection area master: lunghezza 48 bit, identifica l’isola chiamante, potrebbe corrispondere all’ITSI del Mobile Node dell’isola chiamante. • Area selection isola slave flag: lunghezza 8 bit, indica se il campo Area selection isola slave: è inserito. • Area selection isola slave: lunghezza 48 bit, identifica il Mobile Node dell’isola destinataria della chiamata. Questo è un campo opzionale non è sempre presente in tutte le PDU. 90 Capitolo 2. TWNET: Tetra Wireless NETwork Information Elements Lenght Type PDU type 8 M AIE settings 40 M Unique ID 8 M Destination address type 4 M Called party TSI 48 M Source address type 4 M Calling party TSI 48 M Area selection isola master 48 M Area selection isola slave flag 4 M Area selection isola slave 48 C Reserved 16 M Header TWNET 280 M Tabella 2.4: Schema del Header delle PDU TWNET • Reserved: lunghezza 16 bit, e destinato ad usi futuri. Struttura dei pacchetti TWNET Abbiamo visto che vi sono due tipi di pacchetti che vengono generati dai sistemi Tetra DMO, e si distinguono dalla componente che li ha generati (Capitolo 2.1.1): i pacchetti di segnalazione vengono creati dal control plane, mentre i pacchetti traffico voce e dati sono generati a livello utente dallo user plane. Nel sistema integrato TWNET i pacchetti a livello 1 e 2 lato DM-MS vengono definiti dallo standard Tetra, mentre i pacchetti a livello superiore possono essere costituiti da un header TWNET a livello di rete e protocollo UDP a livello trasporto. In tabella 2.5 sono rappresentati gli schemi di incapsulamento dei pacchetti TWNET. 2.2. Integrazione rete Tetra DMO con rete wireless mesh Call Control Tetra voice 91 SDS UDP IP Tabella 2.5: Struttura dei pacchetti TWNET Struttura Hardware La soluzione TWNET prevede quindi l’integrazione di un terminale Tetra DMO con un router wireless mesh per creare il Mobile Node. Questi due elementi devono essere in grado di scambiarsi dati e informazioni di controllo tramite un’interfaccia interna al nodo secondo un protocollo di segnalazione. Quasi tutti i terminali Tetra in commercio implementano lo standard ETSI PEI(Peripherical Equipment Interface) [10], che fornisce un interfaccia di comunicazione che può essere collegata a diversi connettori fra cui una porta seriale RS-232 o USB; solitamente lo standard PEI viene utilizzato per inviare e ricevere comandi AT, abbiamo quindi scelto di usare questa interfaccia per connettere il Terminal Equipment al Mobile Terminal. Nello sviluppo del nostro prototipo è stata usata una connessione seriale RS-232 per poter utilizzare anche terminale Tetra più datati e non dotati di connettore USB. 2.2.4 Sviluppo software di intercomunicazione Pe2Ne: Pei to Network Si è reso indispensabile lo sviluppo lato TE di un software per ricevere ed inviare dati da e verso l’interfaccia PEI, tradurre i comandi AT ed incapsularli in pacchetti UDP per inviarli nella backbone multihop. I requisiti di tale software sono: 92 Capitolo 2. TWNET: Tetra Wireless NETwork Figura 2.25: Interfacce e PDU presenti nello scenario integrato • Portabilità: deve poter girare sia su router mesh wireless equipaggiati con processore ARM big-endian, sia su workstation x86 little-endian. • Real Time: il software deve essere in grado di gestire sia la segnalazione su seriale, sia il traffico di rete con vincoli temporali stringenti, in modo da poter garantire un servizio di comunicazione di tipo voce molto sensibile ai ritardi di trasmissione. • Efficienza: le piattaforme su cui girerà il software saranno, fra le altre, dei router mesh embedded caratterizzati dai bassi consumi, alimentate Power over Ethernet, ma dotate di scarse capacità di calcolo e con poche risorse di memoria. Particolare attenzione è stata quindi posta per sviluppare un software leggero, in grado di utilizzare il minor quantitativo possibile di risorse di sistema, garantendo però le funzionalità necessarie allo scopo. • Affidabilità: si è prestato attenzione in fase di design e sviluppo per garantire la disponibilità del servizio, sia tramite un attento processo di testing del codice sia nella creazione della macchina a stati che deve 2.2. Integrazione rete Tetra DMO con rete wireless mesh 93 essere dotata di procedure di recovery per evitare blocchi del servizio e monitorare il funzionamento del Mobile Terminal. La scelta quindi è ricaduta sullo sviluppo di un software C++, denominato pe2ne (PEI to NEtwork), utilizzando solo librerie standard, disponibili per entrambe le architetture in oggetto, e sviluppato con particolare attenzione verso la portabilità del codice. Il software girerà come demone sulle macchine che andranno a costituire il nostro prototipo di rete, queste saranno dotate di sistema operativo GNU/Linux ed in particolar modo di distribuzione OpenWRT [1] e Ubuntu [11]: la prima una distribuzione specifica per piattaforme embedded, che fornisce una completa toolchain per lo sviluppo di applicativi e la loro integrazione con il sistema operativo; la seconda è una delle più diffuse distribuzioni linux per desktop. L’obiettivo principale del progetto è quindi quello di creare un estensione per il Tetra DMO: questa modalità di funzionamento, come visto nel capitolo 2.1.1, prevede una sola comunicazione contemporanea che quindi coinvolge anche i terminali non direttamente interessati dalla chiamata (saranno impossibilitati ad effettuare chiamate poiché il canale di trasmissione risulterà occupato). Tutte le segnalazioni e i dati che verranno quindi esportati da un’isola DMO verso la rete devono essere propagati verso tutti i Mobile Node presenti nella rete multihop, per preservare il corretto comportamento dei servizi di una rete DMO. Per questo motivo i pacchetti entro la rete mesh saranno inviati con indirizzo di destinazione di Broadcast, le problematiche di loop nelle trasmissioni di frame e ricezioni multiple sono risolte sia da politiche di rilevamento loop che da controlli implementati nel software per il riconoscimento di pacchetti replicati; inoltre la particolare struttura ad albero binario creata dal sistema CADAE (presentata nel capitolo 1) permette una maggiore resistenza a problemi del genere. 94 Capitolo 2. TWNET: Tetra Wireless NETwork Lato rete IP il demone deve agire come un modem software fra il Tetra e la rete multihop, affrontando tutte le problematiche di sistemi di questo tipo, deve cioè essere in grado di esportare correttamente tutte le informazioni da un dominio DMO, inviarle nella rete correttamente incapsulate in un frame IP/UDP ed infine riuscire ad importare tali informazioni nelle altre aree DMO. Deve quindi comportarsi come un interfaccia in grado di: • leggere e scrivere i campi dei pacchetti Tetra sulla porta seriale; • leggere e scrivere i campi dei pacchetti Tetra nei datagrammi UDP che verranno usati nella rete di backbone; • leggere e scrivere gli appropriati comandi AT sull’interfaccia PEI. Le interfacce che sono coinvolte nelle comunicazioni fra due isole tramite l’infrastruttura TWNET sono schematizzate in figura 2.25. Come abbiamo già visto i terminali Tetra sono in grado di esportare informazione e segnali di controllo attraverso l’interfaccia PEI: tale standard definisce sia la sintassi di comandi AT per inviare istruzioni finalizzate alla lettura e scrittura di dati sul terminale, ma definisce anche la sintassi di alcuni messaggi non sollecitati inviati dal terminale al manifestarsi di un certo evento lato radio (per esempio una chiamata entrante o un SDS). Permette inoltre la generazione di chiamate, trasmissione di SDS o la richiesta di changeover senza coinvolgere la componente MMI del terminale (Man Machine Interface). Il software Pe2ne, girando come demone sul TE, legge le notifiche AT non sollecitate da un lato e utilizzerà i comandi AT di set e read per riprodurre lo stesso evento negli altri punti della rete multihop. Anche i dati voce vengono trasportati nello stesso modo, infatti le informazioni sulle chiamate vengono esportate sulla PEI come comandi AT e formattate secondo lo standard ISI [12]. In questo modo il Mobile Node che gestisce l’isola DMO originante la chiamata preleva i dati, 2.2. Integrazione rete Tetra DMO con rete wireless mesh 95 tramite i messaggi non sollecitati sulla seriale, questi vengono incapsulati ed inviati sulla backbone; dall’altra parte i pacchetti, decapsulati, permettono la creazione di comandi AT che vengono inviati sulla seriale all’interfaccia PEI degli altri Mobile Node coinvolti nella chiamata. Eventuali problematiche di questa soluzione derivano esclusivamente dalla banda disponibile per la connessione verso la PEI: infatti la connessione scelta per i prototipi, una seriale RS-232, ha come transfer rate massimo 112500 bit/s che rappresenta un collo di bottiglia nel flusso di dati scambiati fra due isole (il percorso del flusso dati è sintetizzato in figura 2.25). Nonostante i terminali Tetra forniti per la creazione del prototipo di rete TWNET implementino la libreria standard ETSI AT, questa presenta delle lacune di funzionalità per gli obiettivi del progetto. Infatti pe2ne necessita l’accesso ad un ampio numero di parametri, sia sotto forma di messaggi non sollecitati che tramite l’uso di comandi di set e read, rendendo cosı̀ necessaria un’estensione alla libreria per implementare dei nuovi tipi di comandi e segnalazioni. Per esempio un nodo mobile in un isola destinataria di una chiamata deve essere in grado di cambiare l’indirizzo del terminale chiamante che deve infatti risultare quello del mittente che ha iniziato la procedura all’interno di un’altra isola; mentre, utilizzando le librerie fornite, la chiamata nell’isola destinatario risulterebbe come originata dal suo nodo mobile master. Un’ulteriore estensione ai comandi AT è l’implementazione dei messaggi per l’estrazione e l’inserimento dei frame di voce da e verso il Mobile Terminal. Quindi molte modifiche sono state eseguite anche su firmware e software del Tetra MT all’interno del Mobile Node, che dovranno gestire quindi comandi ed esportare notifiche non sollecitate non standard, mantenendo contemporaneamente la retro compatibilità con la libreria standard ETSI AT. 96 Capitolo 2. TWNET: Tetra Wireless NETwork Finite State Machine Uno dei principali problemi è mantenere la macchina a stati finiti del software sul TE sincronizzata con quella interna del MT, infatti non è in grado di prelevare, tramite PEI, lo stato attuale del terminale Tetra; conseguentemente la macchina a stati di pe2ne deve essere rigidamente vincolata ai messaggi inviati ed alle risposte ricevute dall’interfaccia PEI. Ogni volta che viene inviato un comando, viene ricevuto un messaggio di risposta, OK, se il messaggio è sintatticamente corretto, o un messaggio ERROR se non corretto o incompleto. Inoltre i passaggi di stato saranno vincolati non solo dalle risposte di verifica sintattica ma anche da messaggi di risposta alle read o dalle notifiche non sollecitate, quindi la macchina a stati deve prevedere ogni tipo di trasmissione effettuate nei passaggi da uno stato all’altro. In figura 2.26 e in figura 2.27 vengono presentate le macchine a stati di una chiamata senza presence check sia dal lato dell’isola originante la chiamata, sia dal lato dell’isola destinataria; si può notare lo scambio di comandi sulla seriale e le rispettive risposte che vincolano i vari passaggi di stato. Le procedure schematizzate in queste FSM verranno presentate ed illustrate successivamente al paragrafo 2.2.4. Il software inoltre gestisce l’esportazione real time dei frame voce inviati dal MT sulla PEI in modo asincrono per soddisfare i requisiti tipici di questa tipologia di traffico: tali dati devono essere forniti ed inviati secondo stretti requisiti in termine di latenza, jitter e error rate. In particolar modo il jitter è il parametro più importante per garantire una buona qualità del servizio [13]; solitamente una buona soluzione per ridurre il jitter è implementare un buffer per i frame voce, ma visto anche i particolari vincoli sulle risorse di sistema il buffer non deve superare una certa dimensione per evitare l’esaurimento delle risorse sul TE. Per ovviare a ciò abbiamo optato per una soluzione con due 2.2. Integrazione rete Tetra DMO con rete wireless mesh 97 +CTICN IDLE WAIT_SLAVE_CTCC +CTCR/SEND_UDP_RELEASE TIMEOUT SLAVE_RESERVED +CTCC ERROR +CTCR/SEND_UDP_RELEASE TIMEOUT TIMEOUT TIMEOUT +TWNCSD +CDTXG WAIT_TWNCSD SLAVE WAIT_TWNCALL +TWNCALL/SEND_UDP_CALL +CDTXC +TWNBLK/SEND_UDP_DATA Figura 2.26: Macchina a stati finiti del Mobile Node sull’isola origine READ_UDP_CALL/AT+TWNCALL +OK/AT+CTSDC IDLE SENT_TWNCALL SENT_CTSDC TIMEOUT +CTCR TIMEOUT READ_UDP_CALL_DROP/ATH MASTER_RESERVED ERROR WAIT_ACK_RELEASE TIMEOUT +OK/ATD READ_UDP_CALL_DROP/ATH READ_PTT_PRESS/AT+CUTXD TIMEOUT +OK/AT+CUTXC TIMEOUT +OK READ_PTT_REL/AT+TWNCSD SENT_TWNCSD TIMEOUT MASTER WAIT_ACK_DATA READ_UDP_DATA/AT+TWNBLK SENT_ATD +CTCC TIMEOUT +CTOCP WAIT_MASTER_CTCC +OK WAIT_CTOCP Figura 2.27: Macchina a stati finiti del Mobile Node sull’isola destinataria 98 Capitolo 2. TWNET: Tetra Wireless NETwork buffer di dimensioni dell’ordine dei 10 frame, uno implementato dal software pe2ne sul TE ed il secondo quello già presente all’interno del software del MT. La soluzione del doppio buffer si è resa necessaria, nonostante la presenza di una struttura analoga all’interno dei terminali Tetra, vista l’impossibilità di avere informazioni lato TE sullo stato di riempimento dello stesso e quindi l’impossibilità di controllare il flusso dei dati voce verso il MT. Chiamata voce senza presence check In questo contesto operativo il Mobile Node deve fornire le seguenti funzionalità: • il MT deve essere in grado di ricevere tutte le chiamate dell’isola, includendo chiamate di gruppo e chiamate singole con identificativo TETRA destinatario diverso dal proprio • il MT deve essere in grado di processare il traffico aria ed esportare sulla PEI i comandi AT in forma di Unsolicited Read Codes (comandi di lettura informazioni asincroni) • il MT deve essere in grado, una volta instaurata la chiamata, di esportare la voce sulla seriale PEI secondo il formato descritto dalla definizione ISI [12] • il MT deve essere in grado di processare i comandi AT provenienti dal TE e tradurli in segnalazione aria al fine di realizzare il setup e la successiva gestione della chiamata secondo lo standard DMO • il MT deve essere in grado di variare la propria TETRA Identity • il TE deve essere in grado di inviare verso il MT i comandi AT (standard ed aggiuntivi) necessari a trasmettere in aria la giusta segnalazione DMO 2.2. Integrazione rete Tetra DMO con rete wireless mesh 99 • il TE deve essere in grado di leggere il flusso voce dalla PEI e tradurlo in stream di pacchetti UDP da inviare sul backbone Wi-Fi • il TE deve essere in grado di rilevare segnalazione duplicata e gestirla evitando loop • il TE deve essere in grado di gestire la segnalazione in banda trasmessa durante l’invio del flusso voce Call Setup La prima fase analizzata è quella di Call Setup. In questa fase sull’isola sorgente il MN deve ricevere la segnalazione aria ed esportare sulla PEI i comandi AT necessari a veicolare tutti i parametri che serviranno a valorizzare i campi delle PDU backbone. La procedura TWNET per segnalare la presenza di una Call Setup prevede l’invio di un pacchetto dal MN dell’isola mittente ai MN delle isole di destinazione (vedi figura 2.28); tale pacchetto del tipo PDU CALL SETUP è formato dall’header TWNET più alcuni campi specifici (schematizzati nella tabella 2.6). Figura 2.28: TWNET Call Setup Tale PDU, in relazione alla Figura 2.28, dovrà essere composta a partire dai dati inoltrati sulla PEI all’interno del MN sull’isola sorgente e, dopo aver attraversato la rete multihop, sarà utilizzata dal TE del MN dell’isola 100 Capitolo 2. TWNET: Tetra Wireless NETwork Information Elements Lenght Type PDU type 8 M AIE settings 40 M Unique ID 8 M Destination address type 4 M Called party TSI 48 M Source address type 4 M Calling party TSI 48 M Area selection isola master 48 M Area selection isola slave flag 4 M Area selection isola slave 48 C Reserved 16 M Pre-emption flag 1 M Circuit mode type 4 M Priority level 2 M End to end encryption flag 1 M Call type flag 1 M Tabella 2.6: Campi del PDU CALL SETUP 2.2. Integrazione rete Tetra DMO con rete wireless mesh 101 destinazione per valorizzare i parametri dei comandi AT necessari ad eseguire il setup della chiamata. Dal lato dell’isola sorgente il MN riceve segnalazione aria indicante che uno dei terminali attivi nella propria zona di copertura intende effettuare una chiamata voce. Si assume che nessuna altra chiamata sia in corso e che non ci sia nessun terminale nello stato di master reservation (caso in cui la procedura corretta non è la call-setup ma la preemption od il changeover). Il MT all’interno del TWNET MN dovrà quindi essere in grado di ricevere segnalazione aria proveniente dal terminale TETRA dell’utente e provvedere a creare la CALL SETUP PDU i cui campi sono stati forniti in tabella 2.6. In corrispondenza della ricezione di una chiamata entrante, sia essa di gruppo che individuale, il MT esporterà in modo non sollecitato sulla PEI i comandi elencati sotto. <CR><LF> +CTICN: <CC instance>,<call status>,<AI service> <calling party identity type>,<calling party identity>, <priority level> <CR><LF> <CR><LF> +CTCC: <CC instance>,<hook>,<simplex>,<AI service>, <e to encryption>,<comms type>,<slots/codec>, <proprietary>,<Tx Grant> <CR><LF> <CR><LF> +TWNCALL: <called party identity type>,<called party identity>, <call frame number> <CR><LF> 102 Capitolo 2. TWNET: Tetra Wireless NETwork Originariamente nelle librerie standard vengono esportati solamente i primi due comandi +CTICN e +CTCC di cui il primo con soltanto i primi tre campi obbligatori e i restanti facoltativi; nella nostra soluzione forzeremo l’esportazione di tutti i parametri facoltativi rendendoli di fatto mandatori. Il valore assunto dal campo <CC instance>, che solitamente in DMO è sempre uguale a 0, per l’utilizzo in TWNET è modificato per assumere i seguenti possibili valori: • 10000000 (binario) = 128 (decimale): per notificare la comunicazione tramite gateway; • 01000000 (binario) = 64 (decimale): per notificare la comunicazione con repeater; • 00000000 (binario) = 0 (decimale): per notificare la comunicazione con protocollo MS-MS. Il comando +TWNCALL invece è completamente nuovo alle librerie standard e permette, in fase di setup, di esportare l’indirizzo destinatario, elemento fondamentale per l’instaurarsi della chiamata ma che da librerie non poteva essere ottenuto via PEI. Il PDU CALL SETUP viene valorizzato come descritto in tabella 2.7 Per settare il valore del campo Call type flag si osserva il parametro <comms type>. Nel mondo DMO esso può assumere tre soli valori: • 0 chiamata punto-punto senza presence check • 1 chiamata di gruppo • 3 chiamata punto-punto con presence check 2.2. Integrazione rete Tetra DMO con rete wireless mesh Information Elements 103 Lenght Details PDU type 8 2 AIE settings 40 0(non usato) Unique ID 8 <call frame number> da +TWNCALL Destination address type 4 <called party identity type> da +TWNCALL Called party TSI 48 <called party identity> da +TWNCALL Source address type 4 <calling party identity type> da +CTICN Calling party TSI 48 <calling party identity> da +CTICN Area selection isola master 48 autogenerato Area selection isola slave flag 4 0 Area selection isola slave 48 0 (non utilizzato) Reserved 16 0 Pre-emption flag 1 1 Circuit mode type 4 0 (fonia) Priority level 2 <priority level> da +CTICN End to end encryption flag 1 <e to encryption> da +CTCC Call type flag 1 <comms type> da +CTCC Tabella 2.7: Valori dei campi del PDU CALL SETUP 104 Capitolo 2. TWNET: Tetra Wireless NETwork Information Elements Lenght Details CC Instance 8 da +CTCC Destination address type 4 da +TWNCALL Called party TSI 48 da +TWNCALL Source address type 4 da +CTICN Calling party TSI 48 da +CTICN Isola partner 48 NULL Pre-emption flag 1 1 Circuit mode type 4 0 (fonia) Priority level 2 da +CTICN End to end encryption flag 1 da +CTCC Call type flag 1 da +CTCC Tabella 2.8: Valori degli attributi di TwnetCallData Per questo motivo si opera come segue: <comms type> = 1 o 3 → Call type flag = 0 altrimenti → Call type flag = 1 Al termine dell’invio della CALL SETUP PSU il software pe2ne provvederà ad immagazzinare in una struttura dati apposita i dettagli sulla chiamata di cui sta facendo il routing verso la rete in modo da evitare di dover ricevere nuovamente via PEI le informazioni già esportate durante la setup e necessarie per la trasmissione delle successive segnalazioni e del traffico voce. Dato che per design il Mobile Node può gestire solo una chiamata per volta, la struttura in oggetto viene re-inizializzata ad ogni procedura di CALL SETUP. Questa struttura dati nominata TwnetCallData viene definita come una classe C++ con gli attributi privati presenti in tabella 2.8 e i rispettivi metodi di set e get. Sull’isola destinataria la CALL SETUP PDU ricevuta viene tradotta nei 2.2. Integrazione rete Tetra DMO con rete wireless mesh 105 seguenti comandi AT: AT+TWNCALL=<Calling address type>, <Calling party identity> <CR><LF> AT+CTSDC=<AI Service>,<Called party identity type>, <Area>, <Hook>, <Simplex>, <e-to-e encryption>, <Comms type>, <Slot/Codec>, <RqTx>, <Priority> <CR><LF> ATD<called party identity> <CR><LF> Anche in questo caso è stato necessario proporre un’estensione alle librerie standard, il comando AT+TWNET permette di settare nell’isola di destinazione il corretto mittente della chiamata. Successivamente all’invio del comando ATD il TE che origina la chiamata sull’isola destinazione riceve due comandi non sollecitati tramite i quali vengono ricavati i parametri necessari alla successiva gestione della chiamata <CR><LF> +CTOCP: <CC instance >,<call status>,<AI service>,<hook>,<simplex> <CR><LF> <CR><LF> +CTCC: <CC instance>,<hook>,<simplex>,<AI service>,<e to encryption> <comms type>,<slots/codec>,<proprietary>,<Tx Grant> <CR><LF> Se il parametro <Tx Grant> ha valore 0 significa che il MN ha il permesso di trasmettere traffico nell’ambito della chiamata half duplex appena 106 Capitolo 2. TWNET: Tetra Wireless NETwork instaurata e che quindi può iniziare ad inviare in aria le trame voce. Il processing della CALL SETUP PDU include anche la creazione di una struttura dati TwnetCallData con contenuto uguale a quella creata sull’isola sorgente, per mantenere in memoria tutti i parametri necessari per la creazione successiva di altri comandi AT. In riferimento a tale struttura dati il campo Isola Partner dovrà però in questo caso essere settato facendo riferimento al campo Area Isola Master ricevuto con la CALL SETUP PDU. Gestione del traffico voci A valle di una CALL SETUP il terminale TETRA inizia immediatamente ad inviare trame voce verso il MT del MN della propria isola. In realtà il terminale TETRA dell’utente invierà traffico voce in aria con destinatario il nodo od il gruppo con il quale desidera parlare, sarà il MT a dover intercettare il traffico voce diretto a qualunque terminale e, nel caso che sia destinato ad un terminale TETRA non in diretta copertura del chiamante, esportare sulla PEI i frame voce codificati secondo lo standard ISI. Per trasportare i dati voce sulla rete TWNET viene definita la TRAFFIC PDU, il cui contenuto viene descritto in tabella 2.9 La dimensione del payload ISI è variabile e dipendente dalla PDU ISI trasmessa in aria, comunque da standard la lunghezza non può superare i 336 bit. Sull’isola sorgente il traffico voce viene inviato in aria dal terminale utente che riveste il ruolo di master e viene intercettato dal MN che afferisce a quell’isola DMO. In questo contesto il MN, che svolge il ruolo di slave, dovrà esportare sulla PEI un messaggio non sollecitato contente una serie di trame voce formattate secondo lo standard ISI: <CR><LF> 2.2. Integrazione rete Tetra DMO con rete wireless mesh Information Elements Lenght Type PDU type 8 M AIE settings 40 M Unique ID 8 M Destination address type 4 M Called party TSI 48 M Source address type 4 M Calling party TSI 48 M Area selection isola master 48 M Area selection isola slave flag 4 M Area selection isola slave 48 C Reserved 16 M < 336 M Payload ISI Tabella 2.9: Campi del TRAFFIC PDU 107 108 Capitolo 2. TWNET: Tetra Wireless NETwork Information Elements Lenght Details PDU type 8 3 AIE settings 40 0 Unique ID 8 Autogenerato Destination address type 4 da TwnetCallData Called party TSI 48 da TwnetCallData Source address type 4 da TwnetCallData Calling party TSI 48 da TwnetCallData Area selection isola master 48 Autogenerato Area selection isola slave flag 4 0 Area selection isola slave 48 0 Reserved 16 0 < 336 da +TWNBLK Payload ISI Tabella 2.10: Valori dei campi del TRAFFIC PDU +TWNBLK: <stringa ASCII del pacchetto ISI in formato HEX> <CR><LF> Questo tipo di messaggio è stato aggiunto alle librerie standard poiché non era prevista la possibilità di esportare i dati voce durante una chiamata. Sull’isola di destinazione il MN avrà completato la procedura di CALL SETUP e andrà a ricoprire il ruolo di master della chiamata instaurata, quindi alla ricezione del TRAFFIC PDU andrà ad estrarre il payload ISI ed utilizzerà i dati per alimentare il MT in modo che questo possa tradurre tali dati in PDU di traffico voce in aria. Per alimentare il MT il demone pe2ne dovrà inviare verso la PEI il messaggio AT: AT+TWNBLK= <stringa ASCII del pacchetto ISI in formato HEX> 2.2. Integrazione rete Tetra DMO con rete wireless mesh Information Elements 109 Lenght Type PDU type 8 M AIE settings 40 M Unique ID 8 M Destination address type 4 M Called party TSI 48 M Source address type 4 M Calling party TSI 48 M Area selection isola master 48 M Area selection isola slave flag 4 M Area selection isola slave 48 C Reserved 16 M Reservation time remaning 6 M Request flag 1 M Changheover request flag 1 M Cease cause 4 M Tabella 2.11: Campi del CALL TERMIANTED PDU <CR><LF> Call Termination Al termine della chiamata, il terminale originante invia in aria una DM-TX CEASED PDU, ovvero un frame che indica che il traffico voce è terminato e notifica quanto a lungo il canale resterà nello stato reservation. A livello di rete TWNET alla ricezione della DM-TX CEASED PDU per la chiamata, il MN creerà una CALL TERMINATED PDU i cui campi sono elencati nella tabella 2.11. 110 Capitolo 2. TWNET: Tetra Wireless NETwork Figura 2.29: Sequenza dei messaggi scambiati durante una chiamata senza presence check 2.2. Integrazione rete Tetra DMO con rete wireless mesh 111 La CALL TERMINATED PDU, in relazione alla figura 2.29, dovrà essere composta a partire dai dati inoltrati sulla PEI e, dopo aver attraversato la rete multihop, sarà utilizzata dal TE del MN dell’isola destinazione per valorizzare i parametri dei comandi AT necessari ad eseguire la terminazione della chiamata. Sull’isola sorgente l’invio della CALL TERMINATED PDU dovrà essere eseguito appena si riceva dal lato aria la segnalazione che il terminale di origine ha cessato di inviare la trama voce, cioè quando è stato rilasciato il tasto PTT (Press To Talk) del device fisico. La segnalazione aria viene intercettata dal MN che invia sull’interfaccia PEI i messaggi non sollecitati: <CR><LF> +CDTXC: <CC instance>,<TxRqPrmsn> <CR><LF> <CR><LF> +TWNCSD: <CC instance>,<Rsv time remaining>,<Request Flag> <Chgvr Request Flag>,<Cease cause>,<call frame number> <CR><LF> Il MN una volta ricevuta in aria questa segnalazione dovrà provvedere ad inviare verso la rete TWNET la CALL TERMINATED PDU assegnando ai campi previsti i valori secondo quanto indicato nella tabella 2.12. Per alcuni dei campi è necessario che il MN acceda ai valori della struttura dati TwnetCallData che aveva creato durante la fase di Call Setup. Sull’isola di destinazione il MN che riceverà la CALL TERMINATED PDU, confronterà i campi con quelli della struttura dati TwnetCallData che ha istanziato alla ricezione della CALL SETUP PDU e, in caso ci sia un match invierà dal TE verso il MT i seguenti due comandi AT: 112 Capitolo 2. TWNET: Tetra Wireless NETwork Information Elements Lenght Details PDU type 8 4 AIE settings 40 0 Unique ID 8 <call frame number> da +TWNCSD Destination address type 4 da TwnetCallData Called party TSI 48 da TwnetCallData Source address type 4 da TwnetCallData Calling party TSI 48 da TwnetCallData Area selection isola master 48 autogenerato Area selection isola slave flag 4 0 Area selection isola slave 48 0 (non utilizzato) Reserved 16 0 Reservation time remaning 6 <Rsv time remaing> da +TWNCSD Request flag 1 <Request Flag> da +TWNCSD Changheover request flag 1 <Chgvr request flag> da +TWNCSD Cease cause 4 <Cease cause> da +TWNCSD Tabella 2.12: Valori degli attributi del TERMINATED CALL PDU 2.2. Integrazione rete Tetra DMO con rete wireless mesh 113 AT+TWNCSD=<CC instance>,<Rsv time remaining>,<Request Flag> <Chgvr Request Flag>,<Cease cause><Chgvr Request Flag>, <Cease cause> <CR><LF> AT+CUTXC=<CC Instance> <CR><LF> I valori dei parametri dovranno essere estratti dalla CALL TERMINATED PDU eccezion fatta per il campo <CC Instance> che sarà invece estratto dalla struttura dati TwnetCallData. Il secondo comando era già previsto dalla libreria standard mentre si è reso necessario definire il primo per andare a settare quei parametri che devono essere trasposti dall’isola sorgente a quella destinataria. Design software Come precedentemente accennato, abbiamo sviluppato il software pe2ne utilizzando il linguaggio ad oggetti C++ ed utilizzando solamente le librerie standard libstdc++ fornite sia per le comuni distribuzioni linux per desktop che per le distribuzioni per piattaforme embedded. Il programma è stato sviluppato per girare su sistema operativo GNU/Linux e progettato per essere un demone che, una volta caricato all’avvio del servizio, resta in memoria in background in attesa di reagire al manifestarsi di un evento (per esempio la ricezione di dati su rete o su seriale). Andiamo ora a presentare le componenti principali: • class IOMultiplex: gestione eventi concorrenti e accesso ai socket; • class Session e class State: implementazione macchina a stati finiti; 114 Capitolo 2. TWNET: Tetra Wireless NETwork • class UdpBuffer: buffer dati provenienti dalla rete multihop. Figura 2.30: Diagramma delle classi class IOMultiplex Il principale problema da risolvere in software che forniscono servizi di rete è come riuscire a gestire gli eventi concorrenti quali: • comunicazione in lettura e scrittura sulla seriale • comunicazione in lettura e scrittura sulla socket UDP • timer della macchina a stati 2.2. Integrazione rete Tetra DMO con rete wireless mesh Figura 2.31: Diagramma sequenziale 115 116 Capitolo 2. TWNET: Tetra Wireless NETwork Tali funzionalità sono state delegate alla classe IOMulitplex con un approccio sincrono al problema utilizzando la funzione select(): su un sistema Linux quando viene aperto un file o una socket, questa viene resa disponibile tramite un file descriptor, che ne permette l’utilizzo sia in scrittura che in lettura; le operazioni sui file descriptor di default sono bloccanti, cioè quando vi si accede per eseguire una certa operazione, se questi non è pronto si interrompe l’esecuzione del programma fino a quando il descrittore di file non diventa nuovamente in grado di essere utilizzato. Il nostro software deve poter contemporaneamente stare in ascolto di due socket in ricezione, uno lato rete IP/UDP e l’altro verso la connessione seriale PEI, in questo caso l’utilizzo della chiamataread() di una delle due socket bloccherebbe l’esecuzione del programma impedendo di fatto la ricezione Real Time sull’altra socket, la cui invocazione avverrebbe solo a lettura avvenuta dal primo socket. Per risolvere questo problema si utilizza la funzione select() che prende in input la lista dei file descriptor aperti che vogliamo utilizzare e, quando viene richiamata, blocca l’esecuzione del programma fino al verificarsi di due condizioni: 1. uno o più di un file descriptor è pronto per ricevere dati e vi sono dati da leggere (nel nostro caso o è arrivato un pacchetto UDP o è stato ricevuto un messaggio dalla PEI); 2. è scaduto il timeout della select(). In questo modo ci assicuriamo di poter ricevere ed elaborare i dati quando raggiungono il TE permettendoci di garantire le tempistiche richieste. Per abilitare il controllo sui socket e contemporaneamente avviare il timer viene richiamato il metodo pubblico wait() che invoca la select e che ritorna un intero contenente quanti file descriptor sono attivi con dati pronti per essere letti, in caso ritorni 0 allora significa che il timer è scaduto. Succes- 2.2. Integrazione rete Tetra DMO con rete wireless mesh 117 sivamente la classe chiamante potrà notificare l’evento alla macchina a stati che eseguirà le azioni dipendenti dallo stato in cui si trova in quel momento il TE (si può vedere la sequenza delle chiamate in figura 2.31). Un’altra funzionalità delegata a IOMultiplex è fornire l’accesso alle classi che gestiscono a basso livello le socket Linux per prelevare o inviare i dati sia verso la rete che verso la PEI. Le operazioni di trasmissione e ricezione vengono pilotate dagli stati della FSM e quindi devono poter essere richiamate da un grande numero di classi diverse; è importante avere un’interfaccia comune a tutte le classi che implementano i vari stati ed è necessario che questa venga implementata dalla medesima istanza della classe IOMultiplex, è quindi stato scelto di sviluppare questo oggetto secondo il pattern Singleton [14] che garantisce queste caratteristiche. class Session e class State La macchina a stati finiti è stata sviluppata utilizzando il pattern State [14]: gli algoritmi che implementano le azioni che devono essere eseguite al manifestarsi di un certo tipo di evento in un determinato stato sono stati incapsulati all’interno di metodi di un’interfaccia. La classe State, astratta, crea tale interfaccia, definendo i 5 metodi corrispondenti agli eventi di invio e ricezione dati su udp o seriale e di scadenza del timeout; le classi istanziate, rappresentanti un certo stato della FSM, andranno a reimplementare i metodi che devono gestire le azioni previste per il proprio ruolo. É importante che nessun dato venga memorizzato all’interno della classe State, ma che tutte le informazioni vengano copiate all’interno della classe Session; quest’ultima rappresenta la sessione di comunicazione TWNET ed è l’entità che gestisce i parametri di comunicazione (per esempio la struttura dati TwnetCallData come da figura 2.30) ed include dentro di se la FSM. Conseguentemente è la Session che, al manifestarsi di un certo- 118 Capitolo 2. TWNET: Tetra Wireless NETwork evento, va a richiamare il metodo corrispondente sull’interfaccia State (vedi figura 2.31) class UdpBuffer La ricezione dei messaggi sulla seriale deve avvenire immediatamente, con priorità maggiore rispetto alla ricezione lato rete multihop, poiché è requisito fondamentale che la macchina a stati della TE sia sincronizzata con quella del proprio MT: se infatti, per esempio, il MT invia un messaggio di errore o di chiusura chiamata durante una comunicazione voce, la TE deve smettere di inviare frame voce verso il terminale, scartare le TRAFFIC PDU che ha ricevuto e gestire questo cambiamento di stato per evitare di entrare in situazioni di blocco. Sempre per garantire la sincronia fra le due macchine a stati, in presenza di stati di transizione in attesa di una risposta dalla seriale, si forza il blocco dell’invio dei pacchetti UDP alla Session, blocco che, come vedremo in seguito, non causerà la perdita del pacchetto ma solo un ritardo nella sua elaborazione. Inoltre lato seriale, visto che si comunica direttamente col device Tetra, non ci sono problemi di mancata ricezione di dati o di ricezione di messaggi fuori ordine. Queste però sono tutte problematiche che possono manifestarsi nelle trasmissioni via rete, in particolare se ci troviamo ad usare una rete mesh. Quindi per risolvere problemi di: • perdita pacchetti UDP; • arrivo pacchetti fuori ordine; • jitter; è stato implementato un buffer di ricezione dei pacchetti IP. Il funzionamento è semplice, la ricezione dei dati dalla socket udp è sempre attiva, quando un pacchetto viene ricevuto, questo non passa per la classe Session e quindi 2.2. Integrazione rete Tetra DMO con rete wireless mesh 119 per la macchina a stati, ma viene direttamente passato all’interno del buffer che è implementato all’interno della classe UdpBuffer. All’inserimento del pacchetto viene controllato il suo unique id e nel caso sia un frame precedente all’ultimo aggiunto, viene cercato e collocato nel posto di competenza, altrimenti viene accodato in fondo al buffer. Per fare in modo che i pacchetti raggiungano la FSM viene definita una pipe: un canale dati unidirezionale, solitamente usato per le comunicazioni fra processi, che consiste in una struttura con due file descriptor, il primo fa riferimento alla cima della coda e l’altro alla fine; i dati che vengono inviati usando la funzione write() nel secondo file descriptor, vengono resi disponibili per la lettura utilizzando la read() sul primo file descriptor come se si trattasse di un normale socket (vedi figura 2.32). Questo meccanismo viene utilizzato per integrare l’invio dei dati dal buffer alla FSM col meccanismo della select presentato al capitolo 2.2.4. Quando il buffer non è vuoto e presenta dati in attesa di essere elaborati, automaticamente viene prelevato il primo pacchetto della coda e trasmesso all’interno della pipe; a questo punto il primo file descriptor della pipe presenterà dati pronti per essere letti ed andrà a sbloccare la select() che gestisce la notifica degli eventi alla Session. Questo passaggio attraverso la pipe ci permette inoltre di mettere in pausa l’elaborazione dei pacchetti UDP, per permettere la corretta comunicazione col MT, vista anche la lentezza del canale di comunicazione seriale. Infatti nella definizione dell’interfaccia State, viene anche implementato il metodo enableUdpBuffer() che ritorna sempre true e vincoliamo a questo valore di ritorno la possibilità che la pipe possa essere o meno inserita fra i file descriptor che permettono di sbloccare la select(). Negli stati di transizione, dove il software deve aspettare la risposta dal MT, questo metodo viene sovrascritto in modo che ritorni false, disabilitando cosı̀ il passaggio dei dati dalla pipe 120 Capitolo 2. TWNET: Tetra Wireless NETwork alla macchina a stati ma permettendo comunque l’inserimento di nuove PDU all’interno del buffer (entro i limiti di ampiezza dello stesso). Figura 2.32: Passaggio dei dati in ingresso lato rete multihop 2.3 Risultati L’attività svolta all’interno del progetto di collaborazione con Selex-Comms ha portato quindi all’integrazione del sistema di telecomunicazioni professionali Tetra DMO con una rete wireless multihop: è stato identificato un metodo per importare all’interno di una rete IP le segnalazioni ed i dati provenienti da un’isola DMO e un sistema per reinserire tali informazioni in un’altra isola. Per permettere ciò è stato inoltre ideato un protocollo di trasmissione dati su UDP per veicolare le informazioni Tetra e permettere le comunicazioni fra i nodi costituenti la rete multihop. Sono stati progettati e creati dei prototipi di Mobile Node unendo le componenti hardware di un terminale Tetra ed un router wireless dotato di sistema operativo GNU/Linux embedded; inoltre per la creazione di questi nodi è stato necessario estendere lo standard ETSI per la comunicazione su seriale tramite PEI e quindi modificare software e firmware dei device Tetra. Infine è stato sviluppato un software in grado di poter gestire la comunicazione tramite le interfacce di rete IP e seriale PEI per interagire con le varie componenti del sistema e tradurre le segnalazioni 2.3. Risultati 121 ed i dati ricevuti su di un’interfaccia in informazioni valide per l’altra, il tutto rispettando importanti vincoli real time dettati dalla necessità di gestire traffico voce. Sono stati prodotti 3 prototipi di Mobile Node ed è stato creato un testbed per validare il nostro approccio e valutarne le funzionalità. La rete di test permette quindi di andare ad analizzare il comportamento delle componenti in un percorso a due hop: è stato studiato il funzionamento dei sistemi DMO puri che non sono in grado di rilevare la presenza della rete TWNET, ma che comunque vengono influenzati dalla sua presenza che inserisce dei ritardi nella propagazione della segnalazione Tetra. Sono stati valutati i vari servizi DMO di: • Chiamata individuale senza presence check; • Chiamata individuale con presence check; • Chiamata di gruppo; • Chiamata di emergenza; • Chiamata con cifratura di tipo end to end encryption attivata; • Chiamata con cifratura di tipo AIE attivata; • Chiamata individuale senza presence check in presenza di DM-REPeater; • Chiamata individuale con presence check in presenza di DM-REPeater; • Chiamata di gruppo in presenza di DM-REPeater; • Chiamata di emergenza in presenza di DM-REPeater; • Chiamata con cifratura di tipo end to end encryption attivata in presenza di DM-REPeater; 122 Capitolo 2. TWNET: Tetra Wireless NETwork • Chiamata con cifratura di tipo AIE attivata in presenza di DM-REPeater; • Chiamata individuale senza presence check in presenza di DM-GATEway; • Chiamata individuale con presence check in presenza di DM-GATEway; • Chiamata di gruppo in presenza di DM-GATEway; • Chiamata di emergenza in presenza di DM-GATEway; • Chiamata con cifratura di tipo end to end encryption attivata in presenza di DM-GATEway; • Chiamata con cifratura di tipo AIE attivata in presenza di DM-GATEway; • Changeover per tutte le precedenti tipologie di chiamata; • Invio di SDS di testo a diversa priorità in tutte le varie configurazioni di rete precedenti; • Invio di SDS di stato a diversa priorità in tutte le varie configurazioni di rete precedenti; In tutti questi casi non si sono riscontrate anomalie, i servizi sono stati verificati e testati garantendone la conformità con le specifiche di funzionamento; inoltre i ritardi che la rete inserisce nella propagazione di segnalazioni e dati voce non vanno ad influire sul comportamento del sistema. Infatti non si è mai verificato che uno dei vari contatori, definiti dalle specifiche Tetra DMO, scadesse a causa dei ritardi generati dalla rete IP o dalla comunicazione via seriale causando l’impossibilità di usufruire di un servizio. Questa attività di ricerca ha prodotto la pubblicazione di un articolo [15], la proposta di 4 brevetti [16] [17] [18] [19] ed è stato insignito del premio innovazione Selex-Communications 2009. Parte II Testing funzionale per la sicurezza dell’implementazione di protocolli di rete Capitolo 3 S.T.R.E.S.S. L’attività di software testing risulta essere di fondamentale importanza nei processi di sviluppo software proprio perché mira a ridurre il più possibile la presenza di bug all’interno del codice, anche se uno dei principali problemi è che nessuna metodologia di testing può dare la certezza matematica di assenza di errori. Il costo economico di questa attività inoltre risulta essere molto oneroso arrivando fino ad equivalere quello dello sviluppo del codice. Si cerca quindi di ridurre il più possibile i tempi ed i costi derivati da questa attività senza però comprometterne il risultato finale, sviluppando metodologie e strumenti in grado di automatizzare il più possibile il processo cercando di diminuire i costi e minimizzando gli errori umani. L’obbiettivo di questa parte dello studio di dottorato ha mirato alla creazione di una metodologia di testing ed allo sviluppo di un framework flessibile, generico e dinamico capace di adattarsi ad ambiti diversi e fornire supporto ed automazione in tutte le fasi del processo di testing del software di rete. Vedremo quindi aspetti generici del black box testing, in particolare riguardanti quelli di ricerca delle vulnerabilità e robustness testing, sarà pre125 126 Capitolo 3. S.T.R.E.S.S. sentata la metodologia che abbiamo sviluppato e la piattaforma con le varie componenti e strumenti che la costituiscono. Infine andremo ad illustrare le prove sul campo che sono state effettuate per presentare i risultati ottenuti. 3.1 Black-Box Testing Ormai l’utilizzo del software ha permeato moltissimi se non tutte le infrastrutture della società moderna, computer e le reti di telecomunicazioni permettono di fornire servizi che ormai sono divenuti fondamentali ed indispensabili. La dipendenza che si è venuta a generare rende un eventuale malfunzionamento del software un problema di entità maggiore rispetto al passato. Inoltre la maggiore accessibilità a tali sistemi, non solo permette a più persone di usufruire di un servizio, ma aumenta il rischio che eventuali vulnerabilità possano venir introdotte in qualche software e possano venir sfruttate per attacchi, quindi l’attività di testing risulta essere fondamentale per tutte queste componenti, soprattutto per quelle che prevedono una connessione con la rete. Spesso gli errori nel software vengono scoperti e notificati a partire dall’uso che ne fanno le utenze, viene segnalato un malfunzionamento ed in seguito si indaga sull’origine del fallimento, questo soprattutto nei software proprietari dove non si ha accesso al codice sorgente e quindi non c’è alcun mezzo per gli utenti finali di valutare quale sia il livello di sicurezza del software in oggetto. Diventa cosı̀ necessario sviluppare una metodologia di tipo funzionale che permetta di verificare lo stato dei software utilizzati ed il loro livello di sicurezza senza però avere a disposizione dettagli implementativi come il codice sorgente. Il software testing prevede un’attività, non solo in fase di post implementazione, ma anche durante la stesura delle specifiche di funzionamento e nella fase di progettazione, è quindi parte 3.1. Black-Box Testing 127 integrante di tutto il processo di sviluppo del software. Una prima grossa distinzione può essere fatta in base alle informazioni ed ai dettagli di cui si è a conoscenza o su cui si vuole basare il processo di testing [20]. Si può quindi parlare di testing funzionale se il sistema da analizzare viene visto come una black box: non si ha conoscenza di alcun dettaglio implementativo e quindi possono essere utilizzate solo le specifiche di funzionamento. L’esecuzione dei test prevede di inviare determinati input al sistema per poterne analizzare i comportamenti e valutare la loro attinenza con le specifiche. Un approccio di questo tipo solitamente viene utilizzato quando i dettagli implementativi non sono di libero accesso o quando comunque si ha una conoscenza limitata dell’oggetto sotto test, andandosi conseguentemente a basare su ciò che è a disposizione: analisi dei requisiti, specifiche dei protocolli e le definizioni di interfacce. Diversamente, nel testing strutturale, l’analisi si basa su dettagli implementativi come il codice sorgente, e viene quindi adottato un approccio di tipo white box. Vi è poi un livello intermedio fra questi due tipi, il grey box testing [21]: in questo approccio si ha una limitata conoscenza della componentistica interna del sistema, per esempio si può avere accesso solo ad una parte del codice sorgente mentre altre componenti sono software proprietario, oppure più semplicemente si ha un accesso ai documenti di design più dettagliati delle specifica dei requisiti. Per quanto riguarda la metodologia di testing è analoga a quella del black box testing, cioè si opera una comunicazione dall’esterno con la “scatola” analizzandone il comportamento per valutare i risultati dei test. Il nostro lavoro si soffermerà principalmente sulla parte di testing funzionale, detto anche black-box testing, ed in particolar modo sull’analisi della sicurezza delle implementazioni a partire dalle specifiche di funzionamento. 128 Capitolo 3. S.T.R.E.S.S. 3.1.1 Concetti di base Il testing viene definito come il processo che fa operare un sistema o una componente sotto particolari condizioni, osservando e memorizzando i risultati ed infine valutando alcuni aspetti dell’oggetto analizzato alternativamente come il processo di analizzare un software per rilevare le differenze fra il suo funzionamento e ciò che viene descritto nelle specifiche ed infine per valutarne le caratteristiche [22]. Vengono identificate cinque diverse fasi del testing [20] in base agli obiettivi preposti: • Fase 0: il testing coincide con l’attività di debugging. • Fase 1: l’obiettivo del testing è verificare il corretto funzionamento del codice. • Fase 2: verificare che il software non funziona correttamente. • Fase 3: il testing non deve più dimostrare qualcosa, ma deve ridurre il rischio di non funzionamento fino ad un livello accettabile (ovviamente in base alle caratteristiche e allo scopo del software sotto analisi). • Fase 4: il testing non è più un’attività a sé stante ma un approccio per lo sviluppo del software. Queste fasi in realtà sono i 5 obbiettivi che devono essere tutti soddisfatti dal processo dello sviluppo del software che deve comprendere anche quelle attività necessarie a determinare se il prodotto soddisfa le specifiche e individuare eventuali malfunzionamenti. La IEEE definisce i concetti di errore, guasto e fallimento [22]: il programmatore scrivendo codice può commettere un errore, questo se si manifesta può causare un guasto, che rappresenta un’espressione errata o uno 3.1. Black-Box Testing 129 stato della memoria non corretto, cioè quello che più comunemente chiamiamo bug. Quando vi è un guasto questo può generare una condizione tale che il software non si comporti in modo coerente con quello che ci si aspetta, cioè non rispetta le sue specifiche di funzionamento e si ha quindi un fallimento. Il processo di testing prevede alcune fasi, la cui automatizzazione può velocizzare ed agevolare il lavoro: come prima cosa devono essere creati i test case, sono l’unità base del testing ed hanno lo scopo di valutare certi comportamenti o verificare la realizzazione di una determinata funzionalità del sistema o, come nel nostro caso, valutare la robustezza ad un certo tipo di sollecitazioni. I vari test case possono essere raggruppati in test group ed a loro volta, più gruppi formano una test suite. L’obbiettivo del test case prende il nome di test purpose e solitamente i gruppi di test case vengono creati in base ad uno scopo comune che prende il nome di test group objective. Successivamente alla creazione, i test case vengono eseguiti sulla componente sotto analisi, si ha quindi un test run; ad ogni test case possono corrispondere diverse esecuzioni e quindi diversi test run. Durante questa fase il sistema sotto test deve essere monitorato senza però che venga modificato il suo funzionamento o il suo stato; inoltre spesso è necessario sviluppare stub o driver specifici per interfacciarsi col sistema e per eseguire le varie run. Infine si ha il verdetto dell’oracolo (oracle verdict): si definisce oracolo il meccanismo che permette di valutare l’output del test case con le specifiche ed emettere quindi il verdetto che può essere: pass, fail o inconclusive. Un verdetto di pass significa che in risposta al test case il sistema ha reagito come ci si aspettava e che quindi non manifesta malfunzionamenti; contrariamente se è fail vi sono delle palesi violazioni delle specifiche nell’implementazione dell’aspetto sotto test e che quindi saranno necessarie ulteriori analisi per comprenderne le cause. Se invece non si è in grado di assegnare uno dei due precedenti 130 Capitolo 3. S.T.R.E.S.S. verdetti, definiremo il risultato del test case come inconclusive, e quindi non utile ai nostri scopi. Come detto precedentemente, in caso di verdetto fail, si eseguirà il debug del codice per andare a risalire la catena dell’errore, guasto, fallimento, partendo dalla failure generata dal test run per trovare il fault che l’ha causato. Livelli di testing Una ulteriore distinzione può esser fatta in base al livello della componente sotto test [20]: • Unit testing: la unit è la più piccola parte di software che può essere analizzata, cioè la più piccola porzione di codice che può essere compilata e venir caricata in memoria. • Component testing: testing su un aggregato di due o più unit. • Integration testing: l’integrazione è il processo per il quale si vanno a generare elementi complessi aggregando diversi component; dopo aver controllato i singoli elementi è necessario valutare anche le loro combinazioni. • System testing: un sistema è un componente complesso, il testing di sistema riguarda il comportamento dell’intero oggetto integrato e quindi si va a controllare la sua conformità rispetto al design dell’architettura. • Acceptance testing: il software terminato viene controllato per valutarne l’attinenza con i requisiti funzionali. Ogni livello di test è associato alle varie fasi di sviluppo software, secondo il modello a V rappresentato in figura 3.1 [23]. 3.1. Black-Box Testing 131 Figura 3.1: Modello a V del processo di sviluppo software Conformance Testing La ISO in collaborazione con la ITU-T ha sviluppato uno standard per fornire una metodologia per il conformance testing delle implementazioni dei protocolli: è lo standard ISO 9646, OSI conformance testing methodology and framework [24] [25]. Lo scopo del conformance testing [26] [27] è verificare che il comportamento di una implementazione di un protocollo rispetti i requisiti dello stesso, questo permette di validare sia il corretto funzionamento che l’interoperabilità fra implementazioni diverse del medesimo protocollo. Questa tipologia di testing utilizza un approccio funzionale, viene valutato solo il comportamento del sistema senza alcun interesse per la sua struttura interna. Questa caratteristica permette quindi di poter riutilizzare le test suite per più implementazioni diverse dello stesso protocollo. Solitamente il processo di conformance testing procede in parallelo con lo 132 Capitolo 3. S.T.R.E.S.S. sviluppo dell’implementazione del protocollo, infatti entrambi queste procedure prendono come input la stesura delle specifiche: queste vengono utilizzate per la generazione dei test case in maniera indipendente dall’implementazione dello standard. Successivamente i test case vengono implementati per andare infine ad essere eseguiti sulla IUT (Implementation Under Test) per ottenere il verdetto sulla conformità della stessa rispetto alle specifiche. Completezza del livello di testing Oltre al problema dell’oracolo, un altro elemento estremamente complesso del testing è la completezza. Per definizione il software testing è in grado di dimostrare la presenza di bug, non è in grado invece di dimostrarne l’assenza [20]. Infatti nel testing funzionale il numero degli input possibili è infinito, ciò fa capire che è impossibile, sia teoricamente che praticamente, eseguire un testing completo su tutto lo spazio degli ingressi. Quindi l’unica possibilità è quella di eseguire un numero limitato di test, cioè eseguire un campionamento degli ingressi per cercare di coprire più tipologie di input possibili. 3.1.2 Testing per la sicurezza del software Come accennato precedentemente, la diffusione e l’uso del software ha coinvolto ogni aspetto della società moderna, dai più frivoli a quelli critici, tanto che un fallimento di questi sistemi può causare conseguenze molto gravi. A peggiorare la situazione è la continua esportazione dei vari servizi su internet migliorandone si l’accessibilità ma esponendoli a maggiori rischi di attacchi: chi sviluppa software deve quindi tener conto di questo e assumere che il loro prodotto non verrà usato solo dagli utenti destinatari ma anche da eventuali attaccanti [28]. 3.1. Black-Box Testing 133 Diventa quindi importante valutare la sicurezza dei sistemi sia per chi produce software, sia per coloro che lo adottano, per avere una valutazione della sicurezza delle proprie strutture IT. La maggior parte delle violazioni della sicurezza dei sistemi informatici vengono causate da errori nel software che vengono sfruttati come vettori di attacco. C’è una distinzione da fare su queste vulnerabilità, si può parlare di design vulnerability se deriva da un errore inserito in fase di progettazione del sistema; contrariamente si parla di implementation vulnerability quando vengono inserite in fase di implementazione e quindi derivano da errori di programmazione. Per esempio, anche se un design è privo di errori e quindi il sistema è privo di difetti da un punto di vista di progettazione questo può essere costituito da componenti difettose che vanno quindi a compromettere un impianto teoricamente sicuro. Per quanto riguarda i primi tipi di vulnerabilità, in fase di design si possono produrre modelli formali per dimostrarne la correttezza e la sicurezza, contrariamente all’altra tipologia poiché la complessità dell’implementazione supera la capacità dell’analisi formale; inoltre una maggiore complessità del codice aumenta anche la probabilità che vi siano inseriti errori. Robustness testing La robustezza è una caratteristica fondamentale per le componenti software ed è definita come: la capacità di resistere ad un input anomalo e mirato ad ottenere un comportamento non previsto nelle specifiche. I problemi di robustezza rappresentano anche problemi alla sicurezza del sistema, infatti le vulnerabilità che sono presenti in un software possono essere utilizzate da un attaccante per la sua compromissione, con impatto ovviamente maggiore nei casi di componenti con accesso ad internet. Il testing di robustezza si discosta 134 Capitolo 3. S.T.R.E.S.S. dai test tradizionali poiché quest’ultimi hanno come obiettivo verificare che il comportamento dell’oggetto sotto analisi sia conforme alle specifiche, mentre i test per la robustezza mirano ad analizzare le reazioni ad ingressi anomali ed a valutare la capacità del software di gestire eventuali attacchi con l’obiettivo ultimo di cercare le implementation vulnerability. Conseguentemente cambia anche l’approccio alla macchina sotto test, infatti non ci interessa solamente se le risposte sono attinenti allo standard ma deve essere valutato se si sono manifestati fallimenti o se le politiche di sicurezza sono state rispettate. Un’ulteriore differenza fra questa tipologia di test e quella per la conformità consiste nel numero di test case generati, infatti si passa da un ordine delle centinaia ad un ordine delle migliaia [29]. 3.1.3 Tecnologie di Black-box testing e stato dell’arte Affrontiamo ora una panoramica delle varie metodologie di testing funzionale utilizzate per attuare testing di robustezza, considerando anche che le varie tecniche non sono mai esclusive anzi spesso un particolare approccio può rientrare in più di una di queste categorie. Fuzzing Il termine fuzzing è stato introdotto per la prima volta da Miller [30] creando uno strumento anonimo che eseguiva dei test per la robustezza di applicazioni inviando dati random sulle loro interfacce, per poi valutare la reazione del sistema e se erano presenti vulnerabilità o errori software. Concettualmente la tecnica del fuzzing consiste nell’introdurre rumore sulle interfacce interne o esterne fornite da un programma. Successivamente l’approccio tramite fuzzing si è evoluto ed ampliato andando a sovrapporsi con altre metodologie come il domain testing, syntax testing e fault injection; nella sua accezione 3.1. Black-Box Testing 135 più attinente al termine, il fuzzing consiste in una ricerca alla cieca di problemi nella gestione degli input nei vari programmi, ma questo tipo di approccio risulta molto spesso inadeguato. Per esempio nel caso del test di un server POP3, inviare dati casuali difficilmente permetterà di superare il primo scambio di messaggi, col risultato che soltanto una piccola parte dell’implementazione del protocollo verrà controllato, tralasciando gran parte del codice. Quindi, il più delle volte la tecnica del fuzzing totalmente casuale risulterà di scarsa efficacia, per questo motivo vi è stata un’evoluzione e sono stati implementati approcci più intelligenti: gli strumenti possono essere specifici di un determinato protocollo da testare e permettono di andare ad inserire dati random in una parte specifica dello scambio di messaggi oppure possono utilizzare un range di dati anomali da inserire invece di affidarsi al generatore random. Questo approccio permette quindi di andare più in profondità nelle macchine a stati del protocollo di fatto sovrapponendosi con la metodologia tipica del syntax testing. Un importante aspetto del fuzzing è il controllo sul trust boundary: cioè quando in un sistema l’esecuzione o i dati passano da un trust level ad un altro e quindi vengono cambiate le loro risorse ed i loro permessi. Un esempio di trust boundary che viene attraversato si ha quando i dati ricevuti in rete vengono trasmessi ad un’applicazione per il parsing e per l’elaborazione. Lo spazio degli input che possono essere inviati al sistema è costituito da tutte le possibili combinazioni di dati ed è ovviamente infinito, quindi per limitarlo è necessario scegliere un subset di valori da utilizzare nei test. Per facilitarne la selezione, vengono usate delle euristiche: le euristiche di attacco sono tecniche finalizzate alla ricerca di specifiche tipologie di bug nelle applicazioni, per esempio se vogliamo cercare errori che causano buffer overflow si inviano input particolarmente lunghi oppure se vogliamo sfruttare errori di format bug si inviano caratteri speciali di controllo all’interno degli 136 Capitolo 3. S.T.R.E.S.S. input stinghe. I test case vengono quindi generati a partire dallo spazio degli input e da un’euristica di attacco, ma come vengono generati dipende dal tipo di fuzzer che viene utilizzato: • un generation fuzzer è un programma autonomo che produce delle sessioni semi valide: è in grado di creare le informazioni da inviare in base ad un modello, può essere più semplice e creare dati casuali o più complesso ed utilizzare una rappresentazione del protocollo; • un mutation fuzzer preleva una sessione valida, ne muta i dati creando cosı̀ il test case. I primi tendono ad essere specifici per un particolare standard o applicazione mentre i secondi sono fuzzer generici poiché non hanno bisogno di modelli ma si basano su comunicazioni prelevate precedentemente al test. L’azione del fuzzer può essere suddivisa in tre fasi 1. La tokenization: le comunicazioni protocollari vengono suddivise in parti variabili o costanti, le prime sono quelle che saranno oggetto del fuzzing (siano esse interi stringhe o dati binari), mentre le seconde sono la parte costante del protocollo come gli header. 2. Vengono generati in modo manuale o automatico i test case, partendo da un modello del protocollo oppure da traffico precedentemente catturato. Questa fase è importante perché un errore nella generazione dei case può portare l’applicazione in esame ad ignorare gran parte del traffico facendo risultare i test inutili. 3. Il traffico generato viene trasformato in traffico malformato in modo da portare alla luce problemi nell’implementazione sfruttabili per un 3.1. Black-Box Testing 137 eventuale attacco. Questo può essere effettuato in modo banale, semplicemente invertendo il valore di alcuni bit oppure con approcci più sofisticati anche in base al tipo di dato. In questa fase entrano in gioco le euristiche di attacco. Un’ulteriore accorgimento deve essere preso perché quando si va a modificare i dati a volte è necessario modificare altre parti del messaggio da inviare per assicurarci che il pacchetto non venga scartato per altri motivi. Ad esempio, nel caso di controlli di checksum o anche più semplicemente nel ricalcolo dei campi della lunghezza. Domain Testing e Syntax Testing Si definiscono gli input domain come intervalli uniformi di valori che possono essere ricevuti in ingresso da un’applicazione, valori appartenenti allo stesso dominio probabilmente verranno processati in modo simile. Quindi un domain testing preleva alcuni valori dai vari domini, con attenzione a prelevare almeno un input da tutti i range, per valutare come vengono elaborati dal sistema in esame; i test case dovrebbero concentrarsi particolarmente sui confini dei domini dove è maggiore la probabilità di una errata gestione. Questo tipo di testing viene solitamente utilizzato per verificare il comportamento del sistema in risposta ai valori validi, ma è necessario, al fine dell’analisi della sicurezza, integrarlo con l’invio di input non validi. Il syntax testing è un altro approccio di testing funzionale, prevede l’utilizzo di dati in ingresso che vanno a violare la sintassi del protocollo [20]: l’oggetto del nostro test riceve cosı̀ input con caratteri casuali o elementi inseriti in ordine non previsto o con campi omessi, possono venir utilizzati limitatori non legali e cosı̀ via. L’obiettivo di questa tipologia di test è quello di controllare se gli input vengono controllati in modo robusto dall’implementazione del protocollo. 138 Capitolo 3. S.T.R.E.S.S. Tutti gli input che vengono passati ad un applicativo sfruttano un’interfaccia che questo fornisce, essa può essere un socket di rete ma anche il prompt da riga di comando o variabili di ambiente o qualsiasi altro mezzo di prelievo di dati; ogni interfaccia utilizza un linguaggio secondo il quale un determinato input può risultare legale o meno, questi linguaggi possono essere o nascosti o aperti. Un linguaggio nascosto non viene definito esplicitamente dagli sviluppatori ma è il protocollo intrinseco di un’interfaccia che utilizza l’applicazione per leggere dei dati che vengono inviati da una componente software all’altra. Un linguaggio aperto invece è esplicitamente specificato dalla documentazione come per esempio un protocollo di rete come POP3 o IP. La base teorica del syntax testing è che ogni interfaccia ha associato un linguaggio, aperto o nascosto che sia, la cui implementazione può essere analizzata con uno sforzo relativamente limitato [31]. Per automatizzare la generazione dei test case per questo tipo di testing è necessario fornire un modello del linguaggio di input che può essere utilizzato dalla macchina: un esempio di grammatica formale per la definizione di una specifica è il BNF (Backus-Naur form) o le espressioni regolari [32]: entrambe queste notazioni definiscono dei linguaggi liberi dal contesto. Una frase di un linguaggio è una sequenza di simboli inseriti secondo delle regole sintattiche, i linguaggi liberi dal contesto vengono utilizzati per definire tali regole e per verificare se un’espressione è sintatticamente corretta per quel linguaggio; questi particolari linguaggi vengono utilizzati per esempio nei parser per validare le espressioni in ingresso. Nel testing possiamo utilizzare tali linguaggi descrittivi per creare delle sequenze da mandare in input al sistema sotto analisi per valutarne il comportamento. La generazione dei test case può inizialmente produrre delle sequenze contenenti solo un errore, cioè un punto in cui non vengono rispettate le regole del linguaggio, per poi successivamente 3.1. Black-Box Testing 139 inserire doppi errori, tripli e cosı̀ via; quindi il numero dei test case prodotti aumenterà esponenzialmente al numero degli errori che verranno introdotti. Possiamo poi introdurre vari tipologie di errori: • Errori di sintassi: violazioni della grammatica del linguaggio, vengono creati rimuovendo un elemento, aggiungendone uno non previsto o inserendoli in ordine scorretto. • Delimiter error : i delimitatori rappresentano la separazione fra diversi campi della sequenza; nei linguaggi human readable, codificati in ASCII, i campi vengono sperati o da spazi (space o tab) oppure da simboli di delimitazione come virgole o punto e virgola. Per introdurre questo tipo di errore si può rimuovere uno di questi simboli o inserirlo più volte o sostituirlo con un altro analogo. Nel caso di limitatori che vengono usati a coppie come le parentesi possono essere inseriti in modo non bilanciato. • Field-value error : solitamente il valore di un campo risulta valido quando rientra in un certo intervallo, si possono quindi introdurre valori errati fuori dagli intervalli di validità. • Context-dependent error : violano delle regole che definiscono i valori che possono essere assunti dai campi in base al contesto, sono proprietà che non possono essere descritte dale grammatiche libere dal contesto. • State dependency error : non tutte le espressioni sono valide ma dipendono dallo stato in cui si trova il sistema: errori di questo tipo consistono nell’inviare un’espressione non valida nello stato in cui si trova in quel momento. 140 Capitolo 3. S.T.R.E.S.S. Solitamente è possibile automatizzare il processi di creazione delle sequenze corrette, per poi andare ad inserire gli errori per generare i test case. I tool di test che implementano questa tipologia di approccio possono permettere la definizione di una specifica della sintassi, per creare la test suite in modo automatico. Questa fase di generazione automatica può essere molto complessa perché può avvenire che le informazioni da inviare all’interfaccia siano miste: per esempio una richiesta HTTP può avere al suo interno script SQL o Javascript. Proprio questa caratteristica di alcuni protocolli causa vulnerabilità di tipo injection, per esempio la possibilità da parte dell’utente di inserire dati in alcune posizioni come una query SQL all’interno di una URI. Un ulteriore esempio di vulnerabilità causata da una injection che può essere rivelata dal syntax test è il cross-site scripting (XSS) [33]: questo tipo di attacco prevede l’inserimento da parte dell’attaccante di codice all’interno della pagina web in modo che venga successivamente eseguito sulla macchina delle vittime. In questo caso il codice inserito viene interpretato dal client della vittima, ma la vulnerabilità è nel server che ha permesso l’injection di codice per la mancanza di un corretto controllo dell’input (la URI è un input per i server web). Exploratory Testing Quando parliamo di test per la sicurezza a volte può essere utile procedere “a vista” senza avere aspettative sull’esito delle risposte. Questo perché il tester può rivelare anomalie nel comportamento o spostare l’attenzione su particolari elementi del sistema da analizzare più approfonditamente con un approccio più standard. Questo tipo di metodologia di testing è sensibilmente differente rispetto alle precedenti, solitamente infatti quando si procede con l’esecuzione dei test si hanno informazioni precise sul tipo di risposta atte- 3.1. Black-Box Testing 141 sa. Però può essere utile procedere con l’analisi senza pattern predefiniti, facendo in modo che il passo successivo venga guidato da quello precedente. Quindi il tester esplora il comportamento dell’oggetto sotto test: soprattutto quando viene rivelata un’anomalia è utile indagare tramite nuovi test case. La maggior parte delle tecniche di testing possono essere usate per questo tipo di approccio, ma alcune si prestano particolarmente, come per esempio il fuzzing (capitolo 3.1.3), e generalmente vengono utilizzate quando è difficile dire quali siano le anomalie che possono presentarsi nel comportamento del sistema. Ovviamente il limite maggiore per un approccio del genere è la mancanza di una metodologia vera e propria, di fatto non si tratta di un vero e proprio sistema di testing: la sua esecuzione non può essere oggetto di pianificazione e risulta profondamente dipendente dall’esperienza del utente che ne guida l’avanzamento. Penetration Test Un particolare approccio che può essere classificato come exploratory testing è il penetration testing: si parla di una metodologia per ricercare le vulnerabilità all’interno di un software o di una infrastruttura per successivamente sfruttarla ed attaccare effettivamente il sistema, simulando un attacco reale. Durante questo tipo di procedura, il tester può ricercare nel sistema delle vulnerabilità conosciute per poterle sfruttare, tale ricerca può avvenire in modo manuale o automatico: nel secondo caso vi sono tool specifici (security scanner ) che aiutano l’operatore andando a cercare eventuali problematiche appoggiandosi ad un database contenente le vulnerabilità segnalate in passato. Inoltre spesso si possono creare input potenzialmente dannosi da inviare al sistema, anche in questo caso aiutati da tool automatici. 142 Capitolo 3. S.T.R.E.S.S. Stress Testing L’obiettivo di questo metodo di testing è valutare il comportamento del sistema quando è sottoposto ad un pesante carico di richieste, per esempio possono essere fatte richieste multiple o molto complesse o trasferimenti ingenti di dati; quindi si cerca di creare delle condizioni estreme per simulare particolari eventi quali risorse esaurite o guasti hardware. Come prima cosa durante lo stress test si cerca di evidenziare se l’applicazione è in grado di continuare a fornire il servizio e con che livello di qualità, mentre se vogliamo concentrarci su aspetti di sicurezza si cercano di individuare anomalie di tipo diverso; per esempio si cerca di far eseguire le routine per la gestione degli errori per valutarne la correttezza e la robustezza oppure si può cercare di rallentare il sistema per sfruttare problematiche di race condition. Per quanto riguarda il testing della sicurezza questo tipo di approccio si basa sull’idea che un attaccante è in grado di riprodurre ogni tipo di situazione, anche la più estrema per riuscire a sfruttare qualche vulnerabilità per compromettere il sistema [21]. Fault Injection Procedura ereditata dal testing applicato a piattaforme hardware, prevede la manomissione volontaria di certe componenti per valutare la resistenza delle altre ad eventuali guasti. Mutuando questo tipo di approccio al testing del software si inseriscono dei guasti volontari all’interno della comunicazione o in dati che vengono inviati ad un’interfaccia valutandone cosı̀ il comportamento. Visto che in una filosofia black box non possiamo andare a modificare componenti interne del codice, necessariamente l’inserimento del guasto deve avvenire su un’interfaccia esterna, come nel nostro caso per analizzare le implementazioni di protocolli di rete. Questa metodologia può essere utilizzata 3.1. Black-Box Testing 143 sia per eseguire stress test che per valutare la robustezza del software ad anomalie nelle comunicazioni di rete, ma anche per esempio per un syntax testing. Monitoring Una componente fondamentale di tutte queste procedure è la capacità di osservare il comportamento della componente sotto analisi per valutare il risultato dei vari test case. Questo è ancora più difficile nel testing per la sicurezza di un sistema poiché, a differenza del conformance testing, non ci si può basare esclusivamente sui messaggi di risposta o sull’assenza di essi; devono essere valutati anche altri aspetti che possono essere sintomi di una vulnerabilità anche in presenza di risposte corrette secondo lo standard. Infatti, là dove possibile, in un approccio black box, si deve cercare di monitorare parametri spesso invisibili al normale utente, tipo l’utilizzo delle risorse del sistema o il proliferare di processi figli. Automatizzare questo aspetto del testing può essere estremamente utile soprattutto quando vengono utilizzati approcci come il fuzzing che operano con alti volumi di dati procedendo alla “cieca”. 3.1.4 Stato dell’arte degli strumenti esistenti Come accennato precedentemente, l’attività di software testing è molto onerosa, la stima ci dice che il 50% dei costi dello sviluppo vengono assorbiti da questa attività, costi che aumentano nel caso di applicazioni critiche [34]. Ovviamente lo sviluppo di strumenti automatici per il testing può permettere un’agevolazione del lavoro da parte del tester, velocizzandone l’attività. Vi sono vari tipi di strumenti che variano per la generalità e per il grado di automazione: ce ne sono di disponibili sia specifici per un singolo protocollo 144 Capitolo 3. S.T.R.E.S.S. che sotto forma di framework, o librerie per dare supporto per lo sviluppo di applicativi veri e propri. Andiamo a presentare alcuni di questi strumenti, prevalentemente non specifici ma che possono essere usati per più protocolli. I progetti PROTOS e PROTOS protocol genome Il progetto PROTOS [29] nasce nel 1999 come collaborazione fra la VTT Electronics e l’Università di Oulu, come attività di ricerca per valutare differenti approcci al testing funzionale di protocolli, con particolare attenzione alla robustezza del software. Viene sviluppato un metodo che prevede la produzione di un gran numero di test case con l’inserimento all’interno di un pacchetto di uno o due elementi modificati mentre le restanti parti risultano intatte e quindi valide. Per prima cosa viene scritto un modello formale del linguaggio dell’interfaccia da analizzare tramite l’utilizzo di una grammatica libera dal contesto (BNF); successivamente questa specifica viene semplificata ed arricchita tramite regole che aggiungono elementi semantici alla specifica del linguaggio. Una volta creato il modello di base vengono prodotti alcuni test case senza l’inserimento di componenti eccezionali per validare la rappresentazione prodotta dello standard e, solo successivamente, si andrà a stilare manualmente una lista di anomalie che verranno inserite all’interno dei pacchetti durante la generazione automatica dei vari test case. Infine si andrà ad eseguire i vari test sull’implementazione sotto analisi. Va fatta una considerazione, una volta generati i test case, nel caso si voglia andare ad aggiungere delle anomalie, sarà necessario riavviare da principio la fase automatica per la loro generazione. Questo metodologia permette senza problemi di andare a testare protocolli stateless, mentre per quelli stateful i test in BNF devono essere valutati in modo da poter raggiungere lo stato da analizzare e poi inserire le anomalie. La fase successiva ai test di analisi dei risul- 3.1. Black-Box Testing 145 tati si basa sui log prodotti. Per le caratteristiche di questo approccio viene prevalentemente utilizzato per applicazioni di tipo client server con protocolli request-response, fra gli altri LDAP, SNMP, H.323 e SIP [35]. PROTOS Protocol Genome Come evoluzione di PROTOS nel 2003 nasce il progetto PROTOS Protocol Genome con lo scopo di creare una serie di strumenti per produrre automaticamente i test case partendo da dati validi per aiutare e completare la fase di creazione manuale dei test. L’idea alla base di questo progetto consiste nell’identificare dei blocchi strutturali che solitamente vengono usati nei vari protocolli, che quindi possono contenere tipi di vulnerabilità simili, anche in diverse implementazioni di differenti protocolli. Questi blocchi prendono il nome di protocol gene [36]. La metodologia di generazione automatica dei test case prende il nome di model inference assisted fuzzing e prevede l’analisi di un certo quantitativo di dati di training di traffico valido da utilizzare come modello per la produzione dei frame per il testing di robustezza. Questo approccio rappresenta una via di mezzo fra il design manuale e un fuzzing completamente casuale. Una sostanziale differenza rispetto al progetto originario è che questa metodologia non viene applicata solamente a protocolli di rete ma a tutta una serie di linguaggi implementati da varie interfacce e quindi da applicativi diversi; per esempio è stato utilizzato per valutare come gli antivirus trattavano formati di compressione file differenti. Partendo da data set di training costituiti da alcuni file compressi con un certo algoritmo, è stato prodotto un modello per ogni formato e da questo una gran quantità di file modificati da far analizzare ai vari antivirus. Gli autori hanno evidenziato un limite in questo approccio; vi è nel modello una mancanza di conoscenza sul dominio, manca cioè ogni tipo di significato semantico dei dati. 146 Capitolo 3. S.T.R.E.S.S. Codenomicon Defensic Da una spin-off del progetto PROTOS, Codenomicon, nasce un software commerciale denominato Defensic che prevede una serie di strumenti per eseguire testing di robustezza, ognuno dei quali è specifico per un singolo protocollo. Applicativi per il fuzzing All’interno del fuzzing rientrano un gran numero di strumenti, ognuno specifico per un certo formato di file o per un protocollo di rete, che possono essere utilizzati per analizzare ogni tipo di applicazione che implementa tale linguaggio. Inoltre vi sono fuzzer più semplici che effettuano delle mutazioni partendo da dati validi, e che quindi possono essere utilizzati con più protocolli differenti. Infine vi sono i fuzzing framework che forniscono un ambiente per gli sviluppatori di fuzzer per fornire maggiore flessibilità e permettere di produrre strumenti per protocolli proprietari o non ancora testati [37], fornendo delle API per velocizzare o astrarre alcune procedure quali: • assistenza nella creazione del modello del linguaggio, per esempio un programma di conversione che prende in input del traffico di rete traducendoli in un formato leggibile dal framework; • ricalcolo automatico della lunghezza dei campi di un pacchetto in modo da poter modificare dei dati ma automaticamente mantenere coerente e valido il frame; • calcolo dei checksum; • metodo per generare dati random; • fornire alcune euristiche d’attacco; • fornire strumenti per rilevare la presenza di guasti nel software; 3.1. Black-Box Testing 147 • strumenti e convenzioni per lo sviluppo degli strumenti permettendone la riusabilità per progetti futuri e garantendone l’evoluzione. SPIKE Sviluppato da Dave Aitel, SPIKE [38], è un fuzzing framework scritto in C che fornisce una serie di API per lo sviluppo di fuzzer per protocolli di rete, include delle primitive molto frequenti nei vari protocolli e include anche alcuni moduli per i quelli più usati. Utilizza un approccio block-based [39], la sintassi del protocollo viene divisa in blocchi di dati che successivamente vengono mutati. Questi blocchi vengono definiti tramite strutture denominate spike (da questo il nome del framework) che contengono sia i dati binari che la loro lunghezza. Per utilizzarlo è necessario catturare traffico valido ed immetterlo nel framework andando a definire i vari campi usando le sue librerie, andando cosı̀ a creare i vari blocchi; dopodiché i blocchi vengono mutati con valori casuali o con valori presi da set di stringhe o interi (euristiche d’attacco). Il difetto di questo progetto è la mancanza di documentazione e dell’organizzazione dei moduli distribuiti, ogni piccolo cambiamento, anche l’aggiunta di una stringa in un’euristica richiede la ricompilazione dell’intero pacchetto ed infine manca di strumenti che facilitino la riusabilità delle componenti realizzate. Riscritto in Python è stato integrato nel framework per penetration test CANVAS. Peach Peach è un framework multi piattaforma scritto in Python sotto licenza MIT, permette la definizione dei dati da sottoporre al fuzzing tramite XML, ed è in grado di modellare: • informazioni sui tipi; • relazioni fra i campi come dimensioni o contatori; • checksum; 148 Capitolo 3. S.T.R.E.S.S. • trasformazioni di dati come la compressione; • modellazione basi di una macchina a stati. Questo framwork è in grado di produrre i test case sia tramite generazione che mutazione. GPF: General Purpose Fuzzer GPF [40] è un tool opensource per piattaforme Unix, progettato come fuzzer generico può essere utilizzato sia come fuzzer casuale, ma può anche effettuare mutazioni di dati empirici o modellare manualmente un protocollo, tramite file scritti in C denominati tokAids. L’utilizzo di questo framwork è molto complesso: infatti la modellazione degli standard usando i tokAids non è semplice [37]. É stato integrato nel progetto Evolutionary Fuzzing System che si prefissa di utilizzare algoritmi genetici per produrre gli input da inviare alle componenti software. Si basa sull’utilizzo di sessioni di dati semi valide che vengono inviate alla componente monitorata con un debugger (in questo caso si può parlare di grey testing); i risultati vengono inseriti in un database e tramite un algoritmo genetico si cercano di modificare le sessioni facendole evolvere per le interazioni successive. Autodafè Un framework fuzzing sviluppato sotto GPL per piattaforma Unix [41] utilizza un approccio basato su strutture a blocchi; si prefissa come scopo principale quello di ridurre le dimensioni dello spazio di fuzzing, andando a modificare quelle aree del pacchetti che possono portare con maggior probabilità alla scoperta di vulnerabilità. I blocchi sono i marker che vanno a definire un certo dato del pacchetto, associandogli un peso che servirà per generare una scala di priorità con cui verranno processati i vari campi. Anche in questo framework possiamo parlare di grey testing, poiché 3.2. Sviluppo piattaforma S.T.R.E.S.S. 149 integra un debugger che va a monitorare le chiamate alle API che vengono ritenute pericolose come fprintf() e che utilizzano delle stringhe generate dal framework. Sulley Un altro framework scritto in Python utilizzato per sviluppo di fuzzer e costituito da vari componenti estendibili. La maggior parte dei fuzzer si concentrano sulle modalità di generazione dei dati, sulley invece si concentra anche sulla parte di invio dei dati e sul monitoraggio del target [37]. Inoltre vengono affrontate le problematiche inerenti allo sviluppo di modelli per protocolli stateful: raccogliendo le varie richieste da inviare ad un target viene creato un grafo che successivamente verrà esplorato per analizzare i vari percorsi interni. Sulley è l’unico framework che cerca di affrontare in maniera differente la problematica degli stati in cui può trovarsi la IUT, solitamente infatti vengono mandati messaggi in sequenza senza tener conto dello stato attuale. Conseguentemente la maggior parte dei fuzzer vanno a testare solo una parte dell’implementazione del protocollo, quella più superficiale, senza considerare gli stati più nascosti. 3.2 Sviluppo piattaforma S.T.R.E.S.S. Abbiamo presentato diverse soluzioni che vengono fornite per agevolare l’attività di testing funzionale, sia come supporto che come automazione; lo scopo dell’attività di questo dottorato di ricerca è quella di studiare una metodologia di testing funzionale per la robustezza delle implementazioni di protocolli di rete tramite un approccio di fault injection e sviluppare una piattaforma per la generazione automatica dei test case, la loro esecuzione e l’analisi del comportamento dell’oggetto sotto analisi. L’idea alla base della nostra piattaforma rientra nell’intersezione fra syntax testing e fuzzing, 150 Capitolo 3. S.T.R.E.S.S. quindi si cerca di valutare le reazioni delle componenti in risposta a guasti inviati in input, ma nonostante tutto la flessibilità del framwork ci permette di utilizzarlo anche per valutare la conformità delle IUT alle specifiche dei vari protocolli. Inoltre gli standard, che possono essere oggetti dello studio, sono dislocati in differenti livelli della pila ISO/OSI permettendo quindi un analisi sia a basso livello che a livello delle applicazioni utente. I software sviluppati possono essere utilizzati come supporto per attività quali stress test, testing di esplorazione. Infine, le particolari caratteristiche di espandibilità e di analisi del comportamento agevola anche attività di reverse engineering per la ricostruzione del funzionamento di implementazioni proprietarie [42]. S.T.R.E.S.S. è stato ideato per lavorare con software di rete ma non è vincolato a nessun protocollo, infatti è in grado di riprodurre un qualsiasi linguaggio, previa sua definizione formale tramite linguaggio libero dal contesto. Nel nostro caso abbiamo scelto di utilizzare l’Augumented BackusNaur Form (ABNF) [43], una versione modificata del BNF, definita nel RFC 5234, espressamente ideata per la definizione di specifiche di protocolli di rete. Il funzionamento del framework è schematizzato in figura 3.2, l’utente fornisce un modello del protocollo in ABNF, questo modello viene utilizzato per creare in memoria il motore dei test case, la piattaforma inserisce automaticamente delle anomalie secondo un’euristica di attacco ed inizia l’esecuzione dei test. Durante i test run viene monitorato l’apparato o il software oggetto dell’analisi per poi produrre degli output in vari formati (per esempio in XML) contenenti sia i messaggi scambiati sia le informazioni prelevate dai sensori di monitoring. Inoltre stiamo tutt’ora lavorando sulla parte di post processing degli output per la rilevazione automatica dell’esito dei test case. La parte principale del framework è stata sviluppata in C/C++ per poter operare agevolmente anche a basso livello, mentre altri componenti come il 3.2. Sviluppo piattaforma S.T.R.E.S.S. 151 parser dell’output per fini statistici, editor di file ABNF e GUI sono state sviluppate usando il linguaggio Ruby. Figura 3.2: Schema del funzionamento della piattaforma S.T.R.E.S.S. 3.2.1 Generalità dei protocolli utilizzabili Uno delle feature principali del framework è l’assoluta generalità del suo utilizzo, la possibilità di eseguire test su diversi protocolli anche indipendentemente dal layer della pila ISO/OSI. Si è quindi resa necessaria la creazione 152 Capitolo 3. S.T.R.E.S.S. di un sistema per rappresentare un linguaggio comprensibile alla piattaforma che le permetta di parlare e comunicare in modo corretto seguendo tale sintassi. Dopo l’analisi di varie soluzioni tipo ASN.1 o SDL si è deciso di adottare una grammatica libera dal contesto, cioè una meta sintassi dove ogni regola sintattica viene espressa tramite una derivazione, cioè un’equivalenza fra un simbolo non terminale a sinistra di un simbolo di uguaglianza e uno o più simboli terminali o non a destra. Formalmente può essere definita come una quadrupla: G =< N, Σ, P, S > dove • N è un insieme finito di simboli non terminali • Σ è un insieme finito di simboli terminali • P è un insieme di regole di derivazione • S ∈ N è un elemento dei simboli non terminali e costituisce il simbolo di partenza. • Gli elementi di P sono nella forma N = (Σ ∪ N ) Le regole di derivazione trasformano una stringa composta da alcuni simboli terminali e altri non terminali in un’altra stringa e cosı̀ via fino ad ottenere una stringa di soli simboli terminali. Quindi un linguaggio descritto da una grammatica di questo tipo è tutto l’insieme di stringhe costituite da simboli appartenenti a Σ che possono essere derivati con una sequenza di passaggi di riscrittura, partendo dal simbolo di partenza S. Linguaggio di definizione dei protocolli: ABNF Fra le possibili grammatiche libere dal contesto ve ne è una, derivata dal BNF, specifica per rappresentare protocolli di rete bidirezionali, standardiz- 3.2. Sviluppo piattaforma S.T.R.E.S.S. 153 zata dall’IETF definita nel RFC 5234 [43]. Una specifica in ABNF è costituita da un insieme di regole (chiamate nella specifica rule) costituite da: rulename = elements rulename ∈ N elements ∈ (Σ ∪ N ) dove rulename è il nome della regola e gli elements sono uno o più simboli terminali o non terminali. I simboli appartenenti all’insieme Σ possono essere o stringhe o valori numerici: le stringhe vengono definite fra virgolette mentre i valori numerici avranno una notazione specifica: saranno indicati dal simbolo % seguito da una lettera che rappresenta la base con cui viene rappresentato il valore: • %d rappresenta base decimale quindi il numero 34 sarà espresso dal simbolo %d34 • %x rappresenta base esadecimale quindi il numero 10 sarà espresso dal simbolo %x0a o %xa • %b rappresenta base binaria quindi il numero 9 sarà espresso dal simbolo %b101 o %b0101 o 00000101 ¯ Fra i simboli che possono essere introdotti nel lato destro delle regole vi sono alcuni operatori che permettono di combinare gli altri elementi presenti alla destra dell’uguaglianza: l’operatore di concatenazione permette di definire una serie di elementi che, in fase di lettura, produrranno un simbolo terminale formato dalla loro successione. Per esempio la seguente definizione: 154 Capitolo 3. S.T.R.E.S.S. elemento1 = ‘‘Ciao’’ elemento2 = ‘‘ ’’ elemento3 = ‘‘mondo’’ saluto = elemento1 elemento2 elemento3 Produrrà la stringa “Ciao mondo” che corrisponde alla regola saluto. L’altro operatore di alternativa è il simbolo “/ ” che separa i possibili valori di sostituzione: saluto = ‘‘ciao’’ / ‘‘mondo’’ In questo caso la regola saluto può corrispondere sia alla stringa “ciao” che alla stringa “mondo”. Inoltre vi sono altri tipi di operatori per indicare intervalli di valori, ripetizioni di elementi, sequenza opzionali o gruppi di elementi. Il modello del protocollo viene quindi creato tramite una serie di regole di conversione, queste andranno a costruire una struttura ad albero, dove la radice rappresenta il simbolo iniziale S ∈ N , ogni nodo dell’albero sarà rappresentato da un elemento non terminale dell’ABNF, mentre le foglie saranno gli elementi terminali. Per riprodurre la stringa valida per il linguaggio modellato si deve percorrere l’albero in profondità da sinistra verso destra (in figura 3.3 un esempio con riferimento all’albero ABNF descritto precedentemente). Per definire quindi uno scambio di pacchetti secondo un linguaggio si vanno a creare delle regole di derivazione con la descrizione dei contenuti dei pacchetti previsti dallo standard, per esempio nel caso del protocollo POP3 [44] la fase di connessione ed autenticazione prevede inizialmente la ricezione del banner del server, poi l’invio di un pacchetto contenente il nome utente, e successivamente un secondo con la password; in risposta il 3.2. Sviluppo piattaforma S.T.R.E.S.S. 155 Figura 3.3: Creazione dei messaggi utilizzando l’albero ABNF server dovrà inviare degli acknowledge ed alla fine della procedura, l’esito dell’autenticazione. Tale scambio di pacchetti può essere definito con: protocollo_pop3 = connect autenticazione connect = <%TCP_read%> descrizione descrizione = "+OK Dovecot ready." %x0d0a autenticazione = login read_ok password read_ok_login login = <%TCP_send%> ‘‘User guest’’ %x0d0a read_ok = <%TCP_read%> ‘‘+OK’’ %x0d0a password = <%TCP_send%> ‘‘Pass guest’’ %x0d0a read_ok_login = <%TCP_read%> ‘‘+OK Logged in.’’ %x0d0a I simboli terminali fra parentesi angolari < e > rappresentano le istruzioni per l’invio e la ricezione dei pacchetti e verranno illustrati più approfonditamente nella sezione 3.2.1. Quindi percorrendo l’albero del protcollo POP3 (figura 3.4) otterremo: <%TCP_read%> "+OK Dovecot ready." %x0d0a <%TCP_send%> ‘‘User guest’’ %x0d0a 156 Capitolo 3. S.T.R.E.S.S. <%TCP_read%> ‘‘+OK’’ %x0d0a <%TCP_send%> ‘‘Pass guest’’ %x0d0a <%TCP_read%> ‘‘+OK Logged in.’’ %x0d0a che corrisponde allo scambio di messaggi fra un client ed un server che implementano tale standard per l’accesso remoto alle caselle di posta elettronica. Figura 3.4: Modello ABNF del protocollo POP3: creazione di traffico valido L’esempio preso in considerazione è piuttosto semplice e rappresenta lo scambio di un numero limitato di pacchetti; attraverso le definizioni in ABNF siamo in grado di rappresentare modelli molto più complessi. L’operatore di alternativa rappresenta la possibilità di avere due o più possibili scelte e quindi avremo due o più possibili sequenze di messaggi rappresentati dal nostro modello. Questo operatore viene utilizzato nell’ambito del nostro framework per inserire delle anomalie: partendo dal modello del protocollo si vanno ad immettere dei valori dei campi errati o non previsti, come alternativa ai dati corretti andando cosı̀ a creare situazioni non previste dallo standard per valutare la robustezza della IUT (l’esempio in figura 3.5 prevede l’inserimento di alcune guasti rappresentati dall’elemento Anomalies nella richiesta di login). 3.2. Sviluppo piattaforma S.T.R.E.S.S. 157 Figura 3.5: Esempio di inserimento di anomalie all’interno del modello ABNF Estensione del linguaggio per l’uso nella piattaforma di testing Abbiamo visto che la potenza espressiva dell’ABNF è in grado di descrivere un protocollo di rete, ma, per poterlo utilizzare per la creazione dei test suite per il framework, è stata inserita la possibilità di immettere dei comandi: delle azioni che la piattaforma S.T.R.E.S.S. elabora durante l’esecuzione dei test case. Quindi per aggiungere questi comandi è stata utilizzata la sintassi dell’ABNF in modo da includere tali azioni nel modello stesso del protocollo, ma non andando a modificare in alcun modo le specifiche del metalinguaggio: secondo lo standard, fra i simboli terminali sono previsti alcuni elementi racchiusi dalle parentesi angolari “<” e “>”, che vengono utilizzati per inserire delle descrizioni testuali; in questo caso vengono utilizzate per istruire la piattaforma sulle azioni da compiere o sulle eventuali elaborazioni da effettuare. La sintassi utilizzata prevede che il primo simbolo della regola di derivazione sia quello del comando seguito da eventuali argomenti: nodo_comando = <%comando%> argomento1 argomento2 ... argomentoN In questo modo, quando viene percorso l’albero ABNF il primo nodo terminale che viene letto sarà quello del comando e quindi permetterà di continuare l’esplorazione utilizzando i nodi fratelli come argomenti. Come verrà illus- 158 Capitolo 3. S.T.R.E.S.S. trato nella sezione 3.2.2, il framework è stato pensato per permettere una facile espandibilità ed agile implementazione di nuove azioni. Comandi per la comunicazione Fra le azioni sviluppate, quelle di fondamentale importanza sono le istruzioni per l’invio e la ricezione dei pacchetti di rete, indispensabili per l’esecuzione dei vari test case che vengono generati. Attualmente sono state implementate: • < %T CP send% > e < %T CP read% > invio e ricezione di un pacchetto di tipo TCP, all’inizio di un test case il framework si occuperà di instaurare automaticamente la connessione TCP con la IUT ed al termine si disconnetterà chiudendo la socket di comunicazione; • < %U DP send% > e < %U DP read% > invio e ricezione di un pacchetto di tipo UDP; • < %RAW send% > e < %RAW read% > invio e ricezione di un pacchetto a livello collegamento dati (livello 2 della pila ISO/OSI). Comandi di comunicazione di rete che utilizzano diversi protocolli a livello trasporto o socket a diversa profondità della pila ISO/OSI permettono di garantire la generalità della descrizione di protocolli utilizzando il linguaggio ABNF. Infatti, in protocolli di alto livello, viene demandata la costruzione dei pacchetti dei layer più bassi al sistema dei socket del sistema operativo, altrimenti può essere creato il modello degli incapsulamenti, andando cosı̀ ad utilizzare i vari standard protocollari permettendo l’analisi delle IUT dei vari livelli ISO/OSI. Quindi il comando < %T CP send% >, visto precedentemente nel modello dello standard POP3, permette l’invio di un pacchetto su una socket TCP (senza quindi definirne l’header dei livelli inferiori): il 3.2. Sviluppo piattaforma S.T.R.E.S.S. 159 pacchetto da inviare viene definito dalla concatenazione di simboli a destra del comando di invio: login = <%TCP_send%> ‘‘User guest’’ %x0d0a piloterà la piattaforma per inviare un pacchetto TCP contenente la stringa User guest con alla fine il terminatore cr-nl. Figura 3.6: Esempio di pacchetto di login inviato durante una sessione valida del protocollo POP3 Invece il comando < %T CP read% > pilota il framework perché si metta in ascolto sulla socket TCP in attesa di pacchetti in arrivo: alla ricezione il contenuto viene memorizzato e successivamente vengono eseguiti i nodi rappresentati dai simboli alla destra del comando di lettura. <%TCP_read%> ‘‘+OK’’ %x0d0a In questo caso non sono presenti ulteriori azioni da eseguire sui dati ma, nei log in output al test case, verrà associate al messaggio ricevuto le informazioni 160 Capitolo 3. S.T.R.E.S.S. attese (“+OK” %x0d0a) utili per un’analisi successiva. Sono stati inoltre implementati alcuni comandi (capitolo 3.2.1) per permettere un controllo al momento della ricezione e quindi valutare se il messaggio ricevuto è quello atteso o si continuerà a rimanere in ascolto fino alla ricezione del frame o fino alla scadenza del timeout. Il funzionamento dei comandi per UDP e RAW è analogo a quelli appena presentati, l’unica differenza riguarda l’invio e la ricezione tramite il socket RAW, oltre ad avere la necessità di avviare il framework con permessi di amministratore, la definizione del pacchetto risulterà diversa e poiché è necessario andare a definire un frame di contenuti binari. Comandi di controllo dei dati Come accennato precedentemente, quando si ha un’azione di ricezione di un pacchetto, si possono eseguire alcuni controlli per valutare se il frame era quello atteso o meno. Questa possibilità non è particolarmente utile per quanto riguarda la ricezione su socket TCP o UDP ma risulta fondamentale nell’utilizzo di quelli RAW: infatti quando si attiva in lettura una socket su un’interfaccia di rete di tipo wireless, non riceviamo solamente i frame diretti alla stazione che esegue i test, ma vengono letti i frame di tutte le macchine presenti, i frame di controllo e di gestione del canale, fra cui i beacon. Si è reso quindi indispensabile lo sviluppo di un sistema che ci permetta di filtrare tali informazioni per prelevare ed analizzare solo quelle interessanti al fine dei test. I comandi attualmente implementati sono: • < %M askCheck% >: prevede la presenza obbligatoria di due informazioni. La prima deve contenere la maschera per il confronto e la seconda i dati da confrontare; il funzionamento è analogo alle operazioni che vengono eseguite per capire se due indirizzi IP appartengono 3.2. Sviluppo piattaforma S.T.R.E.S.S. 161 alla stessa sottorete tramite l’uso della netmask. Il framework esegue un and bit a bit fra la maschera ed i dati, poi fra la maschera ed il pacchetto ricevuto e se il risultato è lo stesso il pacchetto supera il controllo. controllo = <%MaskCheck%> mask data mask = %xff data = %x80 Nell’esempio viene valutato se il primo byte del pacchetto ha un valore, in esadecimale, uguale ad 80. (nello standard IEEE 802.11 [45] corrisponde a verificare che il pacchetto ricevuto sia un beacon). • < %V alueCheck% >: prevede la presenza obbligatoria di tre informazioni, la prima il byte che indica la posizione della campo del pacchetto da controllare, la seconda la lunghezza del campo, e la terza il valore con cui confrontarlo. controllo = <%ValueCheck%> start size data start = %d0 size = %d4 data = ‘‘HTTP’’ Nell’esempio viene controllato che il pacchetto appena arrivato inizi (byte alla posizione 0) con una stringa di 4 caratteri che deve essere uguale ad HTTP. Comandi di elaborazione dei dati Per rappresentare molti protocolli è necessario prevedere delle direttive per effettuare alcune operazioni sui 162 Capitolo 3. S.T.R.E.S.S. dati: per esempio delle funzioni che possano dinamicamente calcolare checksum, codificare e decodificare informazioni, e cosı̀ via in modo da andare a riprodurre le varie primitive che vengono utilizzate all’interno degli standard di rete. Per l’utilizzo del framework sono stati implementati i comandi di: • < %Base64Encode% >: prevede almeno un’informazione che rappresenti i dati di input alla funzione di codifica base64, l’azione prevede il prelievo dei dati e la conversione nella stringa base64. encoded = <%Base64Encode%> "prova" • < %Base64Decode% >: prevede almeno un’informazione che rappresenti la stringa in base64 da decodificare, viene prelevata e convertita nei dati originali. decoded = <%Base64Decode%> "cHJvdmE=" • < %M D5% >: prevede almeno un’informazione che contenga l’input di cui deve essere calcolato la funzione di hash MD5. encoded = <%MD5%> "prova" • < %Sum% >: prevede due o più informazioni che contengano dei valori numerici che verranno sommati, se saranno presenti delle stringhe non convertibili in numero saranno equiparati al valore 0. dieci = <%Sum%> %d5 %d2 %x3 Nell’esempio viene sommato il valore in base decimale 5 più 2 più 3 in base esadecimale (che corrisponde a 3 in base decimale) ottenendo il risultato 10. 3.2. Sviluppo piattaforma S.T.R.E.S.S. 163 Comandi di memorizzazione Per poter produrre traffico valido secondo molto protocolli, è necessario elaborare molte informazioni che devono essere prelevate dai pacchetti ricevuti precedentemente. Si rende quindi indispensabile un sistema per estrarre delle informazioni al momento della ricezione di un pacchetto e per la loro successiva memorizzazione. Il comando ideato a questo scopo: • < %V ariable% >: prevede due modalità di utilizzo, nel caso in cui sia stata precedentemente memorizzata una variabile con il nome indicato oppure viene richiamata per la prima volta per quella variabile. Se deve essere memorizzato un valore il comando prevede tre informazioni che contengano in ordine, una stringa che indichi il nome della variabile, un valore numerico contenente il byte iniziale da cui leggere ed infine un valore numerico contenente la lunghezza delle informazioni da prelevare. var1 = <%Variable%> "NomeVar1" start size start = %d10 size = %d4 In questo esempio si comanda il framework di prelevare dall’ultimo pacchetti ricevuto una variabile, di nome NomeVar1 contenente i dati, dal decimo byte per una lunghezza di 4 byte. Se invece è già presente in memoria una variabile con quel nome è necessario introdurre solo la stringa identificativa in modo che il comando ritorni le informazioni in memoria. 164 Capitolo 3. S.T.R.E.S.S. 3.2.2 Componenti principali Per permettere l’esecuzione dei test case secondo un protocollo espresso in ABNF dobbiamo rappresentare in memoria l’albero prodotto dal meta linguaggio, per far questo è stato scelto di implementare tale struttura dati utilizzando il pattern Composite che permette la realizzazione di un albero costituito da oggetti di tipo diverso ma che possono venir utilizzati in modo uniforme [14]. In particolar modo i vari elementi dell’ABNF vengono rappresentati con oggetti differenti corrispondenti al simbolo terminale o non terminale del metalinguaggio: • Composite: rappresenta il nodo generico • OrComposite: reppresenta l’operatore alternativa • RepeatComposite: indica l’operatore per ripetizioni di un campo • Leaf: classe astratta che rappresenta la foglia dell’albero e quindi un nodo terminale dell’ABNF. Da questa classe ereditano gli oggetti che rappresentano i vari nodi terminali previsti: – StringLeaf: rappresenta una stringa – HexLeaf: rappresenta un valore numerico in base esadecimale – DecLeaf: rappresenta un valore numerico in base decimale – BinLeaf: rappresenta un valore numerico in base binaria – CommandComposite: è il nodo che corrisponde ad un comando, quindi ai simboli terminali racchiusi fra parentesi angolari Quindi la classe Composite viene creata da un simbolo non terminale dell’ABNF, da questa ereditano gli altri oggetti che andranno a sostituire 3.2. Sviluppo piattaforma S.T.R.E.S.S. 165 Figura 3.7: Diagramma delle classi del modello ABNF gli eventuali operatori e simboli terminali (figura 3.7). Con riferimento all’esempio in figura 3.5 il sotto albero raffigurante l’inserimento di anomalie nel pacchetto di login del protocollo POP3 verrà rappresentato in memoria dall’albero in figura 3.8. Figura 3.8: Rappresentazione della definizione ABNF del messaggio di login del POP3 166 Capitolo 3. S.T.R.E.S.S. Parser ABNF La componente del framework che va a costruire il modello ad albero è il parser ABNF, creato tramite la struttura rappresentata in figura 3.9. La classe ABNFParser costituisce l’interfaccia esposta verso il core della piattaforma; se l’esecuzione del parsing ha esito positivo allora viene creato l’albero ABNF e memorizzato un puntatore all’oggetto Composite che ne costituisce la radice. La classe yy::Parser è il risultato prodotto da Bison (capitolo 3.2.2), l’oggetto ParserDriver è usato per effettuare delle operazioni ausiliarie al parsing: istanzia il parser, apre il file, mantiene in memoria le strutture intermedie. Tale driver riporta al parser eventuali errori e l’esito dell’analisi del file di input. La creazione dei nodi dell’albero è delegata alla classe CompositeFactory. Figura 3.9: Diagramma delle classi della componente Parser Il parser utilizza alcune strutture intermedie per rappresentare i dati durante il processo, in particolare durante l’analisi sintattica vengono valutate le 3.2. Sviluppo piattaforma S.T.R.E.S.S. 167 Figura 3.10: Diagramma sequenziale della procedura di parsing regole grammaticali che definiscono l’ABNF e quindi saranno gestiti i simboli di tale linguaggio (che differiscono dai simboli della grammatica del protocollo che viene definito per mezzo dell’ABNF). Infatti i simboli che rappresentano il protocollo definito dal metalinguaggio sono quelli terminali dell’ABNF, ma nel processo di creazione dell’albero il parser deve valutare anche i simboli non terminali: per questo abbiamo creato la classe Symbol che rappresenta un qualunque simbolo della grammatica di specifica. Figura 3.11: La classe Symbol 168 Capitolo 3. S.T.R.E.S.S. A ciascun simbolo terminale corrisponde esattamente un simbolo della grammatica del protocollo e quindi un nodo dell’albero ma ad uno non terminale possono corrispondere più simboli della grammatica dello standard, infatti la regola di derivazione generica viene definita: rulename = elements con elements unione di uno o più elementi appartenenti agli insiemi dei simboli terminali e non. Se ci troviamo ad analizzare una riga del tipo: protocollo_pop3 = connect autenticazione possiamo far corrispondere il simbolo protocollo pop3 a rulename ed i due connect ed autenticazione ad elements; quindi all’elemento non terminale dell’ABNF elements corrispondono due simboli della grammatica che stiamo analizzando. La classe Symbol quindi ha un vettore di Composite in modo da mantenere legata ad i simboli dell’ABNF l’informazione necessaria per la costruzione dell’albero quando si va a ricostruire la struttura di derivazione descritta nel file in input. Quindi per ogni simbolo che il parser incontra, viene creato un oggetto Symbol e, se questo rappresenta una rulename, un valore numerico o un comando, viene richiamata la factory per istanziare l’oggetto Composite corrispondente. Alla fine, quando si trova la struttura base della regola, viene creato il sotto albero relativo, la radice corrisponde al nome della regola ed i figli rappresentano gli elementi che la costituiscono. I vari sotto alberi vengono inseriti in una mappa ed indicizzati in base al nome della radice, cosı̀ che, quando viene richiamato il processo di costruzione dell’albero, questo viene ricostruito in modo ricorsivo a partire dalla sua radice: ogni nodo cerca il suo identificativo nella mappa e aggiunge ai suoi figli quelli del sotto albero nella mappa, richiamando poi la costruzione per ognuno di quei nodi inseriti. 3.2. Sviluppo piattaforma S.T.R.E.S.S. 169 Successivamente abbiamo creato una serie di controlli da eseguire durante la creazione dell’albero, per validare alcune regole semantiche che non potevano essere espresse con una grammatica libera dal contesto: • una rule non può essere definita tramite se stessa, cioè il simbolo alla sinistra dell’uguale non può essere presente anche a destra; • tutti i nodi eccetto la radice devono avere un padre; il controllo viene fatto alla fine della creazione dell’albero consultando se tutti i nodi della mappa sono stati richiamati o meno. In caso contrario avremo un errore di unreference symbol ; • le foglie dell’albero devono essere simboli terminali del linguaggio; il controllo viene eseguito dopo la creazione dell’albero assicurandoci che tutte le foglie siano rappresentate da classi derivanti dalla classe astratta Leaf. In caso contrario avremo un errore di undefined symbol. Bison e Flex La costruzione di un parser può essere un’operazione complicata, esistono però degli strumenti che ne facilitano la creazione. Per il framework S.T.R.E.S.S. è stato adottato GNU Bison [46], utilizzato insieme al generatore di analizzatori lessicali Flex [47]. Bison è un progetto open source dello GNU Project, si tratta di un generatore di parser che converte una grammatica libera dal contesto in un parser per tale linguaggio, producendo codice C/C++. Flex è un generatore di scanner che produce codice C. Per la generazione di un parser per prima cosa è necessario descrivere la grammatica in un formato riconosciuto da Bison e definire l’azione che deve essere eseguita quando viene trovata una determinata regola sintattica. Successivamente si deve creare un analizzatore sintattico, tramite Flex, che prenda in input il file di descrizione del modello ABNF, ne estragga i vari elementi 170 Capitolo 3. S.T.R.E.S.S. costituenti, definiti token, per poi passarli al parser. La comunicazione dei token dall’analizzatore alla componente per la loro interpretazione avviene inserendo delle chiamate esplicite nel suo codice di controllo che richiama anche le funzioni per la gestione degli errori. La grammatiche viene descritta in un file (parser.yy) dove vengono rappresentate le regole sintattiche in un linguaggio BNF, le azioni associate alle varie regole sono porzioni di codice C/C++ che verranno richiamate dal parser ogni volta che una certa regola viene applicata. Analogamente Flex prende le regole lessicali di un linguaggio definite in un file (scanner.ll), descritte tramite espressioni regolari, sono associate ad una eventuale porzione di codice. L’utilizzo delle utility bison e flex con questi file producono come output dei file C e C++ che verranno inclusi nella componente del parser. Modularità delle operazioni Abbiamo visto che in memoria la struttura grammaticale dell’ABNF viene riprodotta da un albero di oggetti Composite, l’utilizzo di questo pattern permette di trattare ogni nodo dell’albero come un oggetto uniforme nonostante il differente significato sintattico. L’interfaccia esposta dalla classe Composite fornisce l’azione runTest() che permette l’esecuzione di un test case, ma questa distinzione sintattica non è sufficiente per riprodurre una completa procedura di testing. Infatti se consideriamo i vari comandi che vengono inseriti nella definizione ABNF, questi sono tutti tradotti come oggetti CommandComposite, senza alcun tipo di riferimento al comando effettivo, cioè non viene valutato il valore semantico del simbolo stesso. Per questo è stato necessario ampliare la struttura creata sull’ABNF con un sistema per associare a nodi dello stesso tipo delle funzionalità differenti. Quindi è stato incapsulato all’interno di una classe le azioni che vengono eseguite durante 3.2. Sviluppo piattaforma S.T.R.E.S.S. 171 i test case, in modo da creare un sistema che permettesse di avere delle azioni intercambiabili, facilmente mantenibili ed espandibili. La struttura che è stata creata segue i dettami del pattern Strategy [14]: definisce una classe astratta Action che fornisce un’interfaccia unica per tutti gli oggetti, composta da un metodo runAction(Composite*) che verrà richiamato dalla runTest() dei nodi dell’albero. Al primo metodo vengono delegate tutte le operazioni necessarie per l’invio e la ricezione dei pacchetti, l’inserimento delle anomalie, le varie funzionalità di elaborazione dati. Le classi che imple- Figura 3.12: Diagramma delle classi previsto secondo il pattern Strategy mentano Action vengono prelevate dalla ActionFactory nella fase successiva al parsing; alla factory viene delegato il riconoscimento delle azioni da istanziare in base al tipo di oggetto richiamante o in base ai suoi nodi figli. In particolare l’azione collegata ad un CommandComposite, non deve essere assegnata al nodo rappresentante quel simbolo ABNF, ma a quello padre che dovrà interpretare in maniera differente i risultati delle azioni degli altri nodi figli. Per esempio in figura 3.13 al nodo login verrà associata l’azione 172 Capitolo 3. S.T.R.E.S.S. TcpSendAction, definita questa dal suo primo nodo figlio, e quindi andrà ad utilizzare gli altri figli per costruire il pacchetto TCP da inviare. Figura 3.13: Esempio: come vengono associate le classi del pattern Strategy Nel dettaglio, ogni comando è identificato da una stringa che rappresenta il simbolo terminale che viene indicata nel file ABNF, quindi tale stringa determina il tipo di oggetto Action che dovrà venir istanziato ed associato al nodo competente. Quindi si rende necessario creare in memoria un database che permetta l’associazione fra la chiave che indica il comando con l’oggetto da utilizzare come azione. Viene quindi creata una mappa all’interno della ActionFactory dove sono inseriti i comandi disponibili con gli oggetti corrispondenti e si utilizza, come metodologia per la creazione di nuove istanze, il pattern Builder [14]. Per rendere più semplice la procedura di espansione del framework e di inserimento dei comandi nella mappa, abbiamo creato una classe astratta Command che deve venir implementata da tutte le classi dei comandi, fornendo cosı̀ l’interfaccia utilizzata per il pattern Builder per la creazione di nuovi oggeti ed il metodo per l’auto-registrazione nella mappa dell’oggetto stesso. Inoltre, per velocizzare ulteriormente l’aggiunta di nuovi comandi, è stato creata una classe ad-hoc (chiamata SkelCommand) con i suoi file di codice e di header contenenti la struttura vuota dell’oggetto che implementa un’azione; la procedura per inserire nuove istruzioni prevede: 3.2. Sviluppo piattaforma S.T.R.E.S.S. 173 1. la creazione dei nuovi file di codice e di header copiando e rinominando quelli dello SkelCommand; 2. lo sviluppo del metodo runAction(Composite*) che implementa l’azione da inserire; 3. indicare la stringa che rappresenta il comando nella definizione ABNF, che deve quindi essere racchiusa fra parentesi ancolate; 4. inserire all’interno dell’apposito file header include-actions.h l’include del nuovo file .h che si è andato a creare. In questo modo alla successiva ricompilazione, sarà automaticamente riconosciuto il nuovo comando ed all’avvio del programma, quando verrà creato il database, sarà inserita anche la nuova funzionalità. Figura 3.14: La classe ActionFactory Injector automatico di anomalie La specifica in ABNF prevede la possibilità di inserire manualmente le anomalie nel traffico di rete. Questa possibilità è essenziale quando vogliamo andare ad analizzare particolari aspetti ed alcuni punti precisi del protocollo, quindi in una fase più avanzata del processo di testing; risulta invece lungo e macchinoso operare un inserimento del genere nelle prime fasi, quando ci interessa 174 Capitolo 3. S.T.R.E.S.S. mettere sotto stress tutta la IUT. Per agevolare e velocizzare questo procedimento è stato progettato un sistema per permettere l’implementazione di euristiche di attacco per automatizzare l’inserimento delle anomalie favorendo il riutilizzo di tali euristiche per l’implementazione di protocolli diversi. Figura 3.15: Diagramma delle classi del sistema di inserimento automatico di anomalie Nella fase successiva al parsing ed alla creazione del modello, viene invocato l’AnomalyInjector, la classe che va ad implementare le procedure di ricerca all’interno dell’albero Composite, dei nodi dove andare ad inserire le anomalie, cioè quelli deputati all’invio dei pacchetti. Una volta identificati, questa richiama la classe InjectorPerformer che opererà sui figli di tali nodi ed andrà a modificare la parte del sotto albero contenente le informazioni che devono essere inserite all’interno del pacchetto da inviare. In base alle euristiche abilitate, i nodi foglia contenenti le informazioni corrette verranno sostituiti da un OrComposite (il nodo collegato all’operatore alternativa 3.2. Sviluppo piattaforma S.T.R.E.S.S. 175 e quindi alla presenza di anomalie) con vari figli contenenti il valore originale ed altri valori anomali. La selezione delle anomalie viene delegata alle classi Injector, che implementano le varie euristiche; nel nostro studio abbiamo implementato una semplice euristica che inserisce valori anomali solo nei campi stringa, ma possono essere implementate logiche più complesse che, analizzando la struttura dell’albero, possono inserire anomalie più raffinate (per esempio riconoscere campi di lunghezza o simboli terminatori). Attualmente l’unica euristica inserita opera solo sulle StringLeaf, quindi su i nodi che contengono il simbolo terminale ABNF di stringa operando le seguenti mutazioni: • Inserimento all’interno della stringa originale di alcuni byte speciali: – Terminatore: simbolo ABNF %x00; – Carriage Return: simbolo ABNF %x0d; – New Line: simbolo ABNF %x0a; • creazione di una stringa di input molto lunga ottenuta concatenando 512 volte la stringa originale; • sostituzione con una serie di byte non ASCII di uguale lunghezza; • un valore completamente casuale come in un fuzzer; • inserimento di una stringa nulla. Utilizzando questa euristica su un modello del protocollo POP3 che prevede l’invio di 5 messaggi di testo verranno prodotti il totale di 32768 test case. Per implementare nuove euristiche è necessario creare un nuovo oggetto che implementi l’interfaccia Injector, andando a produrre solo i metodi inject che mutano quel tipo di informazione, tralasciando gli altri; l’InjectorPerformer 176 Capitolo 3. S.T.R.E.S.S. quando andrà a modificare l’albero del modello richiederà a tutti gli Injector presenti di modificare i nodi interessati. Monitoring Aspetto fondamentale in tutte le procedure di testing funzionale è l’analisi del comportamento della IUT, per permettere il riconoscimento dell’esito del test case. Il problema dell’oracolo (presentato nel capitolo 3.1.1) è una delle problematiche principali quando si parla di black box testing, perché non avendo alcuna informazione aggiuntiva, salvo le specifiche di funzionamento, è estremamente difficoltoso capire quando si viene a manifestare un guasto che non sfocia in un fallimento del sistema. Per cercare quindi di agevolare l’analisi del comportamento della componente sotto test si è sviluppato il supporto per una serie di sensori che andranno a prelevare informazioni durante l’esecuzione dei vari test case. Abbiamo innanzitutto identificato le fasi di interesse durante i test case a cui vincolare eventuali segnali da inviare ai sensori per le rilevazioni: 1. all’inizio di ogni test case per la procedura di setup e l’inizio delle misurazioni; 2. al momento dell’invio di un pacchetto; 3. al momento della ricezione di un pacchetto; 4. alla fine di ogni test case per compiere una misurazione finale e disabilitare l’osservazione; 5. successivamente alla fine del test case per prelevare i dati raccolti. Deleghiamo la comunicazione con i vari sensori alla classe che gestisce l’evoluzione della test suite, l’oggetto TestCaseManager che, come si vede in figura 3.17, 3.2. Sviluppo piattaforma S.T.R.E.S.S. 177 Figura 3.16: Schema di funzionamento del monitor e scambio di messaggi con le componenti 178 Capitolo 3. S.T.R.E.S.S. ha nell’interfaccia i cinque metodi che si occupano di inviare i segnali durante le fasi identificate precedentemente, in ordine: 1. sendNotificationStartTestCase() 2. sendNotificationPacketSend() 3. sendNotificationPacketRead() 4. sendNotificationStopTestCase() 5. getReport() Figura 3.17: Diagramma delle classi del sistema di analisi del comportamento Viene quindi definita una classe astratta per la specifica dell’interfaccia degli oggetti che si occuperanno di gestire la registrazione dei dati di comportamento della IUT: la classe AbstractMonitor presenta sempre cinque metodi 3.2. Sviluppo piattaforma S.T.R.E.S.S. 179 distinti per le diverse segnalazioni da gestire, definendo però un algoritmo di default per i segnali di invio e ricezione dei pacchetti. Infatti per alcune misurazioni non è necessario avere l’informazione di quando i vari frame sono stati inviati o ricevuti, mentre obbligatoria è l’implementazione dei metodi per la gestione degli altri tre eventi. Quando viene segnalato alla classe TestCaseManager il manifestarsi di uno dei cinque passi interessati, l’oggetto rigirerà la segnalazione a tutte le classi di monitor attive. Attualmente sono stati implementati due tipi di sensori: • RTTMonitor: misura il round trip time fra un messaggio inviato e la sua successiva risposta; in caso di connessione diretta fra la IUT e il sistema di testing, e quindi stimando il tempo di trasmissione pressoché costante, ci permette di avere una misurazione del tempo di elaborazione dei dati inviati e quindi rilevare un eventuale carico anomalo. La caratteristica positiva di questo tipo di monitor è che essendo una misurazione lato framework non genera traffico aggiuntivo e quindi non rischia di falsare i risultati. • Monitor: questo sensore si connette ad un demone remoto per pilotare le misurazioni delle risorse di sistema sulla macchina in analisi (ove questo è possibile, cioè dove la black box è il software e non tutto il sistema); quindi la componente che misura effettivamente le statistiche di interesse si trova in remoto mentre la classe Monitor si occupa di inoltrare le segnalazioni degli eventi via rete e prelevare successivamente i risultati richiesti. Questo sistema ha lo svantaggio di interferire con la macchina oggetto dei test occupando risorse e generando traffico di rete aggiuntivo, per questo è stato scelto di non utilizzare la segnalazione dell’evento di pacchetto inviato ma soltanto quello di pacchetto ricevu- 180 Capitolo 3. S.T.R.E.S.S. to, riuscendo ugualmente ad isolare il periodo di elaborazione dati fra ricezione e risposta nella IUT. System Resources Monitor Per prelevare informazioni sul consumo di risorse da parte di un processo che vogliamo osservare, è stato sviluppato un demone in linguaggio Ruby funzionante su sistemi operativi GNU/Linux, in grado di poter prelevare dalla rete le segnalazioni provenienti dal framework. Viene configurato inserendo il nome dei processi da osservare, andando cosı̀ a leggere le informazioni di interesse direttamente dal file system proc fornito dal sistema operativo stesso (questa è la componente che rende questo software funzionante esclusivamente su macchine GNU/Linux). Quando il software viene avviato si mette in ascolto aspettando messaggi dalla piattaforma; il suo comportamento alla ricezione dei segnali è il seguente: 1. ricezione dell’evento di inizio test case: il software azzera i contatori e strutture di memoria e preleva le prime misurazioni; 2. ricezione dell’evento di pacchetto ricevuto: preleva nuovamente le informazioni dalla proc, ne calcola il delta rispetto alla misurazione precedente, memorizza il risultato nelle strutture dati e aggiorna i valori dell’ultime misurazioni fatte; 3. ricezione dell’evento di fine test case: esegue l’ultima misurazione inserendo le informazioni nelle strutture dati; 4. ricezione dell’evento di richiesta dati: preleva i dati dalle strutture, li converte in una stringa leggibile e li invia al framework. Il demone resta comunque in ascolto di nuove istruzioni dalla piattaforma e quindi viene riutilizzato successivamente per ogni test case che viene eseguito. Le informazioni che vengono prelevate sono: 3.2. Sviluppo piattaforma S.T.R.E.S.S. 181 • utilizzo CPU del processo; • utilizzo memoria del processo; • tempo di attesa per operazioni IO del sistema; • aggregazione con contenuto del file di syslog; Logging Risulta indispensabile avere un sistema che permetta di tenere traccia delle operazioni eseguite durante la procedura di testing: i messaggi inviati e le risposte ricevute, i dati prelevati dai sensori ed eventuali mancate risposte. Durante l’esecuzione di un test case, come abbiamo visto, viene utilizzato il metodo runTest() della classe Composite il quale ricorsivamente richiama se stesso nei nodi figli e cosı̀ via, andando ad esplorare tutto l’albero del modello in profondità e da sinistra verso destra; l’esecuzione dell’azione associata al nodo comporta il ritorno di un puntatore ad una classe State: è una classe astratta che viene implementata da diversi tipi di oggetti che vanno a rappresentare i risultati avuti dalle singole operazioni eseguite dai nodi dell’albero durante il test case. Successivamente alll’esecuzione dell’azione, in base all’esito viene istanziato un nuovo oggetto di un tipo derivato da State per indicare l’esito positivo o negativo della singola operazione ed eventuali dati da comunicare come risultato, permettendo cosı̀ di capire cosa è successo durante il testing. Anche State segue i dettami del pattern composite [14] cosı̀ da poter ricreare una struttura simile a quella del modello ABNF che li ha creati; infatti tutte le azioni associate ai vari nodi, quando eseguono i nodi figli ottengono una serie di oggetti State che vengono associati alla propria risposta, anch’essi come figli, riproducendo cosı̀ la stessa fisionomia della struttura sintattica 182 Capitolo 3. S.T.R.E.S.S. Figura 3.18: Diagramma delle classi delle risposte alle azioni dei test 3.2. Sviluppo piattaforma S.T.R.E.S.S. 183 del protocollo. Per esempio nel caso di una AdditionCommand avremo come risultato un oggetto ValueIntState contente il valore sommato e come figli di questo oggetto dei nodi analoghi contenente il valore degli addendi. Un ulteriore esempio si vede in figura 3.19 dove viene presentato l’albero degli State risultante dall’invio della login nel protocollo POP3. In figura viene presentato un attributo delle classi state, state value che indica se il valore contenuto nella classe è rappresentativo di: • FAULT: derivato dall’inserimento di una anomalia; • PACKET: la descrizione di un pacchetto inviato o ricevuto; • FAIL: si è generato un errore; • OK: l’oggetto riporta dati derivati dall’esecuzione di nodi ad una profondità maggiore dell’albero e non si è manifestato alcun errore; utile per capire a cosa si riferisce un determinato valore riportato. Le classi definite all’interno del framework sono: • State: classe astratta, definisce l’interfaccia; • OkState: nessun errore è presente nel sotto albero di cui lui è la radice; • FailState: si è manifestato un errore generico nell’esecuzione del test case; • ValueState: classe astratta, implementa alcuni metodi comuni agli oggetti contenenti i dati inviati o ricevuti; • ValueStringState: contiene informazioni da trattare in formato stringa; • ValueHexState: contiene informazioni da trattare come buffer di dati esadecimali; 184 Capitolo 3. S.T.R.E.S.S. • ValueIntState: contiene informazioni numeriche in base decimale; • ValueBinState: contiene informazioni numeriche in base binaria. Figura 3.19: Esempio di State risultanti dall’invio del pacchetto di login del POP3 Conseguentemente, ogni volta che viene avviato un albero abnf, si ottiene di ritorno un albero di oggetti State che descrivono l’esito del test case; inoltre nel caso che i monitor siano presenti e funzionanti, i report vengono esportati dalla classe TestCaseManager già incapsulati all’interno di classi State in modo da poter aggregare i dati all’albero ottenuto dal modello ABNF. Per permettere un’analisi successiva e più approfondita degli eventi per capire il responso del test, viene delegata ad una serie di classi AbstractOutput la scrittura di tali informazioni all’interno di file in vario formato o all’interno di un database. Definita l’interfaccia con la classe astratta AbstractOutput, sono stati implementati il supporto per la scrittura in file di testo semplice, di file XML e di un file DOT contenente il disegno dell’albero di State. 3.2. Sviluppo piattaforma S.T.R.E.S.S. 185 Figura 3.20: Diagramma delle classi della parte di scrittura dell’output Creazione automatica di un modello di traffico La creazione di un modello corretto di protocollo è un procedimento molto lungo se eseguito a mano senza alcun tipo di supporto, con i soli documenti di specifica. Per agevolare tale operazione è stato ideato un sistema per creare dei modelli semplificati di traffico del protocollo, partendo da sessioni reali di scambio di dati; una componente, che prendendo in input un file contenente traffico di rete “catturato“, restituisce come output un file con la rappresentazione ABNF di tali pacchetti. Questi file poi devono essere modificati per inserire anomalie o i comandi per pilotare la piattaforma, ma costituiscono un grosso aiuto per agevolare l’attività di modellazione degli standard da analizzare. Tale componente prende il nome di dissector poiché analizza il traffico estraendo le informazioni ivi contenute e, riconoscendo il protocollo, le suddivide per i vari campi che costituiscono i pacchetti. libwireshark Wireshark [48] è un analizzatore di pacchetti di rete, ovvero un software in grado di prelevare i pacchetti che passano su una rete e di visualizzarne il contenuto. Uno strumento estremamente utile per risolvere problemi di networking, analizzarne la sicurezza, eseguire un debug di implementazione dei protocolli di rete ed analizzarne il funzionamento interno. E’ stato sviluppato in C ed è costituito da una GUI, alcune utility e una libre- 186 Capitolo 3. S.T.R.E.S.S. Figura 3.21: Schema generale del funzionamento del dissector ria che permette l’utilizzo di alcune funzionalità a programmi esterni. Fra queste funzionalità vi sono una serie di decodificatori, i dissector appunto, che eseguono l’analisi dei pacchetti di numerosi protocolli, cercano di identificare il tipo e ne estraggono le informazioni contenute. Il funzionamento è analogo a quello previsto dal normale flusso di dati nei socket di sistema: i pacchetti che vengono prelevati sono passati al dissector competente del livello più basso, il Frame dissector, che preleva le informazioni dall’header e passa i dati al dissector delegato al livello successivo della pila ISO/OSI; l’Ethernet frame dissector legge le informazioni dall’header ethernet e passa il payload all’IP dissector e cosı̀ via, ad ogni passaggio vengono ricavati dettagli specifici relativi ai vari protocolli usati nei differenti layer dalle pila ISO/OSI. S.T.R.E.S.S. Dissector Sfruttando quindi le capacità fornite dalle librerie di wireshark è stato sviluppato un software in grado di ricavare da un traffico di frame catturati, una definizione formale in ABNF. Per poter utilizzare tali librerie scritte in C, è stato necessario sviluppare un’interfaccia ad oggetti, e successivamente tutta la componente di trasformazione delle 3.2. Sviluppo piattaforma S.T.R.E.S.S. 187 strutture ritornare dai dissector in regole di derivazione del metalinguaggio. Le classi che compongono questo tool sono: • Dissector: rappresenta la classe principale e fornisce l’interfaccia alle sue funzionalità; • CaptureFile: implementa i metodi per leggere le informazioni dal file contenente il traffico di rete catturato; • CaptureModel: crea il modello del pacchetto a partire dai dati ritornati dai dissector, memorizza le istanze della classe Packet; • Packet: associato ad un pacchetto contenuto nel file pcap si occupa di creare la struttura per la memorizzazione dei dati contenuti nel frame; • Tree: ogni pacchetto viene associato ad un albero che contiene fisicamente le informazioni prelevate dal file pcap; • Node: rappresenta il nodo dell’albero e contiene una frazione del messaggio che è stato decodificato dal dissector, può quindi contenere anche informazioni relative al layer superiore, che verranno rappresentate come i nodi figli; • Filter e ProtocolFilter: implementano un filtro per estrarre solo alcuni layer di interesse, scartando cosı̀ tutte le informazioni ai livelli più bassi. Una volta eseguita l’estrazione dei dati e la creazione della struttura dati, viene chiamato ricorsivamente il metodo printTree() su tutti gli elementi dell’albero che va fisicamente a creare le varie regole sintattiche in ABNF. 188 Capitolo 3. S.T.R.E.S.S. Figura 3.22: Diagramma delle classi del Dissector 3.3 Utilizzo della piattaforma Successivamente alla creazione del modello di protocollo ed alla assegnazione delle varie azioni ai suoi nodi, il framework è pronto per eseguire i test case sulla IUT selezionata, la procedura di test viene avviata richiamando il metodo Composite::runTest() fornito dal nodo radice dell’albero ABNF che invoca iterativamente quello dei figli e cosı̀ via, permettendo cosı̀ l’esplorazione dell’albero. Quindi durante questo procedimento, man mano che si passa da un nodo all’altro del modello, viene eseguito anche l’algoritmo incapsulato dentro allo strategy che va a creare la sequenza di messaggi validi per il protocollo rappresentato; infine l’esplorazione dell’albero genera un test case con il rispettivo file 3.3. Utilizzo della piattaforma Figura 3.23: Diagramma di sequenza del Dissector 189 190 Capitolo 3. S.T.R.E.S.S. di output dove vengono registrate le azioni e le misurazioni effettuate. In assenza di anomalie, la procedura di testing produrrà il traffico valido descritto dal modello, concludendo successivamente la procedura. In caso in cui vi siano delle anomalie, l’approccio prevede che vengano eseguiti tanti test case quante sono le possibili combinazioni di anomalie e di valori delle stesse: infatti per eseguire correttamente la procedura di stress test e robustness test tramite fault injection, si deve andare a generare un grande volume di traffico, valutando il comportamento della IUT sottoposta ad ogni possibile combinazione di guasti inseriti nel traffico protocollare. La generazione dei vari test case a partire dal modello ABNF viene effettuata nel seguente modo: 1. ogni punto di inserimento di un’anomalia viene identificato con un id univoco (costituito da un intero a 64 bit con tutti i bit settati a zero tranne uno)1 ; 2. viene associato all’id dell’anomalia il numero dei nodi figli, cioè il numero dei valori anomali da poter inserire; 3. ogni test group è identificato da un id (intero a 64 bit) e da un numero di ripetizioni, l’identificativo indica quali anomalie sono attivate e il numero delle ripetizioni da eseguire viene generato dal prodotto dei possibili valori delle anomalie attive; 4. per ogni id viene invocato il metodo runTest() un numero pari alle ripetizioni; 5. alla fine di ogni test case viene prodotto l’albero di oggetti State che viene passato alle classi Output per la registrazione dei log. 1 Questo limita il numero dei punti di inserimento a 64 all’interno di una test suite; è comunque un limite accettabile visto l’elevato numero di test case prodotti 3.3. Utilizzo della piattaforma 191 Possiamo identificare come una test suite l’intero numero dei test case generati rappresentata dal modello ABNF e costituita da vari test group costituiti da un id a 64 bit che indica quali anomalie sono attivate e quindi quali aspetti del protocollo verranno analizzati. Ogni test group è costituito da vari test case generati dalla combinazione dei vari valori di anomalie inserite nel modello ABNF per i punti di inserimento attivati. Per capire quali anomalie vengono attivate per un determinato test group, utilizziamo l’identificativo a 64 bit associato al gruppo. Infatti abbiamo visto che ogni punto di inserimento di un guasto è associato ad un id univoco, anche questo a 64 bit, caratterizzato da un unico bit settato ad 1: se l’operazione di and bit a bit fra id anomalia e id del test group genera un risultato diverso da 0 allora l’anomalia è attivata per quel gruppo. Ad esempio se in un modello abbiamo due punti di inserimento di guasti, questi verranno identificati da i seguenti id (in questo esempio abbiamo usato una rappresentazion ad 8 bit): 1. 00000001 2. 00000010 ogni anomalia ha tre possibili valori, uno valido e gli altri due rappresentano due guasti. • il primo test group generato avrà un id uguale a 0, quindi nessuna anomalia attivata: il modello verrà percorso soltanto una volta generando un traffico coerente con il protocollo che valida la correttezza del modello stesso. • Il secondo test group generato è identificato dall’id 1, eseguiamo l’operazione di and bit a bit fra 1 e l’id della prima anomalia che ritornerà un valore pari ad 1 e quindi un numero diverso da zero attivando l’anomalia; eseguendo la stessa operazione sull’id della seconda anomalia il 192 Capitolo 3. S.T.R.E.S.S. risultato sarà 0 e quindi non verrà utilizzata. A questo punto il modello verrà percorso un numero di volte pari al valore delle anomalie associate al primo punto di inserimento, in questo caso 2. • il terzo test group avrà come id il numero 2, eseguendo l’operazione di bit a bit con i due id di anomalie vedremo che la prima è disattivata mentre la seconda risulterà attiva; quindi verranno generati due test case dalle due possibili anomalie inserite nel secondo punto. • il quarto test group verrà identificato dall’id 3, vediamo che l’operazione di and bit a bit con gli id delle anomalie ritornerà per la prima 1 e per la seconda 2, quindi entrambe saranno attive; in questo caso il modello verrà percorso 4 volte, per introdurre qualsiasi combinazione di valori anomali possibili. Durante la procedura di testing, mano a mano che i vari test case vengono eseguiti, si deve tenere traccia di quali anomalie sono attive e quali valori sono stati utilizzati per creare i test case successivi e alla fine procedere con la creazione dei test group mancanti. Per far questo è necessario utilizzare un sistema centralizzato per registrare le anomalie presenti nel modello e mantenere ed aggiornare lo stato di quelle attive: abbiamo implementato secondo il pattern Singleton l’oggetto TestCaseManager (figura 3.24) in modo da usufruire della stessa istanza dell’oggetto in più punti del codice distinti. Abbiamo delegato all’oggetto la gestione degli id a 64 bit ed il calcolo di quanti test group devono essere generati e soprattutto di quanti test case genererà un determinato test group. Nel modello ABNF l’inserimento delle anomalie viene gestito dall’azione InjectAction che, però, non possiede informazioni generali sul test case in esecuzione o su quante altre anomalie sono presenti nel modello, quindi per coordinare le varie azioni si è fatto in 3.3. Utilizzo della piattaforma 193 modo che ogni InjectAction quando viene inserita nel modello vada a registrare nel TestCaseManager per segnalare la propria presenza, andando poi a prelevare il proprio id numerico; all’interno del TestCaseManager si tiene traccia delle varie azioni e di quanti valori anomali sono fornite, in modo da pilotare la creazione dei vari test group e garantendo un corretto e completo svolgimento della procedura di testing. Figura 3.24: Diagramma delle classi della componente di gestione dei test case 3.3.1 CLI: command line interface Per utilizzare il framework ed avviare la procedura di testing, allo stato attuale dei lavori, viene fornito un eseguibile invocabile da linea di comando che richiede come input un file di testo contenente la descrizione ABNF del protocollo, l’IP della IUT e la porta del servizio che implementa lo standard; se ovviamente si deve analizzare un’implementazione a basso livello in tal 194 Capitolo 3. S.T.R.E.S.S. caso la porta non è necessaria e l’indirizzo IP viene utilizzato esclusivamente per il collegamento ai monitor per l’analisi del comportamento (se abilitati). stress -a FILENAME -d DESTINATION_ADDRESS -p PORT -------------------------------------------------------------- --abnf=FILENAME -a FILENAME --destination IP -d IP --source IP -s IP --port PORT -p PORT --timeout N -t N Insert ABNF model file Insert Destination IP Address Insert Source IP Address Insert Port Number Wait n msec for reading packets --iface IFACE -i IFACE Network interface used for RAW socket --help -h Display this help --output FILENAME -o FILENAME --type Insert output root filename -O OUTPUT-TYPE xml, dot [default: xml] --monitor -M Activate observing modules --delay n -D n Delay n (msec) befare AND after a test case --inject -j MODE Activate anomalies auto-injection. 3.4. Risultati 195 Il file ABNF deve essere creato in modo che la prima riga abbia come simbolo la radice dell’albero, cosı̀ che il software possa andare a costruire a partire dal questo simbolo tutta la struttura del modello. Le altre possibili opzioni di configurazione prevedono: • l’abilitazione dell’auto injector, che può essere utilizzata con modelli ABNF contenenti la sola descrizione del protocollo senza alcun guasto; • l’attivazione della componente di analisi del comportamento tramite sensori esterni; • la configurazione di alcuni ritardi da inserire prima e dopo l’avvio dei test case, utili per permettere il corretto allineamento dei monitor in presenza di ritardi sulla rete; • la configurazione del percorso di scrittura dei file di output e la selezione del formato degli stessi. 3.4 Risultati In questo capitolo vengono presentati i vari test suites e i risultati che abbiamo prodotto, creati ed eseguiti utilizzando la piattaforma sviluppata. Gli scopi principali dei test eseguiti sono: 1. Ricostruire il comportamento di sistemi chiusi, di cui non si conosce il codice sorgente per poterne espandere la compatibilità (nel caso di apparati di rete non si conosce il software di gestione memorizzato nelle memorie flash). 2. Verificare che gli standard di funzionamento siano rispettati e correttamente implementati. 196 Capitolo 3. S.T.R.E.S.S. 3. Recuperare informazioni sulla sicurezza delle implementazioni di applicativi e apparati di rete. Abbiamo quindi selezionato protocolli differenti per poter valutare l’effettiva generalità della nostra piattaforma, i cinque standard scelti sono uno basato su TCP, due basati su UDP e due a basso livello: • IEEE-802.11b/g • IEEE-802.11i • XMPP • SIP • DNS Per quanto riguarda la parte a basso livello, quindi gli standard di comunicazione e autenticazione in reti wireless l’approccio è stato utilizzato per analizzare le fasi di: • Autenticazione IEEE 802.11. • 4 Way Handshake del WPA PSK di IEEE 802.11i. • La prima parte dell’autenticazione EAP-TLS e la resistenza di freeRADIUS a stringhe anomale. Il processo di testing ha portato alla luce varie incongruenze nel controllo di alcune parti dei pacchetti, soprattutto gli indirizzi sorgente e destinazione, errata gestione dei campi di lunghezza e interpretazione di dati fuori standard [49]. Inoltre, fra i sistemi analizzati, era presente anche il software Hostapd [50], che implementa funzionalità avanzate di Access Point ed Authenticator. In questo sistema è stata riscontrata una grave problematica di robustezza 3.4. Risultati 197 che ha portato alla chiusura improvvisa del servizio per segmentation fault, portando cosı̀ alla luce una vulnerabilità presente nella versione del software presa in esame [51]. 3.4.1 SIP Il protocollo SIP è uno dei principali standard utilizzati per le comunicazioni voice over IP, si tratta di un protocollo di segnalazione per la gestione delle chiamate [52]; ci siamo soffermati sull’analisi dell’implementazione di questo standard fornita da differenti pacchetti software, nel dettaglio i sistemi analizzati sono: • Debian Etch con pacchetto Asterisk PBX fornito dalla distribuzione; • AsteriskNow Beta 6 distribuzione fornita dalla stessa Digium, software house produttrice di Asterisk; • Debian Etch con pacchetto Yate PBX versione 1.2.0. Le procedure del protocollo analizzate sono state l’interrogazione e la registrazione. In fase di interrogazione il software asterisk si è dimostrato mancante di molti controlli sulla correttezza dei messaggi inviati, rispondendo in maniera errata o con codici di errore inesatti o addirittura restituendo l’acknowledge come se il messaggio fosse stato correttamente interpretato. In fase di registrazione la versione di asterisk fornita dalla distribuzione Debian presenta un errore nella gestione di una richiesta con alcuni campi mancanti che causa il fallimento del sistema per NULL ponter dereference e quindi segmentation fault. Inoltre mancano i controlli sulla validità dei restanti campi dei messaggi violando in più punti il protocollo o permettendo 198 Capitolo 3. S.T.R.E.S.S. operazioni teoricamente impossibili (per esempio la registrazioni di client con indirizzi non validi come quello di broadcast). Abbiamo potuto valutare una migliore gestione delle risposte ai messaggi anomali nel sistema AsteriskNow dove la versione del PBX è più recente mentre nella versione fornita in Debian Etch è stato individuata una problematica nella gestione dei guasti che causava il fallimento del sistema. Inoltre, grazie alle caratteristiche di riusabilità delle test suite, è stato possibile eseguire un confronto fra il comportamento del sistema Asterisk e il software Yate, identificando nell’ultimo una maggiore attenzione agli standard al fronte di minore controlli sulla validità sintattica del contenuto dei messaggi. 3.4.2 DNS Il Domanin Name System (DNS) è il sistema di risoluzione dei nomi di dominio utilizzato su internet ed è un protocollo di tipo request-response [53]. Per l’attività di testing abbiamo scelto due implementazioni: • BIND [54]: è uno dei programmi più utilizzati fra tutti i server DNS, è open source e viene distribuito di default sulla maggior parte dei sistemi UNIX e distribuzioni GNU/Linux. La versione presa in esame è la 9.6.1-P2 per GNU/Linux. • PowerDNS [55]: server DNS scritto in C++ distribuito con licenza GPL; è un server che si appoggia a diversi backend, sia file in stile BIND che database veri e propri. La versione presa in esame è la 2.9.22 per GNU/Linux con database MySQL come backend. Non sono state rilevate problematiche di sicurezza, i due demoni si sono rivelati robusti, come prevedibile visto la maturità dei progetti e del protocollo; nonostante questo l’attività di testing ci ha permesso di evidenziare 3.4. Risultati 199 un diverso comportamento delle due IUT: il software BIND risponde secondo standard ai messaggi non corretti, segnalando la presenza degli errori ed indicando le motivazioni del rifiuto, invece PowerDNS solitamente non invia alcuna risposta tranne che in tre casi: 1. Anomalia nel campo QNAME con valore %x00000000000000000; 2. Anomalia nel campo di lunghezza con valore nullo in presenza di una label non vuota; 3. Anomalia generata inserendo una stringa successivamente al campo QNAME; in questi casi PowerDNS risponde con un messaggio senza segnalazione di errori e con il campo Answer vuoto. Nello standard non viene specificato se un server, in presenza di errori nelle richieste, debba o meno rispondere, quindi possiamo dire che il differente modo di comportarsi è, in entrambi i casi, attinente al protocollo; invece nelle tre precedenti eccezioni del software PowerDNS vi è una chiara violazione dello standard poiché le risposte non segnalano, come previsto, la presenza di guasti nei messaggi ricevuti. 3.4.3 XMPP Protocollo creato per sistemi di messaggistica istantanea basato su XML per la formattazione dei messaggi [56]. Per l’attività di testing abbiamo scelto due implementazioni del protocollo: • ejabber [57]: scritto in Erlang, distribuito sotto licenza GPL, è uno dei server più popolari usati anche nei servizi di chat di Facebook e Nokia Ovi; la versione analizzata è la 2.1.2. 200 Capitolo 3. S.T.R.E.S.S. • Openfire [58]: scritto in Java, distribuito sotto GPL, la versione presa in esame è la 3.6.4. Ci siamo soffermati ad analizzare prevalentemente la fase di autenticazione prevista dallo standard, che coinvolge alcune primitive come l’hash MD5 e la codifica e decodifica base64. L’implementazione dello standard di openfire risulta non essere conforme ai requisiti di sicurezza previsti dalla specifica, infatti non vengono rifiutati i messaggi contenenti caratteri non validi per la codifica base64 e l’analisi del comportamento ci permette di capire che lo stato della FSM del software è errato: infatti durante un autenticazione in chiaro il server risponde con una challenge non prevista per questo tipo di autenticazione. Anche ejabber non si dimostra attinente alle specifiche perché ignora semplicemente l’errore senza andare a rifiutare esplicitamente l’autenticazione come previsto dal RFC. Infine abbiamo rivelato comportamenti anomali nel software openfire durante la sua esecuzione: vengono infatti sollevate alcune eccezioni non gestite che solo il meccanismo di recupero tipico di Java permette al server di non produrre un fallimento. Però la loro comparsa sono sintomi di errori nel codice che non gestisce in modo corretto eventi particolari (sono quindi guasti prodotti da errori), in un caso particolare il software chiude, in seguito ad un messaggio anomalo, lo stream XML non andando però a chiudere la connessione causando, alla ricezione del successivo pacchetto, un accesso a risorse non più disponibili. 3.5. Sviluppi Futuri 3.5 201 Sviluppi Futuri Il progetto oggetto di questo lavoro di tesi è attualmente in fase di sviluppo con l’obbiettivo di agevolare il processo di testing e permetterne l’utilizzo con la maggior generalità possibile: innanzitutto è stato identificato come aspetto da approfondire l’interfaccia utente con cui utilizzare la piattaforma, che verrà ampliata con una GUI attualmente in fase di beta testing, sviluppata utilizzando il framework per applicazioni web Ruby on Rails, fornirà una soluzione per agevolare la creazione dei modelli ABNF, il loro storage per usi futuri e la raccolta dei log delle test suite per permettere una più approfondita analisi dei risultati successivamente all’effettiva esecuzione dei test. Inoltre verranno introdotte ulteriori primitive, alcune già implementate ed utilizzate [49] ma da aggiornare e da mettere in produzione, altre da aggiungere completamente per permettere una assoluta generalità dei protocolli che possono essere utilizzati con la piattaforma S.T.R.E.S.S. come ad esempio la funzione hash SHA1 o una primitiva di checksum crittografico (MAC ). Infine l’aspetto più importante ed innovativo attualmente in fase di ideazione consiste in un sistema automatico per la funzionalità di oracolo che permetta una valutazione dei singoli test case in modo da agevolare l’attività dell’utente. Il sistema di oracolo prende in input il risultato di un test case, quindi i messaggi inviati e ricevuti, le anomalie inserite e i valori rilevati dai monitor delle IUT; come output ritorna la probabilità che tale test case possa aver evidenziato un comportamento anomalo nel sistema in analisi. Sono state identificati due approcci distinti: • viene considerato tutto lo scambio dei pacchetti e quindi una valutazione unica per ogni test case; 202 Capitolo 3. S.T.R.E.S.S. • per ogni log vengono estratte le informazioni associate al singolo scambio di pacchetti, ogni test case verrà quindi valutato più volte per ciascuna trasmissione indipendentemente dagli esiti precedenti (per esempio nel caso dello scambio di frame nel modello POP3, il test case avrà cinque valutazioni in base al comportamento della IUT alla ricezione e risposta del primo pacchetto di login, al secondo pacchetto di invio password, e cosı̀ via). Per ciascuno di questi approcci è stato valutato un sistema di classificazione automatica distinto: nel primo caso, deve essere valutato il comportamento nel caso di una sequenza di eventi, dove ogni singolo evento è rappresentato dalle misurazioni dei monitor e dalla presenza di eventuali anomalie, è stato quindi scelto un approccio basato sul Hidden Markov Model [59]. Si tratta di una catena di Markov dove gli stati non sono osservabili direttamente ma soltanto l’evento generato: questo tipo di modello permette, data una sequenza, di trovare lo stato più probabile per cui si possa avere tale serie di eventi in uscita. Un tipo di approccio che prevede una fase preliminare di addestramento dei coefficienti della catena di Markov mediante un training set di log di test case ed una successiva analisi dei risultati delle singole run. Questo approccio presuppone di individuare un’anomalia nella sequenza di passi della macchina a stati interna che potrebbe essere deviata dal suo funzionamento corretto a causa delle anomalie inserite. Nel secondo approccio sono da analizzare i singoli eventi raggruppati per successione temporale, cioè il primo scambio di pacchetti verrà valutato e confrontato con le misurazioni di tutti gli altri pacchetti scambiati inizialmente e cosı̀ via. Vista la granularità degli eventi, è stata selezionato un approccio di classificazione basato su Support Vector Machines [60]: classificatori binari in grado di gestire in modo efficiente osservazioni caratterizzate 3.5. Sviluppi Futuri 203 da un alto numero di misurazioni e modelli estremamente complessi tramite superfici decisionali non lineari. In questo caso invece, si semplifica l’analisi immaginando che un’anomalia influenzi in modo riconoscibile non solo la sequenza, ma anche il risultato dell’elaborazione di un singolo pacchetto ricevuto dalla IUT. 204 Capitolo 3. S.T.R.E.S.S. Conclusioni Durante la prima parte del dottorato, l’attività è stata svolta all’interno del laboratorio di Comunicazioni Avanzate congiunto fra l’Università di Firenze e Selex-Comms ed ha portato alla creazione di un metodo di auto configurazione di una rete multi hop costituita da router wireless multi interfaccia. La procedura per il deployment facilitato della rete permette di ridurre le interferenze elettromagnetiche andando ad utilizzare i canali di comunicazioni più liberi e adottando collegamenti singoli fra due nodi per ridurre al minimo problemi di collisione e massimizzare il throughput. Le simulazioni hanno validato il nostro approccio, evidenziando che soltanto in casi estremi non pertinenti all’uso reale, con un numero di nodi molto alto e con una dislocazione casuale si ha un fallimento nella creazione della rete. Successivamente è stato sviluppato un prototipo di software per implementare tale metodologia e la macchina a stati per gestire le ricostruzioni della rete in caso di fallimento di alcune connessioni. Il programma è stato integrato con il sistema operativo linux embedded dei router wireless ed è stato installato su di una rete di 6 router. Si è quindi potuto eseguire un vero e proprio collaudo del sistema che ha dimostrato la validità del prototipo: la rete veniva configurata completamente e diveniva operativa in un tempo massimo di 10 minuti, circa 2 minuti per nodo escluso il gateway. I prototipi erano dotati di batteria, circuiti di alimentazione ed antenne in grado 205 206 Conclusioni di essere trasportati facilmente tramite valigie. Andando quindi a simulare una situazione di emergenza si è stati in grado di installare una backbone di comunicazione operativa in pochi minuti. Questa prima parte del lavoro ha portato, oltre alla creazione di un prototipo funzionante, alla pubblicazione di un brevetto. La seconda parte della collaborazione ha visto l’integrazione del sistema di comunicazione Tetra-DMO con la backbone wireless multi hop; il lavoro ha visto una prima parte di studio per la creazione del nodo mobile, la macchina a stati ed il protocollo di comunicazione TWNET, inoltre è stato necessario estendere lo standard di comunicazione PEI dei terminali Tetra. Successivamente sono state implementate le necessarie modifiche al firmware ed al software dei terminali utilizzati nel nodo mobile e soprattutto è stato sviluppato il software pe2ne, che implementava la macchina a stati che permetteva la comunicazione dei vari MN sulla backbone multi hop tramite il protocollo da noi ideato. Infine il software è stato integrato nella toolchain del sistema operativo linux dei router wireless (OpenWRT) ed è stato creato un prototipo della rete che ci ha permesso di testare il nostro lavoro, sia di design del sistema che dell’implementazione. Il progetto TWNET ha, inoltre, portato alla stesura di 4 brevetti [16] [17] [18] [19] che attualmente risultano ancora o in fase di scrittura o in valutazione, comunque non sono ancora stati pubblicati ed è il motivo per cui non sono stati affrontati in maniera dettagliata certi aspetti del lavoro. Il secondo filone di ricerca su cui si è incentrato il lavoro ha portato alla creazione di una metodologia di testing funzionale per la robustezza del software che potesse essere applicata alla totalità degli standard che attualmente vengono utilizzati per le comunicazioni di rete. Inoltre è stato prodotto un framework per l’attuazione di tale approccio nel processo di testing in grado sia di automatizzare la creazione dei test case e l’inserimento di anomalie, sia 207 di eseguire un’analisi del comportamento delle implementazioni analizzate. Si è da prima analizzato lo stato dell’arte delle varie tecnologie di testing funzionale, con particolare attenzione al testing di sicurezza e quindi alle diverse tecniche mirate a rilevare le vulnerabilità, ovvero gli errori che possano essere sfruttati da un attaccante per la compromissione di un sistema. Sono stati individuati come approcci più utili per il testing di robustezza il fuzzing ed il syntax testing eseguito tramite fault injection: l’idea di base è quella di inviare come input dei dati non corretti per valutare il comportamento della componente software in reazione a questi eventi non previsti e valutare se possono essere presenti errori nel codice. Per poter trasmettere informazioni secondo un determinato protocollo è necessario definirne il linguaggio in modo da permettere alla piattaforma di inviare pacchetti che possano essere accettati dal software. Per descrivere gli standard è stato scelto il metalinguaggio ABNF, definito dalla IETF proprio per la descrizione dei protocolli di rete. Successivamente è stato sviluppato il framework in modo da poter applicare la metodologia precedentemente identificata ed in grado di interpretare le regole sintattiche descritte all’interno di una definizione ABNF per poter riprodurre correttamente pacchetti di un certo protocollo. Si è fatta particolare attenzione alla modularità della piattaforma per garantire una facile espandibilità al fine di aggiungere nuove primitive da utilizzare nella creazione dei dati da inviare o delle informazioni da interpretare. Inoltre è stata creata una componente che permettesse, data una definizione ABNF, l’introduzione automatica di anomalie secondo alcune euristiche di attacco, e quindi permettere una facile aggiunta di ulteriori metodi di inserimento automatico di guasti. Infine si è prodotta una parte del framework specifica per l’analisi del comportamento delle IUT, in modo da poter agevolare l’attività di oracolo per l’identificazione di quali test case risultino passati o falliti o 208 Conclusioni inconcludenti. Successivamente la piattaforma è stata utilizzata per l’analisi di implementazioni dei protocolli IEEE 802.11b/g/i, DNS, SIP e XMPP, per valutarne la robustezza e la loro conformità alle specifiche. I processi di testing sono stati in grado di rilevare che alcune IUT considerate non risultavano conformi al protocollo di riferimento ed inoltre si sono rivelate carenti per quanto riguarda la validazione degli input presentando problematiche che possono venir sfruttate per attacchi. I risultati di questi test hanno inoltre validato la metodologia e l’efficacia della piattaforma S.T.R.E.S.S. prodotti dall’attività di ricerca svolta durante questo dottorato. Inoltre sono stati individuati alcune caratteristiche da approfondire e da sviluppare al fine di aumentare la generalità del framework ed il livello di automazione della procedura di test, questi aspetti sono stati presentati precedentemente nel capitolo 3.5. Appendices 209 Definizione di ABNF in ABNF rulelist = 1*( rule / (*c-wsp c-nl) ) rule = rulename defined-as elements c-nl ; continues if next line starts ; with white space rulename = ALPHA *(ALPHA / DIGIT / "-") defined-as = *c-wsp ("=" / "=/") *c-wsp ; basic rules definition and ; incremental alternatives elements = alternation *c-wsp c-wsp = WSP / (c-nl WSP) c-nl = comment / CRLF ; comment or newline comment = ";" *(WSP / VCHAR) CRLF alternation = concatenation *(*c-wsp "/" *c-wsp concatenation) concatenation = repetition *(1*c-wsp repetition) repetition = [repeat] element repeat = 1*DIGIT / (*DIGIT "*" *DIGIT) element = rulename / group / option / char-val / num-val / prose-val 211 212 Definizione di ABNF in ABNF group = "(" *c-wsp alternation *c-wsp ")" option = "[" *c-wsp alternation *c-wsp "]" char-val = DQUOTE *(%x20-21 / %x23-7E) DQUOTE ; quoted string of SP and VCHAR ; without DQUOTE num-val = "%" (bin-val / dec-val / hex-val) bin-val = "b" 1*BIT [ 1*("." 1*BIT) / ("-" 1*BIT) ] ; series of concatenated bit values ; dec-val = or single ONEOF range "d" 1*DIGIT [ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ] hex-val = "x" 1*HEXDIG [ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ] prose-val = "<" *(%x20-3D / %x3F-7E) ">" ; bracketed string of SP and VCHAR ; without angles ; prose description, to be used as ; last resort ALPHA = %x41-5A / %x61-7A BIT = "0" / "1" CHAR = %x01-7F ; A-Z / a-z ; any 7-bit US-ASCII character, ; CR = excluding NUL %x0D ; carriage return CRLF = CR LF 213 ; Internet standard newline CTL = %x00-1F / %x7F ; controls DIGIT = %x30-39 ; 0-9 DQUOTE = %x22 ; " (Double Quote) HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" HTAB = %x09 ; horizontal tab LF = %x0A ; linefeed LWSP = *(WSP / CRLF WSP) ; Use of this linear-white-space rule ; permits lines containing only white ; space that are no longer legal in ; mail headers and have caused ; interoperability problems in other ; contexts. ; Do not use when defining mail OCTET = ; headers and use with caution in ; other contexts. %x00-FF ; 8 bits of data SP = %x20 VCHAR = %x21-7E ; visible (printing) characters 214 WSP Definizione di ABNF in ABNF = SP / HTAB ; white space Bibliografia [1] Openwrt: a linux distribution for embedded devices. [Online]. Available: http://openwrt.org [2] S. Leffler. Madwifi, multiband atheros driver for wifi. [Online]. Available: http://madwifi.org [3] A. Raniwala, K. Gopalan, and T. Chiueh, “Centralized channel assignment and routing algorithms for multi-channel wireless mesh networks. ACM SIGMOBILE Mobile Comput,” Commun. Rev, vol. 8, pp. 50–65, 2004. [4] R. Draves, J. Padhye, and B. Zill, “Routing in multi-radio, multi-hop wireless mesh networks,” in Proceedings of the 10th annual international conference on Mobile computing and networking. ACM, 2004, pp. 114– 128. [5] H. Wu, F. Yang, K. Tan, J. Chen, Q. Zhang, and Z. Zhang, “Distributed channel assignment and routing in multiradio multichannel multihop wireless networks,” IEEE journal on selected areas in communications, vol. 24, no. 11, 2006. [6] Institute of Electrical and Electronic Engineers, Inc., IEEE Standard for Information technology – Telecommunications and information ex215 216 BIBLIOGRAFIA change between systems – Local and metropolitan area networks-Specific requirements – Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications, IEEE Std., 2007. [7] ETSI, METTERE LO STANDARD TETRA, ETSI Std., 200X. [8] ——, Terrestrial Trunked Radio (TETRA); Direct Mode Operation (DMO), ETSI Std. EN 300 396, ETSI Std., 2006. [9] “Modified ad-hoc on-demand distance-vector routing protocol,” Italy EPO Patent Request PCT/IT/2008/000359 000 359, 2008. [10] ETSI, Terrestrial Trunked Radio (TETRA); Voice plus Data (V+D); Part 5: Mobile station to mobile station (MS-MS) air interface (AI) protocol, European Standard EN 300 392-5 Std., 2006. [11] C. Ltd. Ubuntu. [Online]. Available: http://www.ubuntu.com [12] ETSI TS 100 392-3-8, Terrestrial Trunked Radio (TETRA); Voice plus Data (V+D); Part 3: Interworking at the Inter-System Interface (ISI); Sub-part 8: Generic Speech Format Implementation, ETSI Std. [13] L. Zhang, L. Zheng, and K. Soo Ngee, “Effect of delay and delay jitter on voice/video over ip,” Computer Communications, vol. 25(9), pp. 863– 873, 2002. [14] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design Patterns, P. E. Italia, Ed. Addison-Wesley, 1995. [15] L. Adamo, R. Fantacci, M. Rosi, D. Tarchi, and F. Frosali, “Analysis and design of a tetra-dmo and ieee 802.11 integrated network,” in Proceedings of the 6th International Wireless Communications BIBLIOGRAFIA and Mobile Computing Conference, ser. IWCMC ’10. 217 New York, NY, USA: ACM, 2010, pp. 774–778. [Online]. Available: http: //doi.acm.org/10.1145/1815396.1815574 [16] “Nodo twnet,” Europe Patent Request -, 2011. [17] “Trasmissione su seriale del traffico tetra dmo,” Europe Patent Request -, 2011. [18] “Estensione delle funzionalità changeover e preemption tipiche dello standard dmo allo scenario multi isola twnet,” Europe Patent Request -, 2011. [19] “Soluzione di sicurezza per la negoziazione di chiavi crittografiche per applicazioni tetra dmo su reti etorgenee,” Europe Patent Request -, 2011. [20] B. Beizer, Software Testing Techniques. Second Edition. Van Nostrand Reinhold., 1990. [21] C. C. Michael, Black box security testing tools. Tech. Rep., 2005. [22] Institute of Electrical and Electronic Engineers, Inc., standard glossary of software engineering terminology, IEEE Std., 1990. [23] I. Sommerville, Software Engineering. Addison-Wesley, 2007. [24] ISO/IEC, Conformance testing methodology and framework, International Organization for Standardization, Geneva, Switzerland., Tech. Rep., International Standard IS-9646 Std., 1991. [25] ITU, OSI Conformance Testing Methodology and Framework for Protocol Recommendations for ITU-T Applications - General Concepts, 218 BIBLIOGRAFIA INTERNATIONAL TELECOMMUNICATION UNION, Tech. Rep., ITU-T Recomendation X.290 Std., 1995. [26] J. Tretmans, “An overview of osi conformance testing,” University of Twente, Tech. Rep., 2001. [Online]. Available: http://www.cs.aau.dk/ ∼kgl/TOV03/iso9646.pdf [27] ETSI, Methods for Testing and Specifcation (MTS); Protocol and profle conformance testing specifcations; Standardization methodology, European Telecommunications Standards Institute, Tech. Rep., ETS 300 406 Std., 1995. [28] B. Schneier, “Software complexity and security,” Crypto-Gram Newsletter, 2000. [29] R. Kaksonen, “A functional method for assessing protocol implementation security,” Technical Research Centre of Finland, VTT Publications 447. 128 p., Tech. Rep., 2001. [Online]. Available: http://www.vtt.fi/inf/pdf/publications/2001/P448.pdf [30] B. P. Miller, L. Fredriksen, and B. So, “An empirical study of the reliability of unix utilities,” In Proceedings of the Workshop of Parallel and Distributed Debugging, pp. ix–xxi, 1990. [31] R. Kaksonen, M. Laakso, and A. Takanen, “Vulnerability analysis of software through syntax testing,” Tech. Rep., 2000. [Online]. Available: https://www.ee.oulu.fi/research/ouspg/PROTOSWP2000-robustness [32] G. Ausiello, F. d’Amore, and G. Gambosi, Linguaggi, Modelli, Complessità. Franco Angeli, 2003. BIBLIOGRAFIA 219 [33] G. Hoglund and G. McGraw, Break Code. Addison-Wesley, Exploiting Software: How to 2004. [Online]. Available: http: //catdir.loc.gov/catdir/toc/ecip0411/2003025556.html [34] P. Ammann and J. Offutt, Introduction to Software Testing. New York, NY, USA: Cambridge University Press, 2008. [35] C. Wieser, M. Laakso, and H. Schulzrinne, “Security testing of sip implementations,” Tech. Rep., 2003. [36] A. Helin, J. Viide, M. Laakso, and J. Roning, “Model inference guided random testing of programs with complex input domains,” https://www.ee.oulu.fi/research/ouspg/genome?action=AttachFile&do=view&target=Gen 2006. [37] M. Sutton, A. Greene, and P. Amini, Fuzzing: Brute Force Vulnerability Discovery. Addison-Wesley Professional, 2007. [38] Immunity. Spike. [Online]. Available: www.immunitysec.com [39] D. Aitel, “The advantages of block-based protocol analysis for security testing,” Tech. Rep., 2002. [40] J. DeMott. Gpf: General purpose fuzzer. [Online]. Available: http://www.vdalabs.com [41] M. Vuagnoux, “Autodafé: an act of software torture,” 2005. [Online]. Available: http://infoscience.epfl.ch/record/140525 [42] E. J. Chikofsky and J. H. C. II, Reverse engineering and design recovery: A taxonomy. IEEE Software, 1990, vol. 7. 220 BIBLIOGRAFIA [43] D. H. Crocker and P. Overell, “Augmented bnf for syntax specifications: Abnf,” RFC 2234, 1997. [44] Post Office Protocol - Version 3, IETF RFC 1939 (also STD0053), May 1996. [Online]. Available: http://www.rfc-editor.org/rfc/rfc1939.txt [45] Institute of Electrical and Electronic Engineers, Inc., Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications, IEEE Std., 2004. [46] Gnu/bison. [Online]. Available: http://www.gnu.org/software/bison/ [47] Flex: Fast lexical analyzer. [Online]. Available: http://flex.sourceforge. net/ [48] Wireshark. [Online]. Available: http://www.wireshark.org/ [49] M. Rosi, L. Maccari, and R. Fantacci, “S.t.r.e.s.s. : Stress testing and reverse engineering for system security,” in ICC, 2007, pp. 1429–1434. [50] J. Malinen. hostapd: Ieee 802.11 ap, ieee 802.1x/wpa/wpa2/eap/radius authenticator. [Online]. Available: http://hostap.epitest.fi/hostapd [51] M. Rosi and L. Maccari. [security] [dsa 1065-1] new hostapd packages fix denial of service. [Online]. Available: http://lists.debian.org/ debian-security-announce/2006/msg00150.html [52] RFC 3261 - SIP: Session Initiation Protocol, IETF Std., 2002. [53] RFC 1035 - Domain names - implementation and specification, IETF Std., 1987. [54] Bind: Berkley internet name domain. [Online]. Available: //www.isc.org/software/bind http: BIBLIOGRAFIA 221 [55] Powerdns. [Online]. Available: http://www.powerdns.com [56] RFC 3920 - Extensible Messaging and Presence Protocol (XMPP): Core, IETF Std., 2004. [57] Erlang jabber daemon. [Online]. Available: http://www.process-one. net/en/ejabberd/ [58] J. Software. Openfire. [Online]. Available: http://www.igniterealtime. org/projects/openfire/index.jsp [59] L. Rabiner, “A tutorial on hidden Markov models and selected applications in speech recognition,” Proceedings of the IEEE, vol. 77, no. 2, pp. 257–286, 1989. [60] C. Cortes and V. Vapnik, “Support-vector networks,” Machine learning, vol. 20, no. 3, pp. 273–297, 1995.