Mobile OSs analysis
Transcript
Mobile OSs analysis
Mobile OSs analysis Report for the Computer Security exam at the Politecnico di Torino Alessio Canepa (207687) Andrea Marcelli (209051) tutor: Andrea Atzeni June 2015 1 Indice 1 Introduzione 6 1.1 Il mercato dei dispositivi mobili . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2 Il problema della sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.1 Differenze tra sicurezza su mobile e su fisso . . . . . . . . . . . . . . . . . 7 1.2.2 Obiettivi di un attacco . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2.3 Canali di attacco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.4 Esempio di malware: SimpLocker, un ransomware per Android . . . . . . 10 1.2.5 Proteggersi dagli attacchi . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.3 Il modello dell’analisi di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.4 Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2 Ubuntu Touch 17 2.1 Modalità dell’analisi di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.2 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3 2.2.1 Poca integrazione tra S.O. mobili e fissi . . . . . . . . . . . . . . . . . . . 18 2.2.2 Convergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3.1 LXC - Linux Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3.2 Mir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3.3 Unity 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3.4 Applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4 Modello di sicurezza del sistema operativo . . . . . . . . . . . . . . . . . . . . . 23 2.5 Tecniche di confinamento delle applicazioni . . . . . . . . . . . . . . . . . . . . . 23 2.6 2.5.1 La necessità di confinare le applicazioni in Ubuntu . . . . . . . . . . . . . 23 2.5.2 Introduzione ad AppArmor . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.5.3 AppArmor profile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.5.4 Policy Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.5.5 Gestione autorizzazioni: Trusted Helpers . . . . . . . . . . . . . . . . . . 28 2.5.6 Condivisione contenuti: Content Hub . . . . . . . . . . . . . . . . . . . . 29 Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.6.1 Creazione e firma digitale delle applicazioni . . . . . . . . . . . . . . . . 31 2.6.2 Upload, controllo e firma digitale dello store . . . . . . . . . . . . . . . . 32 2.6.3 Download e verifica della firma digitale . . . . . . . . . . . . . . . . . . . 32 2 2.7 2.8 2.9 Memorizzazione dati critici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.7.1 GNOME Keyring e AppArmor . . . . . . . . . . . . . . . . . . . . . . . 33 2.7.2 Credenziali web: Ubuntu online accounts . . . . . . . . . . . . . . . . . . 33 Cifratura dati utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.8.1 Introduzione a eCryptfs . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.8.2 Funzionamento di eCryptfs . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Protezione dell’accesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.10 Altri elementi di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.10.1 GSettings/dconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.10.2 Display manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.10.3 Environment variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.10.4 Segnali tra processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.10.5 Protezione da remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.10.6 Certificati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.11 Vulnerabilità note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.12 Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3 CyanogenMod 40 3.1 Modalità dell’analisi di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.2 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.3 3.2.1 Storia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.2.2 Differenze con Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.2.3 Distribuzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.2.4 Device Rooted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Tecniche di confinamento delle applicazioni . . . . . . . . . . . . . . . . . . . . . 42 3.3.1 Il modello Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.3.2 Gestione dei permessi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.3.3 Gestione privilegi di root . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.4 Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.5 Componenti di sicurezza aggiuntivi . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.5.1 Whisperpush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.5.2 Protezione da remoto: Device Finder . . . . . . . . . . . . . . . . . . . . 46 3.6 Cifratura dati utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.7 Protezione dell’accesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.8 Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3 4 Tizen 51 4.1 Modalità dell’analisi di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.2 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.3 4.4 4.5 4.2.1 Tizen, “The OS of Everything” . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.2 Storia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.3 Le architetture supportate . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.2.4 Le applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.2.5 Strumenti di sviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.3.1 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.3.2 Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.3.3 Framework Nativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.3.4 Framework Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.3.5 Web Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Modello di sicurezza del sistema operativo . . . . . . . . . . . . . . . . . . . . . 56 4.4.1 L’utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.4.2 Le applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.4.3 Il sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.4.4 I principali componenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Tecniche di confinamento delle applicazioni . . . . . . . . . . . . . . . . . . . . . 59 4.5.1 Smack - Simplified Mandatory Access Control Kernel . . . . . . . . . . . 59 4.5.2 Smack in Tizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.5.3 UserID e GroupID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.5.4 The three domain model . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.5.5 Cynara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.5.6 Commenti sul modello del controllo degli accessi in Tizen . . . . . . . . . 66 4.5.7 Il sistema dei privilegi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.5.8 Firma delle applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.5.9 Installazione delle applicazioni . . . . . . . . . . . . . . . . . . . . . . . . 70 4.5.10 Esecuzione delle applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.5.11 Vasum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.6 4.7 Criticità progettuali ed implementative delle applicazioni . . . . . . . . . . . . . 74 4.6.1 Conversione automatica della applicazioni . . . . . . . . . . . . . . . . . 74 4.6.2 WebGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.6.3 XSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4 4.8 4.7.1 Il processo di revisione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.7.2 Connessione alla Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.7.3 Store non ufficiali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Cifratura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.8.1 4.9 Cifratura applicazioni Web . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Componenti di sicurezza aggiuntivi . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.9.1 Tizen Key Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.9.2 Secure Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.9.3 Content Security and Reputation Framework . . . . . . . . . . . . . . . . 85 4.9.4 Wifi Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.9.5 Gestione dei certificati SSL . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.9.6 Tecniche di mitigazione degli exploit . . . . . . . . . . . . . . . . . . . . 90 4.10 Protezione dell’accesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4.11 Vulnerabilità note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.12 Analisi Sperimentale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.12.1 Test Smack label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.12.2 Test ASLR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.12.3 Test DEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 4.13 Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 5 Conclusioni 96 6 Appendice 100 6.1 Memorizzazione dati critici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 6.1.1 6.2 GNOME Keyring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Sicurezza delle connessioni di rete . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6.2.1 GSM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6.2.2 WiFi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 6.3 Address Space Layout Randomization . . . . . . . . . . . . . . . . . . . . . . . . 105 6.4 Data Execution Prevention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.5 Modelli per il controllo degli accessi . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.6 6.5.1 Discretionary access control . . . . . . . . . . . . . . . . . . . . . . . . . 107 6.5.2 Mandatory Access Control . . . . . . . . . . . . . . . . . . . . . . . . . . 107 LXC / Linux Containers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 5 1 1.1 Introduzione Il mercato dei dispositivi mobili Il vertiginoso sviluppo tecnologico che ha caratterizzato l’ultimo ventennio ha portato diverse innovazioni, permettendo di lanciare sul mercato numerosi dispositivi innovativi. I progressi sulla “portabilità” della tecnologia hanno giocato un ruolo essenziale: sono nati nuovi dispositivi tascabili che hanno permesso di soddisfare la crescente necessità di archiviazione di dati e di connettività in movimento. Il mercato dei dispositivi mobili, ha reso “portabili” gran parte delle funzionalità fino a quel momento ristrette ai soli computer desktop, introducendo i nuovi smartphone, tablet e computer portatili, tutti dotati di caratteristiche necessarie per un costante utilizzo al di fuori dei tradizionali confini aziendali e domestici. Considerando i soli dispositivi in grado di connettersi ad internet, il loro numero ha recentemente superato quello della popolazione mondiale: i dati [1] stimano 7.3 miliardi di dispositivi contro 7.2 miliardi di persone. Di questi più di 1.2 miliardi sono telefoni cellulari e il loro numero è destinato a crescere, raggiungendo i 4 miliardi nel 2018 [2], con un forte sviluppo del mercato asiatico, soprattutto in Cina ed India. Sebbene il termine dispositivo mobile si riferisca ad un insieme di dispositivi molto vasto, come tecnologie wearable, smartphone, fotocamere ed altri, nel corso del report sarà utilizzato per indicare solo i telefoni cellulari di ultima generazione (smartphone) ed i tablet. In modo simile a quanto accade nel mondo desktop, l’interfaccia utente, il supporto per le applicazioni e tutte le altre funzionalità sono offerte da un sistema operativo. L’importanza acquisita negli ultimi anni dai dispositivi mobile rende necessario un’approfondita analisi delle soluzioni di sicurezza adottate dai diversi sistemi. Nelle successive sezioni saranno analizzate le principali differenze che caratterizzano il mondo mobile dal tradizionale desktop e le relative implicazioni di sicurezza. Saranno anche introdotti i principali obiettivi e vettori di attacco, le cui contromisure verrano successivamente analizzate per ciascun sistema operativo trattato. 1.2 Il problema della sicurezza L’avanzamento tecnologico garantisce ai dispositivi mobili una capacità computazionale sempre maggiore. Da un lato, combinata con veloci interfacce di connessione, ha reso i dispositivi mobili bersagli di attacco appetibili per l’utilizzo anche in contesti malevoli, come all’interno di botnet. Dall’altro, una maggior capacità computazionale, unita alle caratteristiche di “portabilità” e semplicità d’uso, ha contribuito ad offrire maggiori funzionalità agli utenti. Alcune di queste sono operazioni sensibili per la sicurezza e privacy degli utilizzatori. Ad esempio, molti dispositivi mobile permettono di eseguire operazioni delicate quali l’esecuzione di movimenti bancari o la gestione di servizi a pagamento. La loro diffusione ha ampliato enormemente il panorama degli utilizzatori, estesosi a quasi tutte le fasce di età. Oltre ad un incremento di utilizzo, si è assistito anche ad un aumento della fiducia nei download di contenuti provenienti da autori sconosciuti. A livello applicativo, la semplificazione della procedura di sviluppo, anche tramite l’introduzione di SDK evoluti, ha favorito la crescita delle applicazioni disponibili. Nel primo trimestre del 2014, i due maggiori store distributori di applicazioni (AppStore e GooglePlay) hanno totalizzato globalmente circa 250 milioni di download. La ricerca di malware nel volume delle applicazioni esistenti, è difficile. La sicurezza in ambito mobile è un problema importante, che richiede di essere adeguatamente affrontato: le previsioni di Infonetics Research prevedono un aumento dei relativi costi, con 6 Figura 1: Numero di minacce contro dispositivi mobili.1 una punta di 3.8 miliardi di dollari nel 2018, da confrontarsi con gli 1.3 miliardi del 2013 [3]. Un ulteriore dato significativo è quello riguardante la crescita di minacce, in particolare quelle finalizzate all’estorsione di denaro, come mostrato in Figura 1. 1.2.1 Differenze tra sicurezza su mobile e su fisso La diversità tra i dispositivi mobili ed i calcolatori tradizionali rende difficile la semplice migrazione delle soluzioni di sicurezza già disponibili, richiedendone la progettazione di nuove. Di seguito sono elencate le differenze tra il mondo mobile e fisso che maggiormente influiscono sul campo della sicurezza. • Mobilità: i dispositivi mobili nascono per poter essere sempre trasportati con sé. Se lasciati incustoditi, sono soggetti a furto o ad accesso non autorizzato: è necessario avere a disposizione nuovi sistemi per la protezione dell’accesso fisico. • Connettività: smartphone e tablet supportano varie tecnologie di comunicazione (GSM, 3G/4G, Wi-Fi, Bluetooth, NFC), tutte rappresentano canali per possibili attacchi. Sebbene alcuni siano presenti anche sui sistemi fissi, nel caso dei dispositivi mobili sono indubbiamente molto più utilizzati, anche quando non necessario. Un esempio sono il Bluetooth ed il Wi-Fi, che vengono spesso lasciati attivi per comodità. • Scheda SIM: è necessaria per il funzionamento degli smartphone ed oggi è presente anche nella maggior parte dei tablet. Alla scheda SIM è associato un credito telefonico, grazie al quale è possibile usufruire di servizi a pagamento come telefonate, SMS e traffico dati. Se un attaccante riuscisse a prendere il controllo del dispositivo, potrebbe avere facile accesso a tali risorse economiche. Secondo alcune ricerche [4], il 50% del malware recente su mobile funziona in questo modo, essendo relativamente semplice per l’attaccante ottenere un profitto. Inoltre, poiché dal punto di vista dell’operatore mobile i costi sono addebitati comunque all’utente finale, è difficile differenziare i casi di sottrazione di denaro illecito da lecite spese. 1 Sorgente immagine: Mobile Security: Finally a Serious Problem?, Neal Leavitt, IEEE Computer Society, June 11 7 • Capacità computazionale e batteria: mediamente, smartphone e tablet non dispongono della stessa capacità computazionale dei calcolatori fissi, soprattutto in termini di CPU e di disponibilità di memoria RAM. Nonostante i modelli più performanti possano comunque avere caratteristiche hardware confrontabili ad alcuni computer desktop, la scarsa autonomia della batteria è un altro fattore limitante. In ambito mobile, non è semplice realizzare protezioni a livello software basate su processi in continua esecuzione e computazionalmente intesivi. Inoltre, questo punto è particolarmente critico, poiché la durata della batteria è una delle caratteristiche del dispositivo più valutate a livello commerciale. • Sensori: I dispositivi mobili sono in genere dotati di una vasta gamma di sensori che offrono diversi servizi. Il GPS, la fotocamera, il microfono e l’accelerometro sono i principali. Qualora un attaccante riuscisse ad aver accesso ai dati dei sensori, avrebbe a disposizione un’enormità di informazioni per monitorare di nascosto l’utente. Ad esempio, una ricerca [5] ha dimostrato come sia possibile ottenere i caratteri digitati su una tastiera attraverso il solo utilizzo dell’accelerometro. 1.2.2 Obiettivi di un attacco Esistono diversi obiettivi di un attacco da cui utenti e dispositivi devono proteggersi. Di seguito sono elencati i principali: • Accesso a dati privati. I dispositivi mobili sono un mezzo di archiviazione di materiale personale, quindi un bersaglio appetibile per ottenere informazioni private su un utente. Nel caso di smartphone: SMS, email, il log delle chiamate e dati di alcune applicazioni sono molto interessanti. Inoltre le informazioni potrebbero anche essere eliminate o modificate. Un esempio è l’applicazione SpyPhone2 , per Android ed iOS, che viene eseguita in background ed è in grado di fornire ad un utente remoto informazioni relative a SMS, chiamate, email, inviare fotografie, informazioni di localizzazione, registrare audio ed altre ancora. • Furto d’identità. Uno smartphone costituisce indirettamente una forma di autenticazione del suo possessore grazie alle informazioni contenute, al contratto telefonico a cui è associato ed alle password che memorizza. • Overbilling. Con questo termine si indicano gli attacchi volti ad utilizzare il credito telefonico associato ad un dispositivo, ad insaputa dell’utente. Ad esempio, inviando SMS automaticamente o effettuando chiamate verso numeri a pagamento. • Estorsione di denaro. In questa categoria rientrano i ransomware, software malevoli che applicano delle limitazioni nell’utilizzo del dispositivo e successivamente richiedono il pagamento di un riscatto (ransom in Inglese) per rimuovere il blocco. Un esempio è SimpLocker [6], un ransomware per Android, responsabile di cifrare alcune file importanti e di impedire qualsiasi operazione sul dispositivo, reindirizzando l’utente sempre alla schermata di sblocco. Si rimanda ad un’analisi dettagliata in 1.2.4. • Lo sfruttamento della capacità computazionale. Nonostante, come precedentemente detto, la capacità computazionale di un dispositivo mobile non sia attualmente comparabile con quella di un calcolatore fisso, negli anni si è assistito ad una crescita della velocità della CPU e della disponibilità di memoria RAM. Combinata con collegamenti internet ad alta velocità, rende i dispositivi mobili molto appetibili per l’utilizzo in contesti malevoli, come ad esempio le botnet [7]. 2 http://www.spy-phone-app.com 8 • Denial Of Service. Si tratta di un attacco che mira a generare un disservizio. In generale, è facilmente individuabile e raramente crea un danno irreversibile nel dispositivo. Principalmente genera sconforto nell’utente attaccato. Gli attacchi spaziano da una diminuzione delle prestazioni, del livello di carica della batteria, fino al blocco del dispositivo da remoto. 1.2.3 Canali di attacco I principali attacchi a dispositivi mobile sfruttano sia i canali di comunicazione disponibili, che le applicazioni malevoli. Canali di comunicazione • Servizi di rete mobile tradizionali come GSM, 3G, 4G. Esempi sono gli attacchi di overbilling per il cellulare Siemens S55 [8] o il buffer overflow negli MMS su Windows Mobile CE. 4.2 [9]. • Wi-Fi : il traffico di una rete Wi-Fi può sempre essere sniffato. Il pericolo è maggiore se la rete è pubblica oppure se la protezione adottata è debole, come nel caso del protocollo WEP. • Bluetooth: gli attacchi Bluetooth sono utilizzati anche per la diffusione di malware tra devices. Un esempio è Il worm Cabir [10], che visualizza il fastidioso messaggio “Caribe” all’accensione del dispositivo. Gli attacchi su Bluetooth sono generalmente limitati dalla necessità di vicinanza tra i dispositivi. • USB : la connessione USB è comunemente utilizzata per sincronizzare il dispositivo mobile con il PC. Viene anche utilizzata dagli sviluppatori come interfaccia per il debug delle applicazioni. La sua gestione è importante: l’accesso fisico al dispositivo potrebbe permettere di ottenere informazioni riservate e di installare applicazioni malevoli. Malware Il malware è un software progettato per eseguire un payload ostile, intrusivo o dannoso ad insaputa dell’utente. Attualmente il principale vettore di distribuzione del malware è Internet. Ad esempio, può essere nascosto nel codice Javascript di una pagina web, in un applicazione scaricata o sotto forma di allegato di una email. Storicamente il malware viene classificato in [11] virus (un binario che mira ad infettare altri file, principalmente eseguibili), worm (caratterizzato da una diffusione ed evoluzione automatica), trojan (apertura di una backdoor), rootkits (exploit che permette di ottenere i privilegi di amministratore del sistema), ransomware (limitazione dell’accesso ai file del dispositivo con richiesta di riscatto). Tuttavia, è bene notare che le minacce moderne difficilmente possono essere classificate in una sola delle categorie sopra elencate in quanto frequentemente combinano più varianti. La somiglianza tra i sistemi operativi mobile con quelli tradizionali ha favorito la migrazione di software malevoli, inizialmente nati per essere eseguiti su PC, sui nuovi dispositivi. Tuttavia, la scarsa capacità computazione e le limitazioni imposte dalla batteria rendono le classiche soluzioni Anti-Virus per desktop non praticabili su smartphone e tablet. Nuove soluzioni, basate sull’installazione delle sole applicazioni firmate da una Trusted Chain e di framework di scansione ottimizzati, saranno analizzate in dettaglio nel corso del report. 9 Figura 2: Il messaggio visualizzato da SimpleLocker. 1.2.4 3 Esempio di malware: SimpLocker, un ransomware per Android Viene di seguito analizzato SimpLocker, un ransomware per Android. Nonostante attualmente sia diffuso solo per la piattaforma Android, le tecniche impiegate sono generali ed applicabili anche ad altri sistemi operativi mobile. Introduzione Verso metà del 2013 Symantec ha rilevato Android Defender (rinominato dalle aziende di Anti-Virus Android.Fakedefender), il primo ransomware per Android [12]. Si tratta di un’applicazione che, fingendo di effettuare una scansione e rilevando minacce non esistenti, blocca il dispositivo fino al pagamento di un riscatto. Il ransomware è un tipo di malware ben noto che impedisce all’utente l’accesso ai propri file fino al pagamento di un riscatto. Un anno dopo, a metà del 2014, Symantec ha individuato una nuova variante di ransomware per Android, conosciuta come SimpLocker, che impedisce l’accesso ai file del dispositivo cifrandoli. L’applicazione che distribuiva il malware in questione è Sex Xonix, un gioco all’epoca disponibile su Google Play Store. SimpleLocker [13] è una versione semplificata di una famiglia di ransomware molto diffusi sulla piattaforma Windows desktop: Dirty Decrypt, CryptoLocker, CryptoWall, CryptoDefense, TorrentLocker e Cryptographic Locker. Il malware è disponibile su Android in differenti versioni: 30 sono le varianti conosciute dalle aziende Anti-Virus, rappresentate tutte con il nome di Android.SimpLocker. Una volta che l’applicazione viene scaricata ed installata sul dispositivo mobile, il malware visualizza un messaggio a tutto schermo, riportato in Figura 3, indicando che il telefono è stato bloccato a causa della presenza e diffusione di contenuti pedopornografici. Per sbloccare 3 Sorgente immagine: http://static.spiceworks.com/shared/post/0002/2091/Fig2 6.png 10 il dispositivo è necessario effettuare un pagamento. Il messaggio può essere chiuso, ma viene immediatamente visualizzato nuovamente se l’utente tenta di lanciare un’altra applicazione. Per una maggiore intimidazione, alcuni versioni utilizzano anche la fotocamera del telefono per catturare la faccia dello sfortunato possessore e minacciano di mandarla ovunque l’autore del malware lo ritenga necessario. Diverse versioni del malware differiscono nel messaggio intimidatorio, nell’ammontare dell’estorto e sul metodo di pagamento. Durante l’installazione l’applicazione richiede i seguenti permessi [14]: • Accesso ad Internet illimitato. • Permesso per monitorare lo stato della rete. • Accesso allo stato del telefono ed il suo ID. • Permesso di eseguire applicazioni all’avvio del dispositivo. • Divieto di impostare il telefono in modalità sleep. • Accesso in lettura SD card. • Accesso in scrittura su SD card. Nonostante una lunga lista di permessi richiesti, inusuale per un gioco, non sono inclusi quelli più allarmanti, come la possibilità di effettuare chiamate e di mandare SMS, inoltre non vi è la richiesta dei privilegi di root. È comprensibile, quindi, che gli utenti continuassero con l’installazione dell’applicazione. I componenti Il malware è composto da cinque componenti: • Una Main Activity: si attiva quando l’utente tocca l’icona sullo schermo. Lo scopo principale è quello di bloccare lo schermo, visualizzare un messaggio intimidatorio ed eseguire il servizio MainService. Tutti i messaggi intimidatori sono memorizzati nel file APK come stringhe di testo ed lo schermo viene bloccato intercettando se vengono premuti i tasti di Home, Indietro e Menu. • Due BroadcastReceiver: ServiceStarter e SDCardServiceStarter. Il primo viene eseguito quando il sistema viene avviato. Il secondo si avvia quando è disponibile una scheda SD e si occupa di cifrare i file. • Due Service: MainService and TorService. Il primo si occupa di fornire le funzionalità di base del malware. TorService è responsabile della comunicazione con il command server tramite la rete Tor. Ricerca e Cifratura dei File Se una scheda di memoria SD è presente nel telefono, il servizio SDCardServiceStarter si occupa della ricerca e cifratura di tutti i file con le seguenti estensioni: .3gp, .avi, .bmp, .doc, .docx, .gif, .jpeg, .jpg, .mkv, .mp4, .pdf, .png, .txt. I file vengono cifrati usando Java Cryptography Extension (JCE) che implementa gli algoritmi di crittografia di base. Il malware utilizza un algoritmo di cifratura simmetrica AES 256 bit, con modalità Cipher Block Chaining (CBC). La chiave viene generata a partire da una stringa di testo, memorizzata nel programma, di cui viene effettuato un hash con algoritmo SHA-256. La stringa è lunga 12 caratteri e differisce nelle varianti del malware. 11 Figura 3: Prima e dopo la cifratura dei file.4 Essendo AES un algoritmo di cifratura simmetrica, cifratura e decifratura usano la stessa chiave. Analizzando il codice del malware è possibile ottenere le istruzioni utilizzate per generare la chiave ed utilizzarle per decifrare i file, senza la necessità che il server di controllo malevole, Command&Control, invii il comando di sblocco. Una volta che i file sono stati cifrati, il malware aggiunge l’estensione .enc ai file cifrati, li scrive sulla scheda SD ed elimina i file originali, come visibile in Figura 3. In confronto, CryptoLocker [15], la versione desktop del malware, fa uso di una maggiore complessità nella fase di cifratura: impiega AES per cifrare le informazioni iniziali e RSA, un algoritmo di cifratura asimmetrico, per cifrare i file del dispositivo. La chiave privata viene salvata nel Command&Control server, rendendo quasi impossibile il recupero dei file senza pagamento del riscatto. Per poter confrontare con maggiore dettaglio le tecniche usate nelle due versioni di malware, di seguito sono elencati i principali passaggi della tecniche di cifratura usati da CryptoLocker: • Il malware ottiene delle informazioni sul calcolatore della vittima e le cifra utilizzando una chiave AES-256 bit generata randomicamente [16]. • La chiave AES viene cifrata utilizzando RSA (1024 o 2048 bit a seconda della versione del malware) con la chiave pubblica hardcoded del server Command&Control. • Le informazioni sul computer della vittima (cifrate con AES) e la chiave AES (cifrata con RSA) vengono inviate al server. • Il server decifra la chiave AES utilizzando la propria chiave privata ed in seguito decifra anche le altre informazioni sulla vittima. • Il server genere una coppia di chiavi asimmetriche RSA (2048 o 4096 bit a seconda delle versioni), che saranno utilizzate per la cifratura dei file da parte del malware. 4 Sorgente immagine: http://www.symantec.com/connect/blogs/ simplocker-first-confirmed-file-encryptingransomware-android 12 • La chiave pubblica generata viene mandata al client cifrata, utilizzando la chiave AES-256 bit precedentemente inviata. Connessione con il Command Server La connessione con la rete Tor5 assicura la comunicazione con il Command&Control, il server malevole che viene ospitato nel dominio “.onion”, rendendo difficile l’identificazione del proprietario. Il nome del server viene specificato direttamente nel programma, differenti versioni utilizzano nomi diversi. Dopo aver stabilito una connessione, il malware ottiene le informazioni sul telefono (IMEI, numero di telefono, modello, versione del sistema operativo) e le trasmette al command server per determinare se il pagamento è stato effettuato. In seguito alla conferma del pagamento, un messaggio di risposta dal server (stop) permette di sbloccare lo schermo e decifrare i file precedentemente cifrati. Rimozione dell’applicazione malevole In alcuni dispositivi Android, il malware può essere rimosso velocemente disinstallando l’applicazione Sex Xonix, dopo aver riavviato il dispositivo. Tuttavia, nella maggior parte dei casi l’applicazione viene caricata cosı̀ velocemente dal sistema da impedirne la rimozione. La maggioranza dei dispositivi Android fornisce un’opzione per il boot del sistema operativo (OS) in Safe Mode. Questo permette di caricare solo le funzionalità di base dell’OS ed impedisce che applicazioni di terze parti vengano eseguite. Android.Simplocker può essere rimosso eseguendo il sistema operativo con questa opzione. Se dopo l’installazione dell’applicazione malevole il dispositivo viene immediatamente spento, si può prevenire che molti file vengano cifrati. In seguito si può procedere alla disinstallazione, come precedentemente spiegato, o ad un factory reset, riportando il dispositivo alle impostazioni di fabbrica. Tutti i file cifrati, possono essere decifrati in quanto la chiave utilizzata dall’algoritmo di cifratura simmetrica viene salvata all’interno del malware. Tuttavia non risulta essere un’operazione semplice per la maggioranza degli utenti che non sono familiari con gli algoritmi di cifratura. Conclusione Android.Simplocker è il primo ransomware conosciuto per Android che cifra i file, rendendone impossibile l’accesso. Nonostante questa versione del malware sia molto semplice, soprattutto se confrontata con Cryptolocker, vi è molto spazio per miglioramenti futuri. 1.2.5 Proteggersi dagli attacchi La protezione dalle minacce descritte in 1.2.2 e 1.2.3 può essere implementata su diversi livelli, di seguito elencati. • Rete. A livello di rete è possibile monitorare il traffico alla ricerca di anomalie ed implementare alcuni filtri basati sul riconoscimento di patterns malevoli. Nel caso degli SMS, ad esempio, si potrebbe sospettare un traffico anomalo nella quantità di essi, proveniente dallo stesso numero telefonico. • Il sistema operativo. In ambito mobile rappresenta il tipo di protezione più importante. I sistemi operativi mobile limitano l’adozione di sistemi di sicurezza “detection based” in favore di soluzioni di tipo “prevention based”. I primi sono dispendiosi nei consumi, i secondi mirano a prevenire ed, in caso, a limitare i danni inflitti da un software malevole 5 https://www.torproject.org 13 o da altri attacchi precedentemente descritti in 1.2.3. La strategia di prevenzione si concretizza soprattutto nella realizzazione del “Confinamento delle applicazioni”, uno dei punti centrali dell’analisi (sezioni 2.5, 3.3, 4.5). • Store. È il negozio virtuale per la distribuzione di applicazioni. Attualmente ogni sistema operativo ha il proprio store ufficiale, ma sono presenti anche versioni multipiattaforma, ad esempio per la distribuzione di applicazioni in tecnologia Web. In ambito mobile rappresenta il primo filtro per evitare la diffusione di applicazioni malevoli, grazie ad un processo di revisione che può essere anche completamente automatizzato. Nelle sezioni 2.6, 4.7 verranno trattate in dettaglio le diverse soluzioni adottate per ciascun sistema operativo analizzato. • Utente. Parte degli attacchi non sfrutta falle tecnologiche dei dispositivi attaccati, ma utilizza tecniche di social engineering che portano l’utente ad eseguire operazioni dannose per la sua privacy o per l’integrità del sistema operativo. Prevenire questi problemi è una sfida più a livello sociale che tecnologico: sono necessarie campagne di informazione e di sensibilizzazione degli utenti verso il problema della sicurezza, affinché siano consapevoli delle sempre crescenti situazioni di rischio legate ad un uso non coscienzioso di uno smartphone. Tuttavia, i sistemi operativi mobile possono offrire un certo livello di protezione attraverso notifiche sui possibili rischi legati ad alcune funzionalità, sull’utilizzo di impostazioni non sicure o addirittura in alcuni casi, impedendo determinate azioni. Nel corso del report verranno analizzate nel dettaglio le soluzioni di sicurezza offerte a livello di sistema operativo, store ed utente. Le operazioni di monitoring della rete sono a carico dell’operatore e dell’amministratore di rete, esulando pertanto dagli scopi di questo documento. 1.3 Il modello dell’analisi di sicurezza Nel report saranno analizzati due sistemi operativi emergenti, Ubuntu Touch e Tizen ed il custom firmware di Android CyanogenMod. Al fine di rendere il documento più omogeneo, l’analisi è stata condotta secondo un modello comune. Nonostante la diversità dei sistemi analizzati, sono state selezionate alcune macrocategorie, di seguito dettagliate, in modo da facilitare l’operazione di confronto tra le soluzioni adottate in ciascun prodotto. 1. Modalità dell’analisi di sicurezza: descrizione del procedimento adottato e delle fonti impiegate per analizzare il sistema operativo. 2. Introduzione 3. Architettura: descrizione dell’architettura del sistema operativo (il kernel, i componenti principali, i livelli in cui è suddiviso). Analisi di eventuali componenti di virtualizzazione e di Framework a supporto delle applicazioni. 4. Il modello di sicurezza del sistema operativo: il modello adottato nella progettazione della soluzioni di sicurezza. Una visione d’insieme delle tecniche adottate. 5. Tecniche di confinamento delle applicazioni: l’impiego di eventuali tecniche di isolamento delle applicazioni per prevenire e limitare le conseguenze di possibili attacchi. Tali tecniche consistono nell’isolare ciascuna applicazione, impedendone l’interazione con le altre. Inoltre, si vuole limitare l’accesso ai componenti del dispositivo e ai dati sensibili memorizzati. 14 6. Criticità progettuali ed implementative delle applicazioni: valutazione di possibili peculiarità progettuali o implementative che introducono debolezze nella sicurezza delle applicazioni. 7. Store: analisi del negozio virtuale, nel caso in cui sia disponibile, per la distribuzione di applicazioni per dispositivi mobili. Il servizio generalmente permette di navigare tra le applicazioni compatibili con il proprio dispositivo e di scaricarle direttamente sullo smartphone o tablet, sia gratuitamente, che a pagamento. Si vogliono analizzare le possibili funzioni offerte, tra cui quella di filtrare la pubblicazione di applicazioni sulla base di un processo di revisione al fine di limitare la diffusione di applicativi malevoli o non adatti, nei contenuti, per gli utenti. 8. Cifratura: eventuali funzionalità finalizzate a limitare l’esposizione e la perdita di dati sensibili memorizzati all’interno dei terminali, in particolare a seguito della compromissione fisica di un dispositivo. 9. Componenti di sicurezza aggiuntivi: analisi di eventuali soluzioni di sicurezza addizionali, specifiche di ciascun sistema operativo. 10. Protezione dell’accesso: analisi dei meccanismi disponibili per la protezione dell’accesso fisico, il primo livello di protezione applicabile sui dispositivi mobili. È finalizzato ad inibire l’uso non autorizzato in caso di smarrimento o furto ed a proteggere i dati contenuti al suo interno. In questo contesto rientrano l’impiego della password impostabile dall’utente ed il blocco automatico del dispositivo dopo un certo periodo di inattività. Misure addizionali riguardano la possibilità di effettuare un reset hardware o la cancellazione dei dati da remoto. 11. Vulnerabilità note: eventuali falle di sicurezza note pubblicamente, alle quali è stato assegnato un Identificatore CVE (Common Vulnerabilities and Exposures). 12. Analisi sperimentale: eventuale utilizzo dell’emulatore o di un dispositivo fisico per provare le nozioni acquisite, testare le impostazioni di sicurezza insieme a possibili debolezze del sistema operativo. 13. Conclusione: note conclusive sull’analisi del sistema operativo. Punti di forza, debolezze, migliorie. Confronto delle soluzioni adottate con quelle offerte nel panorama della sicurezza mobile. L’analisi è stata condotta in collaborazione con il Security Lab di “Telecom Italia Information Technology”. Si ringraziano Roberta D’Amico, Dario Lombardo per il supporto offerto. In accordo con le loro esigenze, si è deciso di analizzare i tre sistemi operativi con un livello di dettaglio crescente secondo l’ordine: CyanogenMod, Ubuntu Touch e Tizen. Questa scelta è dettata anche dal livello di interesse e particolarità dei sistemi in questione. Tizen è indubbiamente il più interessante ed innovativo nelle soluzioni di sicurezza. Ubuntu Touch è un ramo di Ubuntu, che si vuole aprire al mondo mobile conservando la struttura della versione desktop. Infine, CyanogenMod è una variante di Android, che rilassa alcuni stretti vincoli di sicurezza a vantaggio di maggiori funzionalità. 1.4 Conclusioni La rapida diffusione dei dispositivi mobili, combinata con le maggiori funzionalità offerte, ha reso il problema della sicurezza di fondamentale importanza, anche in ambito mobile. La 15 disponibilità di una connettività quasi sempre presente, rende i dispositivi mobili soggetti a diversi tipi di attacco, che possono arrecare un danno economico, materiale, o violare la privacy dei loro possessori. È evidente che siamo all’inizio di un’era in cui gli attacchi saranno sempre più sofisticati. Progettare nuove soluzioni di sicurezza ad hoc è una sfida tanto necessaria quanto difficile: l’adozione delle stesse misure adottate su calcolatori classici è ostacolata dalle limitate risorse che i dispositivi mobili offrono, in termini di capacità computazionale, ma soprattutto per l’autonomia di carica. In questo contesto, è fondamentale il ruolo del sistema operativo mobile, che racchiude quasi interamente le funzioni di sicurezza adottabili. 16 2 Ubuntu Touch Figura 4: Schermata home di Ubuntu Touch6 2.1 Modalità dell’analisi di sicurezza Si analizzano ora le caratteristiche di sicurezza di Ubuntu Touch. L’analisi è stata condotta principalmente sulla base della documentazione ufficiale del sistema operativo presente online. Oltre a ciò, la natura open source di Ubuntu Touch ha consentito di esplorare le discussioni pubbliche degli sviluppatori sulle piattaforme online di codesharing, tra cui Launchpad7 . Si è anche preso diretto contatto con alcuni sviluppatori tra cui Marc Deslauriers, esperto di sicurezza in Canonical8 e uno dei più contribuenti sviluppatori di Ubuntu, il quale ha fornito consigli su come affrontare l’analisi e chiarimenti. Infine, è stato utilizzato l’emulatore ufficiale di Ubuntu Touch9 al fine di poter testare la navigazione attraverso le funzionalità del sistema. In generale, si vuole specificare che l’attuale condizione di sistema operativo neonato ha reso particolarmente difficile la ricerca di informazioni. La documentazione ufficiale cambia di mese in mese e contiene a volte informazioni non aggiornate. Alcune delle strategie di sicurezza da 6 Sorgente immagine: https://lwn.net/Articles/540146/. www.launchpad.net 8 Canonical è la compagnia che sta dietro allo sviluppo di Ubuntu 9 Al momento estremamente limitato. 7 17 adottare sono attualmente ancora in discussione. Lo stato dell’arte, in termini di documentazione e analisi, relativo a Ubuntu Touch è estremamente limitato se non inesistente. Secondo le nostre ricerche, la presente analisi rappresenta il primo documento che riunisce in modo ordinato i diversi aspetti di sicurezza di questo sistema operativo. Le suddette ragioni, unite alla difficoltà di reperire un dispositivo compatibile con Ubuntu Touch (il primo modello di smartphone con Ubuntu Touch preinstallato è uscito a inizio 2015), hanno portato ad optare per un’analisi di tipo documentativa e non sperimentale. Poiché, come sarà mostrato nella sezione 2.3, l’architettura software di tale sistema operativo coincide in gran parte con quella di Ubuntu Desktop, ed essendo una completa analisi della sicurezza di Ubuntu al di fuori degli intenti di questo report, si è deciso di analizzare gli aspetti del sistema operativo che hanno maggior rilevanza ai fini dell’utilizzo in ambiente mobile. 2.2 Introduzione Ubuntu Touch è una nuova distribuzione di Ubuntu volta al mondo dei dispositivi mobile [17]. Si tratta di un sistema operativo per smartphone e tablet, con un’interfaccia che ricorda molto Ubuntu Desktop nelle forme e colori. Sebbene la versione desktop e mobile siano al momento distribuite distintamente, in realtà è bene chiarire che dal punto di vista architetturale non si tratta di due sistemi distinti [18]: Ubuntu Touch è di fatto Ubuntu 14.04, a cui comunemente viene aggiunto il suffisso Touch nel caso sia utilizzato in ambiente mobile10 . Si spiega meglio l’origine di questa scelta e quale innovazione porta con se. 2.2.1 Poca integrazione tra S.O. mobili e fissi I primi telefoni cellulari erano dotati di capacità computazionale e funzionalità imparagonabili a quelle dei sistemi fissi. Per questo motivo, il loro campo di utilizzo è rimasto per anni ben distaccato da quello dei comuni calcolatori. Come presentato nell’introduzione, l’era degli smartphone sta annientando queste differenze. Ad oggi è possibile fare coi nostri smartphone quasi tutto ciò che i sistemi desktop permettono. Eppure, nonostante queste differenze in termini di utilizzo stiano scomparendo, le strutture software che li governano ereditano dal passato profonde differenze che ostacolano una totale integrazione dei due sistemi. Difficilmente si può iniziare a scrivere un file su desktop per poi proseguire da smartphone o viceversa. Nonostante i moderni sistemi Cloud cerchino di ovviare a questo problema (si veda ad esempio Google Drive), la strada pare ancora lunga, e porta con sé diverse problematiche legate alla necessità di una connessione internet. Finché dispositivi mobili e fissi erano dedicati a scopi distinti, tale mancanza di integrazione non rappresentava un problema. Oggi che è possibile gestire con entrambi le stesse cose, il tema sta acquisendo sempre maggiore rilevanza. 2.2.2 Convergenza La soluzione a questa poca integrazione proposta da Canonical, il team di sviluppo di Ubuntu, si chiama convergenza e si basa su un’idea molto innovativa. Dal momento che i moderni dispositivi mobili possono avere le caratteristiche sufficienti per eseguire un sistema operativo desktop, si è pensato di lasciarsi alle spalle la storica divisione tra i due mondi, portando su tali dispositivi lo stesso Ubuntu desktop. Il kernel Linux si adatta bene a diversi tipi di architetture hardware e, come l’esperienza Android dimostra, può facilmente essere utilizzato anche su questi 10 La terminologia “Ubuntu Touch” pare addirittura non essere ufficialmente riconosciuta dagli sviluppatori, sebbene sia comunemente utilizzata. 18 device. Tale operazione ha indubbiamente richiesto alcune modifiche, specialmente a livello di gestione dell’interfaccia (resa in grado di adattarsi a schermi piccoli e touch screen) e dei driver, che saranno analizzate nella sezione 2.3. Guardando al futuro, l’idea della convergenza è di unificare il mondo mobile e desktop, ottenendo un dispositivo portatile che, collegato ad una apposita dock station dotata di schermo, mouse, tastiera e ogni altra interfaccia utile, possa comportarsi esattamente come un computer fisso e mostrare all’utente un classico sistema operativo desktop. Ad oggi la convergenza non è stata ancora portata a termine, e Ubuntu Touch (o meglio, l’adattamento di Ubuntu ai dispositivi mobili) è ancora da considerarsi un sistema in via di sviluppo. Al momento è possibile installarlo solo su alcuni device di casa Google (Nexus 4, Nexus 7, Nexus 10) e, da Febbraio 2015, è in commercio il primo smartphone (Aquaris E4.5) con Ubuntu Touch preinstallato11 . Fino a Gennaio 2015, sulla pagina web ufficiale del progetto si leggeva che la convergenza sarebbe giunta a completamento con Ubuntu 16.04 LTS. Ora tale pagina è stata rimossa per motivi a sconosciuti, ma si suppone che il progetto sia ancora in atto. 2.3 Architettura Come detto precedentemente, l’architettura di Ubuntu Touch coincide quasi interamente con l’architettura di Ubuntu 14.04 LTS. In Figura 5 se ne ha una rappresentazione schematica. Si noti come si distinguono 2 macro-blocchi: il kernel Linux e lo strato Ubuntu. Il kernel inizialmente incluso era la versione 3.13, ma è stato aggiornato alla 3.16 con il rilascio di Ubuntu 14.04.2 nel Febbraio 2015. Si descrivono ora le componenti di più alto livello. 2.3.1 LXC - Linux Container Un LXC (Linux Container) è un ambiente per la virtualizzazione a livello di sistema operativo, che permette l’esecuzione di diversi ambienti Linux isolati tra loro (detti appunto containers) all’interno di un singolo sistema Linux reale ospitante. Per una trattazione più approfondita si faccia riferimento all’appendice 6.6. Si mostrano le ragioni della presenza di un LXC nel caso in questione. Ubuntu Touch sta indubbiamente entrando nel mercato in ritardo rispetto ai propri concorrenti. Voler sviluppare un sistema in grado di essere eseguito sul maggior numero di dispositivi possibile richiede di avere a disposizione per ciascuno di essi i driver di basso livello necessari. Come dichiarato da Ricardo Salveti all’Embedded Linux Conference 2014, chiedere ai produttori di dispositivi di rilasciare i driver compatibili con Ubuntu sarebbe stato impossibile. Ubuntu Touch risolve questo problema eseguendo all’interno di un LXC l’Android HAL (Hardware Abstraction Layer), al fine di utilizzarne i driver e alcuni demoni necessari per la gestione dell’hardware del dispositivo sottostante. Come si è detto, il container deve essere ospitato da un altro sistema Linux based, nel nostro caso Ubuntu. Poiché nel nostro caso l’LXC contiene i driver necessari alla comunicazione con il dispositivo, il suo avvio avviene durante le primissime fasi del boot. Non appena il sistema è pronto, l’LXC viene avviato e genera al suo interno il proprio file system. Al termine del suo caricamento, il processo di boot standard può proseguire ed avviare tutte le funzionalità di più alto livello. Da questo momento in avanti, le applicazioni possono dialogare con il container, e 11 12 La lista aggiornata dei device supportati è disponibile a https://wiki.ubuntu.com/Touch/Devices. Sorgente immagine: [18]. 19 Figura 5: Architettura Ubuntu Touch 12 . dunque con l’hardware sottostante, tramite libhybrids 13 , che funge da strato di comunicazione tra i due [19]. 2.3.2 Mir Mir è il display server. È stato sviluppato per rimpiazzare il vecchio X Window System e supportare lo sviluppo di Unity 8, la nuova generazione di Unity user interface. In quanto display server, esso controlla e gestisce a basso livello l’integrazione delle parti della GUI. Ad esempio, gestisce il mouse e aiuta a combinare i movimenti del mouse con il cursore e gli eventi di interfaccia che il movimento del cursore causa. La Figura 6 mostra alcune delle funzionalità di Mir. 2.3.3 Unity 8 Unity8 è la shell grafica utilizzata. Fornisce gli strumenti di interfaccia utili ad utilizzare il sistema nel modo più user-friendly possibile. Consente operazioni come l’apertura, chiusura, movimento, ridimensionamento delle finestre, o il cambio di focus tra queste. Le modifiche avvenute da Unity 7 a Unity 8 sono un passo fondamentale verso la convergenza. Unity 8 è stata infatti progettata nell’intento di avere un’unica implementazione che potesse gestire un’interfaccia grafica in grado di adattarsi perfettamente ad una vasta varietà di schermi, in senso di forme e dimensioni: smartphone, tablet, TV, desktop. Inoltre, sempre pensando ad un utilizzo nel contesto “converged”, Unity 8 è stata alleggerita rispetto alla versione precedente, al fine di essere adatta ad un hardware più limitato. Unity 8 è stata sviluppata in gran parte 13 Hybris o libhybris è un livello di compatibilità per computer su cui sono eseguite distribuzioni Linux, basato sulla libreria GNU C, ed ha lo scopo di rendere possibile utilizzare software scritto per sistemi Linux Bionic-based Linux, che includono principalmente librerie Android e driver dei dispositivi. 14 Sorgente immagine: http://www.phoronix.com. 20 Figura 6: Le componenti del display server Mir 14 utilizzando il Qt Modeling Language (QML) attraverso il Digia’s Qt framework [20].Si tratta di un linguaggio basato sull’integrazione di JavaScript e Qt per la progettazione di applicazioni con interfacce di grande impatto visivo [21]. Qt è una libreria cross-platform, largamente utilizzata nello sviluppo di applicazioni software con interfaccia grafica [22]. 2.3.4 Applicazioni Tipologie Le applicazioni, cosı̀ come lo stesso Unity, si appoggiano su Mir e Qt. Possono essere scritte in QML o HTML5. Mentre le applicazioni QML sono necessariamente Local, ovvero il cui codice risiede in locale, le applicazioni HTML 5 possono essere sia Local che Hosted, ovvero residenti su website remoti ed eseguite dal browser. Per richiamare l’espressione utilizzata nella documentazione ufficiale, le applicazioni Web-based (scritte in HTML5) e quelle native (QML) sono considerate “equal citizens”, ovvero condividono lo stesso modello e possono (a meno di restrizioni che vedremo in seguito) accedere allo stesso insieme di API del dispositivo. Le applicazioni HTML 5 sfruttano Apache Cordova. Si tratta di un insieme di API, che permettono ad una applicazione di accedere tramite JavaScript alle funzionalità native del dispositivo quali la fotocamera e l’accelerometro. Combinate con un UI framework, nel nostro caso Qt, permettono di sviluppare un’applicazione utilizzando solo HTML, CSS, e JavaScript. È previsto anche il supporto per applicazioni scritte in C++, anche se è una pratica meno frequente [23]. 21 Distribuzione Tradizionalmente il software per Ubuntu è distribuito attraverso gli Ubuntu archives. Tale modello è basato sulla fiducia, barriere all’ingresso e tempi lunghi. Per avere il permesso di pubblicare un pacchetto all’interno di tale archivio, uno sviluppatore deve dimostrare affidabilità contribuendo molto all’interno della community. Imparare a creare e modificare tali pacchetti e renderli conformi alla pubblicazione negli Ubuntu archive è complesso, richiede tempo e rappresenta pertanto una grossa difficoltà. Inoltre, tali archivi sono aggiornati solo con le nuove release di Ubuntu, pertanto i tempi richiesti per la pubblicazione o l’aggiornamento di un’applicazione sono particolarmente lunghi. Questo processo lungo e complesso, unito a continui controlli di sicurezza sui pacchetti, garantisce un archivio software di cui gli utenti si possono fidare, ma non rappresenta un canale tramite cui gli sviluppatori possono portare agli utenti rapidamente le nuove versioni del proprio software. L’obiettivo della convergenza e, in generale, la nuova apertura verso il mercato dei dispositivi mobili, ha reso necessaria l’adozione di un nuovo sistema di distribuzione delle applicazioni. Si vuole avere un modello di App store, semplice, rapido, dinamico, adatto alla distribuzione di un elevato numero di applicazioni, in cui anche piccoli sviluppatori (in numero sempre crescente) possano pubblicare le proprie applicazioni e gli aggiornamenti, in modo che siano subito disponibili agli utenti finali. Inoltre, si vuole aggiungere supporto per la creazione di applicazioni che saranno eseguite sotto confinamento. A tal scopo, parallelamente ai tradizionali Ubuntu archives, è stato aggiunto uno store speciale (al momento non accessibile da browser) dedicato ai cosiddetti Click Packages. Si tratta di un nuovo formato di packaging utilizzato in Ubuntu Touch e, a partire da Ubuntu 14.10, sulla versione Desktop. I Click package semplificano notevolmente il lavoro dello sviluppatore. Possono essere creati grazie ad una procedura automatizzata tramite l’Ubuntu SDK, che permette inoltre la specifica delle impostazioni di confinamento. La procedura di caricamento online dei Click package richiede pochi minuti attraverso il portale“My Apps” di Ubuntu, e li rende quasi immediatamente disponibili agli utenti. Dettagli saranno discussi in 2.6. Non esistendo ancora un nome specifico per lo store online che distribuisce i Click packages, d’ora in avanti lo denoteremo con “App store”, al fine di distinguerlo dai tradizionali repository (Ubuntu archives). Applicazioni trusted e untrusted Le applicazioni possono essere distinte in due macro gruppi: untrusted e trusted dall’OS. Le applicazioni untrusted sono quelle scaricate dall’App store, per le quali il processo di pubblicazione è più semplice. Tali App sono obbligatoriamente confinate da un profilo AppArmor (vedremo di cosa si tratta in 2.5). I controlli dello store su queste App possono essere, sotto opportune condizioni che vedremo in 2.6, automatici. Le App non fidate possono accedere solo ai propri dati e a quanto espressamente concesso dall’utente, non possono accedere a funzioni privilegiate del OS, né a particolari API come quelle per la telefonia. Con l’autorizzazione dell’utente, esse possono accedere ad API sensibili come la localizzazione o online accounts. Tipicamente non sono supportate da Ubuntu o Canonical. Le applicazioni fidate sono invece quelle installate come parte integrante del sistema operativo o distribuite da Ubuntu/Canonical. Di norma queste applicazioni non sono eseguite confinate. Tali applicazioni possono tipicamente accedere ad ogni risorsa o dato disponibile all’interno della sessione dell’utente. Hanno accesso limitato ai servizi e dati di sistema secondo il sistema tradizionale di permessi Unix. Sono supportate da Ubuntu e/o Canonical e di norma costantemente aggiornate. 22 2.4 Modello di sicurezza del sistema operativo Garantire massima sicurezza è uno dei principi fondamentali dello sviluppo di Ubuntu Touch. Si riassumono brevemente i punti chiave su cui si basa il modello di sicurezza adottato, indicando in quali sezioni di questo report sono analizzati. • Distinzione tra applicazioni Trusted e Untrusted (2.3.4): a seconda della provenienza di una applicazione, le politiche di confinamento possono essere o meno necessarie. • Confinamento applicazioni (2.5): è il meccanismo chiave con cui si applica la sicurezza. Consiste nella definizione di un profilo per ogni applicazione, che ne specifica i permessi. – Controllo accesso al file system (2.5.3): tramite il profilo sopra detto, è possibile specificare singolarmente a quali percorsi del file system una applicazione può accedere. – Protezione accesso a sensori e particolari tipi di dato (2.5.4 e 2.5.5): anche per i sensori e dati quali la musica, galleria fotografica, calendario ecc... è possibile definire regole di accesso individuali. – Protezione condivisione dati tra applicazioni (2.5.6): nonostante il confinamento, al fine di migliorare l’esperienza utente le applicazioni devono essere in grado di scambiare dati tra loro, e ciò deve avvenire in modo sicuro. • Controllo a livello di store (2.6) – Verifica applicazioni : al fine di garantire un App store funzionale e al contempo sicuro, è necessario affiancare processi di revisione delle App automatici ad altri manuali. – Firma applicazioni: il dispositivo deve poter scaricare applicazioni solo da fonti attendibili e verificarne l’autenticità. • Memorizzazione dati critici (2.7): le applicazioni necessitano di un luogo centralizzato per la gestione di dati critici. • Cifratura dati utente(2.8): consente di proteggere la segretezza dei dati anche nel caso in cui protezioni a livello software (di sistema operativo) non fossero efficaci. • Protezione dell’accesso(2.9): è il sistema base con cui viene impedito lo sblocco del dispositivo ad un utente non autorizzato. 2.5 Tecniche di confinamento delle applicazioni 2.5.1 La necessità di confinare le applicazioni in Ubuntu L’introduzione di un App store per la distribuzione dei Click package introduce alcune problematiche di sicurezza: il processo semplificato può facilitare la pubblicazione di malware all’interno dello store, oppure permettere che applicazioni con falle di sicurezza arrivino direttamente agli utenti. Ubuntu deve essere pronto ad ospitare in modo sicuro grandi quantità di software non fidato. Ciò implica la necessità di confinare le applicazioni. Tecniche di confinamento delle applicazioni sono di uso comune in tablet e smartphones. Da quanto detto in precedenza sulla convergenza, dovrebbe essere chiaro che, nel nostro caso, le soluzioni adottate per confinare le applicazioni sono state progettate non in modo specifico per dispositivi mobili, ma per un 23 sistema operativo congiunto, in grado di essere eseguito su smartphones, tablets, smart TV e desktops. Tali soluzioni, inoltre, necessitano di essere facilmente compatibili con applicazioni già esistenti. Un’applicazione confinata deve avere il permesso di leggere e scrivere dati solo da locazioni che sono state precedentemente approvate dall’utente e lo stesso principio vale per l’uso dei sensori. L’implementazione di una soluzione deve essere il più semplice possibile, e non deve avere impatto sul tempo di startup di un’applicazione. Anche il sistema di gestione dei diritti delle applicazioni necessita di essere semplice e comprensibile. La soluzione adottata in Ubuntu si chiama AppArmor. 2.5.2 Introduzione ad AppArmor AppArmor è un modulo di sicurezza del kernel Linux che implementa un MAC (Mandatory access control). Insieme al tradizionale sistema Unix dei permessi utente, permette di limitare le App a un limitato set di risorse. AppArmor è una tecnologia già matura, utilizzabile per confinare applicazioni su ogni installazione default Ubuntu a partire dalla versione 7.10 (Ubuntu Gutsy Gibbon). Il livello di confinamento che AppArmor adotta su ogni applicazione è definito da profili associati alle applicazioni e memorizzati all’interno del kernel. Se un profilo non viene specificato per un particolare binario, tale binario non sarà confinato. In tal caso, tuttavia, saranno sempre valide le restrizioni imposte del tradizionale sistema dei permessi utente Unix. Nel caso di un programma in esecuzione sotto un determinato profilo AppArmor, qualora questo dovesse tentare l’accesso ad un percorso non autorizzato, AppArmor impedirà tale accesso e il programma potrebbe andare in crash. Focalizzandoci maggiormente su AppArmor, il diagramma di Figura 7 rappresenta il suo funzionamento. Figura 7: Architettura AppArmor 15 . Nella parte inferiore della figura si trova il kernel. Il LSM (Linux Security Module, [24]) è un modulo del kernel Linux che consente di supportare dei MAC policy engine esterni (come 15 Sorgente immagine: http://ftpmirror.your.org/pub/wikimedia/images/wikipedia/commons/b/b1/AppArmor.pdf. 24 AppArmor) e renderli parte integrante del kernel. Tramite l’LSM, AppArmor ha la possibilità di operare a livello kernel pur non facendone propriamente parte. Ciò consente di conservare all’interno di AppArmor le policy di sicurezza per ogni applicazione, evitando di dover applicare patch al kernel tutte le volte che si ha il bisogno di modificarle. Fondamentalmente, LSM chiede ad AppArmor se le operazioni che un’applicazione vuole eseguire possono essere concesse. Nella parte superiore dell’immagine si trova l’AppArmor management software (nello schema semplicemente AppArmor), che rappresenta l’insieme di tool per modificare manualmente le policy. In arancione sono rappresentate le applicazioni, ognuna delle quali potrà avere un’AppArmor policy corrispondente che ne descrive i permessi. Secondo i progettisti di AppArmor, portare la sicurezza a livello kernel, come permesso dall’interfaccia LSM, è di importanza fondamentale ai fini di garantire la sicurezza. Come Crispin Cowan, direttore del Software Engineering Security Architect, ha detto, la sicurezza fatta a livello di libreria è solo apparente, sembra che le applicazioni non possano fare quel che gli è vietato, ma l’attaccante che riesce a infettare l’applicazione può bypassare la libreria e arrivare al kernel. Questo, invece, non è il caso della sicurezza a livello di kernel [25]. È risaputo che, di norma, una lista di permessi può essere espressa secondo un modello black list (in cui tutto è concesso a parte quanto espressamente vietato) oppure white list (in cui tutto è vietato tranne quanto espressamente concesso). Il secondo è indubbiamente un modello più sicuro, ma più difficile da mantenere perché per funzionare bene richiede che nessun permesso di quelli necessari sia omesso. Quello di AppArmor è una sorta di modello ibrido: a livello di applicazione usa una white list, perché specifica i percorsi a cui essa può accedere, quando tutti gli altri sono vietati. A livello di sistema è invece una black list, perché solo le applicazioni con una policy definita saranno ristrette. Quando un eseguibile viene lanciato, il kernel esamina il suo percorso e cerca se esiste una policy definita da applicare per tale applicazione. Se non la trova, l’applicazione sarà avviata non confinata. Tramite la aa-exec utility è possibile eseguire un certo programma sotto un determinato profilo AppArmor, specificato a parte, e tramite l’API aa change profile si può cambiare profilo a un programma durante l’esecuzione. AppArmor si occupa inoltre di far ereditare le policy del parente ai nuovi eseguibili lanciati a runtime. 2.5.3 AppArmor profile Si tratta di un file di testo contenente le regole che descrivono le risorse a cui un’applicazione può accedere. In particolare può specificare: • Controllo di accesso sui singoli percorsi; • Controllo di accesso a funzionalità di sistema [26]; • Controllo di accesso a D-Bus; Si mostra di seguito un esempio di profilo AppArmor: #i n c l u d e <a b s t r a c t i o n s / base> c a p a b i l i t y sys time , capability sys chroot , dbus ( send ) 25 bus=s e s s i o n path=/o r g / f r e e d e s k t o p /DBus i n t e r f a c e=o r g . f r e e d e s k t o p . DBus member=H e l l o p e e r =(name=o rg . f r e e d e s k t o p . DBus ) , deny s i g n a l ( send ) s e t =( i n t ) , / e t c / ntp . c o n f / e t c / ntpkeys /tmp/ ntp ∗ ... r, x, rw , Se ne analizza brevemente il contenuto. • La direttiva include semplifica l’inclusione di alcune regole. • Tramite la keyword capability si specifica a quali servizi di sistema è concesso l’accesso. Una lista delle capabilitie supportate è disponibile in [26]. • Successivamente si trova la dichiarazione di un permesso di tipo D-Bus. D-Bus è il meccanismo utilizzato in Ubuntu e molti altri sistemi POSIX per l’IPC (Inter Process Communication). • La keyword signal è utilizzata a partire da Ubuntu 14.04 LTS per specificare quali segnali un’applicazione può inviare e/o ricevere. Nel caso visto sopra, si vieta all’applicazione di inviare segnali di interruzione ad altri processi. • Infine si ha la dichiarazione dei percorsi consentiti con i relativi permessi di lettura/scrittura/esecuzione. Si noti come quest’ultima possa essere semplificata attraverso l’uso di regular expressions. Visto questo formato del profilo AppArmor di un’applicazione, appare complicata la gestione di permessi quali “accesso alla fotocamera”. Per questo motivo sono utilizzati i Policy Groups. Confronto con SeLinux SeLinux è un modulo per il kernel Linux che fornisce, come AppArmor, la possibilità di implementare Mandatory Access Control. Questo, anziché utilizzare percorsi, assegna i programmi a certi domini e certi tipi (etichette) ai file. Le policy specificano quali domini possono accedere a quali etichette. Il problema di SeLinux è che i file con la stessa etichetta fanno parte della stessa classe di equivalenza: se in futuro si introduce un nuovo programma che vuole considerare distintamente due file etichettati in modo uguale, bisognerà introdurre nuove etichette e apportare modifiche anche alle configurazioni dei vecchi programmi. Per dettagli su SE-Linux vedere [27]. 2.5.4 Policy Groups Specificare il profilo AppArmor direttamente all’interno del package dell’applicazione rappresenterebbe una grande complicazione nella mani dello sviluppatore, non in linea con la filosofia volta alla semplificazione discussa precedentemente. Inoltre, permettere agli sviluppatori di scrivere manualmente il profilo AppArmor per le applicazioni destinate allo store online, renderebbe difficile la revisione automatica delle applicazioni. Tale processo si basa, infatti, sui 26 permessi concessi all’App. I Policy Groups rappresentano la soluzione a questo problema. Il profilo AppArmor non viene scritto manualmente dagli sviluppatori, bensı̀ generato automaticamente al momento dell’installazione sulla base di direttive di più alto livello (Policy Groups) definite all’interno del Click package. Si vuole vedere nel dettaglio come funziona. All’interno di un file manifest, contenuto nel Click package di un’applicazione, sono specificati i Policy Groups che tale applicazione richiede. Esempi di Policy Groups sono: • camera: accesso alla fotocamera; • content exchange.: permesso di condividere contenuto; • location: accesso ai servizi di localizzazione; • contacts: accesso alla lista dei contatti; • gallery: accesso alla galleria immagini; • networking: permesso di comunicare tramite le interfacce di rete. Insieme a specifici Policy Groups è possibile indicare un template da cui partire, che rappresenta un insieme di regole AppArmor predefinito, adatto ad un particolare tipo di applicazione. Al momento i Policy Templates supportati sono: • ubuntu-sdk: template di default, se nessun altro specificato. • ubuntu-webapp: un template specializzato per l’utilizzo con la piattaforma Ubuntu Webapps. • ubuntu-scope-network: template specializzato per gli scopes16 che richiedono accesso a internet. Di norma agli Scopes non è concesso utilizzare la stessa gamma di Policy Groups concessa agli altri tipi di applicazione. • unconfined: fornisce permessi massimi all’applicazione. Questo template è riservato ad applicazioni che sono specificamente fidate e non può essere utilizzato da normali sviluppatori. Di seguito si mostra un esempio di file manifest.json. Il file contiene un oggetto “Hooks” che trasporta le informazioni di nostro interesse. Potrebbe apparire ad esempio in questo modo: { [...] hooks : { myApp : { apparmor : myApp . j s o n , co nte nt −hub : myAppCH. j s o n } [...] } } [...] } 16 In Ubuntu Touch, uno scope è una sorta di widget posizionabile nella schermata di home. 27 Ciò vuol dire che il file myApp.json contiene sia le informazioni relative ad AppArmor, sia quelle specifiche per il content-hub (vedremo in seguito di cosa si tratta). Il file myApp.json potrebbe avere un contenuto come il seguente, in cui comunica che si vuole poter accedere alla videocamera, al GPS e al microfono. { policy groups : [ camera , microphone , location ], policy version : 1 } Al momento dell’installazione, un tool automatico di nome aa-easyprof crea il profilo AppArmor corrispondente al template e ai Policy Groups specificati. Come mostrato in Figura 8, ognuno dei possibili Policy Groups rappresenta diverse entry nel formato AppArmor. È importante notare che, come sarà illustrato in 2.5.5, specificare ad esempio camera nei policy groups, non significa che, una volta installata, l’applicazione avrà il permesso di accedere alla fotocamera: servirà un ulteriore consenso dell’utente, fornito attraverso i cosiddetti Truster Helpers. Figura 8: Scelta Policy Groups 17 La lista di Policy Groups svolge, inoltre, il ruolo di semplificare il processo di revisione di un’applicazione. Lo store legge automaticamente il contenuto del file manifest e ne estrae i permessi richiesti. Qualora fossero richiesti Policy Groups non considerati pericolosi, l’applicazione sarebbe immediatamente accettata. In caso contrario, potrebbe subire un processo più lungo di revisione manuale. 2.5.5 Gestione autorizzazioni: Trusted Helpers Si è visto come il profilo AppArmor di un’applicazione specifichi con quali servizi tale applicazione possa comunicare e a quali percorsi possa accedere. Il permesso di comunicazione con 17 Sorgente immagine: https://developer.ubuntu.com/en/publish/security-policy-groups/. 28 servizi che gestiscono dei dati o sensori, non è però sufficiente a consentire all’App l’accesso a questi ultimi. Serve esplicita autorizzazione dell’utente, si mostra ora come. Nel modello di sicurezza adottato, gli utenti prendono decisioni riguardo la concessione di operazioni sensibili nell’esatto momento in cui esse sono richieste. Ciò è ottenuto attraverso l’uso di componenti che prendono il nome di Trusted Helpers. In generale, gli helpers sono processi che gestiscono l’accesso di una applicazione a dei servizi esterni: ad esempio, esiste l’helper della fotocamera, con cui un’applicazione deve comunicare se vuole scattare foto. Esistono anche helper per il calendario, i contatti ecc... La comunicazione con tali helper avviene attreverso D-Bus, dunque, poichè le comunicazioni tramite D-Bus sono controllate da AppArmor, il profilo di sicurezza di un’applicazione potrebbe vietare la comunicazione con certi helpers. Qualora invece il profilo AppArmor concedesse tale comunicazione, l’helper potrebbe gestire l’accesso alla risorsa di sua competenza visualizzando un messaggio di conferma all’utente. In tal caso prende il nome di Trusted Helper. I Trusted Helpers rappresentano dunque il punto in cui l’utente può prendere la decisione di concedere o negare un certo privilegio, indipendentemente da quanto scritto sul profilo AppArmor. Infatti, il contenuto del profilo AppArmor non è visualizzato all’utente, e dipende solo da quanto dichiarato nel file di manifest dell’applicazione, compilato dallo sviluppatore. Questo modello fa si che i privilegi richiesti all’interno del file di manifest rappresentino solo ciò di cui l’applicazione potrebbe aver bisogno, ma accettare di installare un’applicazione che richiede l’accesso alla fotocamera non vuol dire, come nel modello Android, già consentire tale accesso, ma significa concedere alla App di richiedere al Trusted Helper della fotocamera di utilizzare tale servizio. I Trusted Helpers possono anche svolgere funzioni più complesse che gestire un accesso “booleano” di una App. Un esempio è quello degli Online Accounts: la AppArmor policy “online accounts” specifica se una App può comunicare o meno con l’helper degli Online Accounts, ma tale helper dovrà gestire al suo interno la scelta dell’account specifico a cui fornire accesso. Ciò sarà fatto attraverso opportuni messaggi di richiesta (ad esempio “Vuoi consentire all’applicazione X di accedere all’account Y?”). Online Accounts può memorizzare in cache la risposta. Come si può intuire, questo sistema mischia le policy di AppArmor con quelle dei Trusted Helpers. Infatti, Online Accounts agli occhi dell’utente è come se stesse modificando le policy di sicurezza quando salva la scelta di un utente, sebbene il profilo AppArmor resti sempre invariato. In questo modo è possibile dalle impostazioni modificare in un secondo momento i permessi concessi ad una applicazione. Ad esempio sarà possibile revocare l’accesso ai contatti. Secondo la documentazione, questo modello su due livelli (AppArmor e Trusted Helpers) potrebbe essere rivisto in futuro a favore di uno unico, in modo che sia più ordinato e gestibile [28]. 2.5.6 Condivisione contenuti: Content Hub Nonostante le applicazioni siano confinate, esse spesso hanno bisogno di scambiare dati con altre applicazioni. Si è visto come i Trusted Helpers possano mediare l’accesso a servizi quali fotocamera e GPS, ma come funziona il trasferimento sicuro di file come immagini e musica tra applicazioni? Come può una App essere esportatrice o importatrice di un certo tipo di file? Il meccanismo sviluppato per risolvere questi problemi si chiama Content Hub. Il suo scopo è quello di fornire una API e un servizio runtime che dia alle App la possibilità di condividere e importare contenuto da altre applicazioni. Al momento, lo sviluppo del Content Hub non è ancora terminato, tuttavia se ne discutono qui le principali caratteristiche. Content Hub si basa su alcuni principi chiave: 29 • Il contenuto è proprietario: ogni pezzo di contenuto è posseduto da una e una sola applicazione. Non esiste un’applicazione che possiede, ad esempio, tutte le immagini. • Ciascun contenuto ha una App di default: per esempio, l’applicazione predefinita per le immagini è la Gallery. • Le applicazioni possono registrarsi come sorgente per un certo tipo di contenuto: questo permette al sistema di mostrare una lista di App sorgenti da cui lo user possa scegliere nel caso voglia importare un file. Oppure, un’App che sta importando può nominare una applicazione sorgente. • Le applicazioni possono registrarsi come destinazione per un certo tipo di contenuto: il sistema può allora mostrare le applicazioni che possono ricevere questo tipo di contenuto. Ad esempio, l’utente potrebbe voler salvare un’immagine dal web browser, il sistema gli presenta una lista di applicazioni tra cui può scegliere dove salvarla. • Content transfer object: è l’oggetto che rappresenta un trasferimento. Ha una applicazione sorgente, una destinazione, del contenuto e uno stato. Una applicazione sorgente carica il contenuto che vuole esportare all’interno di questo oggetto; quando ha terminato, imposta il transfer state a charged, e il trasferimento può cominciare. • Le applicazioni sorgenti di norma forniscono un selector GUI che permette all’user di selezionare il contenuto che desidera, per poi far tornare il focus all’applicazione che sta importando. Sulla base di questi concetti, viene descritto il funzionamento di Content Hub tramite un esempio. Si immagini che una App voglia importare delle foto da una sorgente di foto di default. 1. L’applicazione comunica al content hub che essa vuole usare la sorgente di default per le immagini (Gallery ad esempio). 2. Il Content Hub passa alla App che sta importando un transfer object che la connette alla App sorgente. 3. Il Content Hub lancia il selector GUI della App sorgente per la selezione delle immagini da parte dell’utente. A quel punto il transfer object viene caricato con le immagini selezionate e segnato come pronto. Infine la galleria viene chiusa. 4. La nostra applicazione in ricezione vede che il transfer object è pronto (dal suo stato) ed è pronta ad importare l’immagine. 5. La nostra applicazione può utilizzare l’immagine e salvarla in modo permanente utilizzando una apposita API (“contentStore”). Come si è visto, il Content Hub, tramite il trasfer object, fa da intermezzo tra le due applicazioni. L’utilizzo di un’interfaccia appartenente all’applicazione sorgente per la selezione delle immagini, garantisce che l’applicazione di destinazione non acceda in alcun modo al contenuto non desiderato dall’utente. Questo sistema consente inoltre di non dover fornire l’accesso completo a tutte le immagini, ma solo a quelle desiderate. Figura 9 mostra un confronto tra i sistemi di condivisione contenuti utilizzati su diverse piattaforme. 18 Sorgente immagini: https://design.ubuntu.com/apps/patterns/content-hub. 30 (a) (b) (c) Figura 9: Confronto tra il modello di condivisione dei contenuti: (a) Ubuntu Touch, (b) Windows, (c) iOS 18 1. Ubuntu Touch: ciascuna App è confinata e può scambiare contenuto con le altre App tramite Content Hub. 2. Windows: le applicazioni non sono confinate e possono accedere ognuna al contenuto dell’altra. 3. iOS : simile a Content Hub, ma invece di un singolo Hub esistono dei “Content Pools” che trattano contenuti specifici. Ad esempio il Music Content Pool. Le applicazioni condividono contenuti tramite questi “pools”. Registrazione di una App come sorgente o destinazione Come detto, le App che esportano contenuto (App sorgenti) hanno bisogno di registrarsi come sorgenti per quel determinato tipo di contenuto. Allo stesso modo, le App si possono registrare per poter essere destinatarie di un certo tipo di contenuto. Questa registrazione consiste nel renderlo noto al Content Hub. La registrazione avviene attraverso le informazioni inserite nel file di manifest. Rifacendosi all’esempio della sezione 2.5.4, il file myAppCG.json potrebbe contenere il seguente contenuto per segnalarsi come sorgente di immagini [29] [30]. { { source : [ pictures ] } } 2.6 Store Si tratta ora il percorso di un’applicazione dallo sviluppatore all’utente finale. Nell’interesse di analizzare particolarmente la sicurezza di Ubuntu Touch, ci si concentra sul caso dei ClickPackages, scaricabili dall’App store, e considerati untrusted secondo il modello adottato. 2.6.1 Creazione e firma digitale delle applicazioni Lo sviluppo di un modello più veloce di App store, di cui si è parlato nella sezione 2.3.4, ha portato con se anche l’adozione di un nuovo sistema di impacchettamento delle applicazioni, 31 denominato ClickPackages. I ClickPackages sono semplici pacchetti di installazione, la cui procedura di creazione è notevolmente semplificata attraverso l’uso dell’Ubuntu SDK. Tramite l’Ubuntu SDK è possibile, al momento della creazione del pacchetto, specificare i Policy Groups, in modo tale da automatizzare la creazione del file manifest associato. Dettagli del file manifest restano comunque modificabili manualmente. Dopo aver creato il pacchetto, lo sviluppatore può firmarne il contenuto utilizzando una propria chiave privata. Tale chiave, insieme alla sua corrispondente chiave pubblica, può essere generata tramite l’Ubuntu SDK. Per la firma si utilizza il tool debsign tra le cui opzioni è possibile speicifcare che la firma è di tipo maint, ovvero si tratta della firma di chi si occupa del mantenimento del pacchetto. Nel caso in cui lo sviluppatore desideri firmare il pacchetto con la propria chiave privata, è necessario che egli pubblichi sul portale Online di Ubuntu, nella sezione relativa al proprio profilo (accessibile tramite apposite credenziali), la corrispondente chiave pubblica. Dunque, possiamo dire che, di fatto, la firma garantisce che lo sviluppatore del pacchetto in questione sia il possessore di tali credenziali, ma non da alcuna garanzia sulla persona fisica che sta dietro ad esse. 2.6.2 Upload, controllo e firma digitale dello store Una volta preparato il Click package, eventualmente firmato, si procede al caricamento tramite un’apposita pagina web (https://myapps.developer.ubuntu.com) sul portale MyApps, dove allo sviluppatore è richiesto di autenticarsi tramite username e password. A caricamento completato, se il pacchetto era firmato, MyApps verifica che la firma dello sviluppatore sia valida. Successivamente lo store esegue i controlli di sicurezza. Se i Policy Groups utilizzati non sono considerati pericolosi, la App è automaticamente approvata. Altrimenti può essere soggetta a un controllo manuale, in cui alcuni tecnici possono ispezionare il codice sorgente. Ad applicazione approvata, lo store firma automaticamente a sua volta il pacchetto utilizzando sempre debsign e la propria chiave privata. Questa viene specificato che la firma è di tipo origin, ovvero dell’entità che si occupa della distribuzione del pacchetto agli utenti. Infine, lo store genera e memorizza lo SHA-512 del pacchetto finale firmato [31]. 2.6.3 Download e verifica della firma digitale Nel momento in cui un device cerca informazioni su un pacchetto, riceve dallo store dei metadati che contengono i seguenti campi: un download url che contiene l’url da cui scaricare il click package, e il download sha512 che contiene lo SHA-512 del click package, precalcolato dallo store. Quest’ultimo sarà utilizzato dal servizio di download eseguito sul dispositivo per validare l’integrità del pacchetto ricevuto. Si mostra il procedimento nel dettaglio: • ClickScope19 , sul device, richiede allo store online le info di url e hash del pacchetto che vuole scaricare. • ClickScope chiede al DownloadManager di iniziare il download. • Il download manager scarica il pacchetto e convalida lo SHA-512 per essere sicuro che non sia corrotto. • Il download manager chiede all’install helper di iniziare l’installazione, passandogli il file appena scaricato. La comunicazione con l’install helper avviene tramite D-Bus ed è mediata da AppArmor. 19 ClickScope è il modulo dedicato alla ricerca di nuovi pacchetti installabili 32 • L’install helper chiede a Package Kit di installare il Click package. • Package kit verifica la firma dello store e porta a termine l’installazione. Come detto nella sezione 2.5.4, nel corso dell’installazione sarà creato e memorizzato il profilo AppArmor corrispondente ai Policy Groups dichiarati. Al momento si sta valutando se (e come) concedere in futuro di poter accettare pacchetti firmati solo dallo sviluppatore e non dallo store [31]. 2.7 Memorizzazione dati critici 2.7.1 GNOME Keyring e AppArmor Oggi si sta ancora valutando come integrare GNOME Keyring, discusso in appendice, con il sistema di confinamento di AppArmor. Al momento per default è vietato l’accesso diretto a questo servizio da parte delle App confinate. Possono invece accedervi altri servizi come Online Accounts. Si pensa che, in futuro, se un’App necessiterà dell’uso di Keyring, tale accesso sarà mediato da Apparmor: quando un’applicazione vorrà recuperare delle credenziali, se il profilo AppArmor glielo consentirà, sarà concesso l’accesso solo alla credenziali salvate da quella stessa applicazione. Si sta valutando anche se estendere l’integrazione di AppArmor al fine di rendere possibile l’accesso a credenziali che appartengono ad altre applicazioni, permettendolo o direttamente nell’AppArmor profile oppure visualizzando all’utente una richiesta di autorizzazione [32]. 2.7.2 Credenziali web: Ubuntu online accounts È un luogo centralizzato per memorizzare le credenziali degli account web. Ogni applicazione avviata dall’utente può accedere al database file degli account. Ubuntu Online Accounts è accessibile tramite D-Bus. L’accesso alle credenziali che esso contiene è protetto, come per altri servizi, su due livelli distinti (vedi sezione 2.5.5). Un booleano specificato in AppArmor specifica se tale applicazione può in generale accedere al servizio Ubuntu Online Accounts. Successivamente è compito di quest’ultimo di gestire i permessi sul singolo account (ovvero a quali degli account memorizzati una certa applicazione può accedere), e, in caso di necessità, è visualizzato a runtime un avviso che chiede se concedere o meno l’autorizzazione [32]. 2.8 Cifratura dati utente 2.8.1 Introduzione a eCryptfs La cifratura dei dati utente rappresenta una protezione principalmente contro gli attacchi offline. In particolare è in grado di proteggere la segretezza dei dati nel caso in cui il dispositivo mobile fosse rubato o in generale si riuscisse a scavalcare le protezioni a livello del sistema operativo. Si noti che, al contrario, le tecniche di isolamento delle applicazioni discusse precedentemente sono protezioni a livello software, il quale progettato in modo da vietare l’accesso non autorizzato a dati che però sono fisicamente memorizzati in chiaro. Cifrando i dati si ha invece protezione a livello fisico, nel senso che abbiamo la “certezza” che se anche un utente malevolo riuscisse ad avere accesso fisico all’hard disk (ad esempio connettendolo ad un altro computer o più semplicemente eseguendo il boot con un altro sistema operativo) non sarebbe in grado di decifrarne il contenuto, senza conoscere il segreto che lo protegge. 33 Al momento, le opzioni di cifratura dei dati utente possibili su Ubuntu Desktop, non sono replicate nella versione Touch. Ubuntu sta pianificando di portare queste soluzioni anche sui dispositivi mobili. Gli sviluppatori hanno confermato che questa funzionalità sarà implementata utilizzando il file system crittografico eCryptf, nello stesso modo in cui esso è utilizzato in Ubuntu Desktop. Si tratta di un file system crittografico “stacked”. Il termine stacked indica che esso si dispone al di sopra del file system già presente, indipendentemente da quale esso sia, e ne protegge i file cifrandone il contenuto e inserendo metadati crittografici nei rispettivi header. Questa soluzione a livello di file system consente ai file protetti di essere maneggiati normalmente, copiati tra diversi host e decriptati solo in un secondo momento. Lo svantaggio risiede nel fatto che, sebbene il contenuto dei file sia cifrato, la struttura del file system sia sempre in chiaro. La soluzione complementare alla crittografia a livello di file system (file system level encryption) è la full disk encryption, non disponibile in Ubuntu Touch, che cifra l’intero file system ma, oltre ad essere computazionalmente più dispendiosa, non consente i vantaggi suddetti. Vantaggio della full disk encryption è che, cifrando l’intero disco, protegge anche lo spazio di swap20 , lasciato invece sempre in chiaro da eCryptfs. Questo avviene perché, per questioni di ottimizzazione, lo spazio di swap viene gestito con un particolare file system dedicato gestito direttamente dal kernel. Il rischio maggiore si corre nel caso in cui il dispositivo fosse lasciato in ibernazione: in tale circostanza, il contenuto della RAM, prima che il dispositivo si spenga, è copiato nello spazio di swap e eCryptfs non ha modo di proteggerlo. 2.8.2 Funzionamento di eCryptfs Figura 10: Schema di utilizzo delle chiavi in eCryptfs 20 21 . Lo spazio di swap è una porzione di hard disk che funge da RAM virtuale, ed è utilizzato quando la memoria non è sufficiente a soddisfare le richieste dei processi in esecuzione. 21 Sorgente immagine: [33]. 34 Si illustra ora il funzionamento di eCryptfs, con riferimento alla Figura 10. Il sistema di gestione delle chiavi utilizzato in eCryptfs si ispira alle specifiche OpenPGP (RFC 2440). Ciò include la procedura di utilizzare una gerarchia di chiavi nell’eseguire operazioni crittografiche. Il contenuto di ogni file da proteggere è diviso in blocchi da 128 bit e cifrato con AES-128CBC tramite le Crypto API del kernel Linux. La chiave di cifratura prende il nome di File Encryption Key (FEC), ed è generata in modo casuale al momento della creazione del file. La FEC viene poi a sua volta cifrata con un’altra chiave, detta File Encryption Key Encryption Key (FEKEK), per ottenere la Encrypted File Encryption Key (EFEK). La EFEK viene infine memorizzata all’interno dell’header del file in questione. Resta da capire l’origine della FEKEK. Tale chiave nei dispositivi desktop è ottenuta direttamente dalla password di login. Nel caso di device mobile, possiamo pensare al login come allo sblocco del device22 . Al momento del login, alla password utilizzata viene aggiunto del sale e applicata ricorsivamente una funzione di hash (generalmente HMAC-SHA-512), il cui risultato è la FEKEK. A questo punto la FEKEK viene memorizzata nel kernel keyring fino al logout dell’utente23 . Ciò permette di evitare di eseguire più volte nel corso della stessa sessione l’algoritmo di hashing suddetto, il quale è volutamente “lento” (1000 o più iterazioni) al fine di contrastare attacchi di tipo brute-force. Si mostra ora come avviene l’accesso ad un file protetto da eCryptfs. Le applicazioni, eseguite nello userspace, fanno richieste di accesso a files tramite system calls al Virtual File System (VFS) del kernel. Sia eCryptfs, sia il file system a esso sottostante (ad esempio ext3, JFS, NFS ecc...) sono registrati nel VFS. Nel momento in cui è richiesto l’accesso a un file cifrato, eCryptfs recupera nel keyring del kernel la FEKEK, memorizzatavi al login. Questa chiave viene utilizzata per decifrare la EFEK letta dall’header del file richiesto. La FEK cosı̀ ottenuta viene memorizzata nei metadati di eCryptfs relativi al file in questione e utilizzata per decifrare il contenuto del file [34][35][33]. 2.9 Protezione dell’accesso Come ogni sistema operativo mobile, insieme alle protezioni di basso livello viste precedentemente, Ubuntu Touch offre la possibilità di proteggersi dal furto di dati bloccando il dispositivo con una password alfanumerica da 5 caratteri. La password non viene memorizzata in chiaro bensı̀ viene aggiunto del “sale” e il suo hash con MD5 è salvato in /etc/shadow. Per maggior sicurezza, sono eseguite 5000 iterazioni della funzione di hash. L’aggiunta di sale è utile ad esempio per difendersi contro attacchi di tipo dizionario. Il formato di salvataggio prevede una stringa con 3 campi separati dal carattere dollaro, ad esempio $1$jQdk4iTA$lanDFksSowpaElsSD, dove i campi sono: • algoritmo di hash utilizzato (1 significa MD5) • sale aggiunto alla password • hash di password + sale Secondo le nostre fonti, e a quanto risulta dal test sull’emulatore, non sembrano esistere altri sistemi di protezione. 22 Al momento non si hanno dettagli a come questo sarà gestito. È anche possibile che sarà considerato come login solo il primo accesso dopo l’avvio del dispositivo. 23 Anche qui, potrà essere lo sblocco o lo spegnimento del dispositivo. 35 2.10 Altri elementi di sicurezza 2.10.1 GSettings/dconf GSettings è uno strumento per memorizzare le impostazioni di configurazione delle applicazioni. Sfrutta dconf come back end plugin, con cui i processi comunicano tramite D-Bus per leggere e scrivere le impostazioni dal e sul database. Le applicazioni non confinate possono leggere e modificare impostazioni per le altre applicazioni. Ciò potrebbe voler dire, ad esempio, aggiungere plugin arbitrari che siano eseguiti al caricamento di un’altra applicazione. Anche solo avere l’accesso in lettura alle impostazioni delle altre applicazioni può esporre informazioni sensibili e causare problemi di privacy. Dalla versione 13.10 le App confinate non hanno accesso a GSettings. Nonostante si potrebbe utilizzare una protezione di tipo booleano per l’accesso, specificata tramite AppArmor, secondo gli sviluppatori non si avrebbe abbastanza sicurezza. In futuro, si legge nella documentazione, si potrà permettere alle applicazioni confinate di salvare le loro informazioni in GSettings, ma ciò richiederà una modifica di dconf, in modo tale che sia in grado di tener conto di quali impostazioni un’applicazione può andare a leggere. La mediazione di AppArmor sul D-Bus medierà la comunicazione tra le applicazioni confinate e il demone dconf. 2.10.2 Display manager Come descritto in 2.3.2, Ubuntu usa il server grafico Mir. Si elencano alcuni dei problemi di sicurezza che Mir, con l’aiuto delle policy di AppArmor, ha risolto rispetto al precedente X Server. • Keyboard and mouse sniffing: alle applicazioni eseguite sullo stesso X server era concesso eseguire operazioni di sniffing dei tasti premuti e eventi del mouse. Questo poteva permettere ad una applicazione di catturare i dati inseriti in altre applicazioni. • Screenshot: in X ogni applicazione poteva scattare screenshot anche quando in background. Ciò permetterebbe alle applicazioni di catturare dati sensibili mostrati in altre applicazioni. La progettazione di Mir previene queste azioni (una normale applicazione può solo fare lo screenshot del proprio contenuto). • XSettings: il protocollo XSettings fornisce un meccanismo per far condividere a diverse applicazioni le stesse impostazioni di interfaccia quali il timeout per il doppio click e i colori di interfaccia. Il Settings Manager usato in X mantiene una finestra unmapped (unica per tutti i processi) dove sono memorizzate tutte le impostazioni. Esistono toolkits, come GTK, che permettono il caricamento di moduli arbitrari specificati tramite XSettings. Ciò può infrangere i confini dell’applicazione. Il nuovo Mir è progettato contro il keyboard/mouse sniffing. Le applicazioni non hanno la possibilità di creare tastiere virtuali o sniffare tasti premuti durante l’esecuzione di altre applicazioni. Lo scatto di screenshot è proibito quando il focus è su un’altra applicazione. Clipboard, drag and drop e casi speciali come testiere on screen di terze parti sono gestiti attraverso meccanismi di sicurezza connessi con AppArmor. Questo permette a Mir di, ad esempio, chiedere ad AppArmor se un’applicazione può aver accesso alla clipboard. Le applicazioni in foreground, di default, hanno accesso alla clipboard di Mir, mentre questo è vietato ai processi non 36 user-facing24 . Mir non supporta XSettings a livello di applicazione. In altre parole è possibile accedere alle impostazioni tramite la shell, mentre le applicazioni non possono accedervi, modificarle, o impostare il caricamento di moduli esterni. 2.10.3 Environment variables Molte librerie consentono di avere comportamento diverso impostando alcune variabili d’ambiente prima di essere avviate. Ad esempio, GTK25 permette di specificare moduli arbitrari da essere caricati impostando la variabile di ambiente GTK MODULES. Per questo motivo, sarebbe meglio che le variabili d’ambiente fossero ispezionate prima dell’avvio di processi che devono essere eseguiti confinati, in quanto ciò potrebbe essere utilizzato per violare i confini. La soluzione adottata consiste nel cosiddetto Environment scrubbing, ovvero la rimozione di varie variabili d’ambiente considerate pericolose prima dell’avvio di un eseguibile confinato [36] [32]. 2.10.4 Segnali tra processi Nelle versioni precedenti a Ubuntu 14.04 LTS ogni applicazione poteva inviare un segnale ad ogni altra applicazione in esecuzione, come il segnale TERM che causa la terminazione di un processo. Attualmente, come visto nell’esempio in 2.5.3, il profilo AppArmor deve poter specificare quali segnali un’applicazione confinata può inviare agli altri processi. 2.10.5 Protezione da remoto A differenza di Android e iOS, Ubuntu Touch non ha a disposizione un sistema di protezione da remoto built-in che consenta di bloccare il dispositivo, localizzarlo o cancellarne i dati. Attualmente è possibile avere questa funzionalità con applicazioni di terze parti come Prey [37]. Tuttavia, l’efficacia di una soluzione basata solo su software è molto discutibile nel nostro caso. È vero che il sistema può supportare applicazioni preinstallate che non possono essere rimosse dall’utente, tuttavia, se si collega il dispositivo a un computer via USB e si utilizzano gli strumenti di sviluppo di Android, il device può ad ogni modo essere totalmente resettato. Al momento, dunque, sembra non esserci soluzione lato sistema operativo. Ogni tipo di supporto anti ladro deve essere implementato a basso livello dai produttori dell’hardware. 2.10.6 Certificati Ubuntu Touch memorizza i certificati all’interno di file situati nella cartella /usr/share/cacertificates. L’estensione di questi file è .crt, e il formati dei certificati è PEM. Per ragioni di sicurezza, a differenza della versione desktop, questa cartella è di sola lettura, dunque non è possibile installare manualmente certificati auto firmati. 24 Processi non al momento visualizzati a schermo GTK+, detto anche GIMP Toolkit, è un toolkit multi piattaforma per la creazione di interfacce utente grafiche. 25 37 2.11 Vulnerabilità note Per Ubuntu Touch si utilizza lo stesso database di CVE utilizzato per Ubuntu. Tale database mostra le diverse vulnerabilità note, specificandone i livelli di criticità e il package corrispondente. È inoltre possibile visualizzare come il livello di criticità sia differente nelle diverse versioni di Ubuntu. Il database è accessibile all’indirizzo: http://people.canonical.com/~ubuntusecurity/cve/. 2.12 Conclusioni Sebbene possa apparire come un semplice nuovo sistema operativo mobile dall’interfaccia stile Ubuntu, si è visto come in realtà Ubuntu Touch nasconda una grande innovazione. L’intento di realizzare una soluzione software congiunta in grado di adattarsi contemporaneamente a smartphone, tablet e desktop ha portato con se la necessità di sviluppare un modello di sicurezza adatto a tale contesto. Con più di 15 anni di storia alle spalle, AppArmor rappresenta uno strumento che ha maturato l’esperienza necessaria per farsi carico di buona parte di questo difficile compito. Si è visto come il suo funzionamento si basi sulla prevenzione, e non richieda un continuo processo di scanning del sistema che minerebbe l’autonomia del dispositivo. La definizione del confinamento di un’applicazione, già più semplice in AppArmor rispetto a altre soluzioni quali SeLinux, è stata ulteriormente semplificata con i Policy Groups. Affiancando a ciò un potente SDK, si è riusciti a rendere questo strumento immediatamente accessibile ai nuovi sviluppatori. Dal punto di vista dell’utente, i Trusted Helpers forniscono, tramite messaggi di avviso come Consentire all’applicazione di accedere alla fotocamera?, massima trasparenza sui permessi concessi a un’applicazione. Essi permettono inoltre di revocare le autorizzazioni in un secondo momento, opzione non presente in un diffuso sistema come Android. Il sistema semi automatizzato di revisione delle nuove App consente tempi brevissimi di pubblicazione di nuovo software e può essere utile per portare sui device aggiornamenti di sicurezza delle applicazioni in breve termine. Per essere approvate in automatico, le App devono rispecchiare requisiti di sicurezza molto restrittivi che ne assicurano l’innocuità nei confronti del sistema: nel caso peggiore, il confinamento garantisce che i danni di un attacco siano limitati al campo di azione della App stessa. Condividendo con Ubuntu Desktop l’architettura generale, il sistema può beneficiare dei suoi aggiornamenti di sicurezza. Infine, trattandosi di un sistema open source, vanta la possibilità di beneficiare del contributo di una vastissima community, importante mezzo per la scoperta e correzione di falle di sicurezza. Si conclude l’analisi con alcune osservazioni critiche. • In quanto nuovo sistema operativo in un mercato governato dai colossi Android e iOS, uno degli obiettivi primari dello sviluppo di Ubuntu Touch è incentivare lo sviluppo di applicazioni, e il modo migliore per riuscirci è renderlo il più semplice possibile. Questo giustifica l’uso dei Policy Groups nei Click packages. Tuttavia, non poter specificare manualmente un profilo AppArmor per i Click package potrebbe essere in futuro una limitazione. Al momento, infatti, tutti i permessi AppArmor richiesti da un’applicazione devono avere un corrispondente in un Policy Group. Tale modello potrebbe collassare di fronte alla 38 necessità di avere un modello di sicurezza più complesso che permetta di definire il confinamento con più dettaglio. Naturalmente, si perderebbe il vantaggio di una revisione automatica dell’applicazione da parte dello store. Per questo, una soluzione potrebbe essere concedere la possibilità allo sviluppatore di definire profili AppArmor manuali per i propri Click package a patto che essi siano revisionati manualmente, eventualmente sotto pagamento di una commissione. • Al momento il confinamento delle applicazioni è fatto su due livelli: AppArmor e Trusted Helper. Nel momento in cui un Trusted Helper memorizza un certo permesso concesso dall’utente, l’applicazione in questione può accedere (da lı̀ in avanti) a una determinata risorsa prima proibita. In tutto ciò, il profilo AppArmor è rimasto invariato. Esso semplicemente dichiara la possibilità per quell’applicazione di comunicare con lo specifico Trusted Helper, ma non contiene informazioni riguardo la scelta dell’utente. Questo meccanismo fa si che il profilo AppArmor non sia sufficiente per determinare i privilegi di un’applicazione. Sarebbe meglio che tali informazioni fossero concentrate in un unico punto. Ad esempio si potrebbe estendere AppArmor al fine di memorizzare in un profilo anche le definitive autorizzazioni concesse dell’utente. In tal caso dovrebbe essere capace di modificare dinamicamente il profilo in funzione di esse. • Al fine di non impattare l’autonomia del dispositivo, non è presente un sistema di monitoring costante delle risorse utilizzate dai processi. Inoltre, condividendo l’architettura con Ubuntu desktop, non si ha ancora un sistema di gestione ottimizzata dei processi in background: in altre parole, come su Ubuntu Desktop, è concessa l’esecuzione in background senza limitazione di risorse. In questo modo un’applicazione intenzionata a saturare le risorse del dispositivo in termini di CPU o a scaricare la batteria, potrebbe superare automaticamente i controlli di sicurezza dello store e portare a termine il suo scopo. 39 3 CyanogenMod Figura 11: Schermata di home di CyanogenMod 3.1 26 . Modalità dell’analisi di sicurezza In questo capitolo verranno analizzati alcuni aspetti di sicurezza di CyanogenMod. Si tratta di una Mod di Android, il diffuso sistema operativo di Google. Il termine “Mod” significa che si tratta di una nuova versione dello stesso software, con alcune modifiche che permettono maggiore personalizzazione e funzionalità aggiuntive. Per questo motivo, saranno analizzati in particolare gli aspetti che lo distinguono da Android e che si trovano principalmente a livello di applicazione. Si è deciso di non analizzare la sicurezza di basso livello in quanto essa coincide con quella di Android ed esula pertanto dagli scopi di questo report. Le informazioni qui riportate provengono in gran parte da ricerche online anche al di fuori della Wiki ufficiale. CyanogenMod conta molto sull’informazione generata e trasportata dalla community, pertanto la documentazione “ufficiale” è molto scarsa. Al fine di accertare le informazioni trovate, sono state effettuate prove manuali su dispositivi reali. 26 Sorgente immagine: cyanogenmod-12/. http://crysweb.altervista.org/2015/02/19/android-lollipop-su-oneplus-one-con- 40 3.2 Introduzione 3.2.1 Storia Poco dopo il rilascio del telefono cellulare HTC Dream (conosciuto come “T Mobile G1” negli Stati Uniti) nel settembre 2008, fu scoperto un sistema per ottenere un controllo di amministrazione (conosciuto come “accesso root”) al sistema Linux sul quale si basa Android. Avere l’accesso root, combinato alla natura open source del sistema operativo Android, ha permesso al firmware originale del telefono di essere modificato e re-installato sul telefono stesso. Negli anni successivi molti firmware modificati furono sviluppati e distribuiti da appassionati di Android. Uno, mantenuto da uno sviluppatore chiamato JesusFreke, presto diventò popolare tra i possessori del Dream. Nell’agosto 2009 JesusFreke smise di lavorare al suo firmware e suggerı̀ agli utenti di passare a una versione della sua ROM che era stata ulteriormente migliorata dallo sviluppatore Cyanogen (Steve Kondik), chiamata “CyanogenMod”. La popolarità di CyanogenMod crebbe rapidamente e una piccola comunità di sviluppatori, conosciuta come CyanogenMod Team, contribuı̀ al progetto. Nel giro di pochi mesi il numero di dispositivi e di funzionalità supportate da CyanogenMod aumentò e CyanogenMod diventò in poco tempo una delle distribuzioni di firmware Android più popolari [38]. 3.2.2 Differenze con Android CyanogenMod offre caratteristiche e opzioni non disponibili nel firmware ufficiale distribuito dai vendor di questi devices, come nuovi temi grafici, il supporto per codec audio FLAC27 , CPU overclocking, gestione dei permessi delle app, un client OpenVPN, root access ed altri ancora. Se queste caratteristiche fanno pensare semplicemente a un sistema operativo che offre all’utente più funzioni e maggiore personalizzazione, si sottolinea anche che la progettazione di CyanogenMod è volta a migliorare le performance, affidabilità e sicurezza dei dispositivi. Come vedremo successivamente, queste caratteristiche positive portano con sé un rovescio della medaglia. Fornire maggiori funzionalità all’utente significa anche dargli maggiori permessi e, potremmo dire, maggior fiducia. Un utente inesperto potrebbe inconsciamente minare la sicurezza del proprio dispositivo, molto più facilmente che su sistemi più “chiusi” quali ad esempio iOS [39]. 3.2.3 Distribuzione Secondo le nostre informazioni, al momento CM è distribuito come sistema operativo nativo solo sullo smartphone OnePlus One. Per gli altri dispositivi, è da intendersi come un sistema operativo installabile in sostituzione di quello già presente. Il 6 Gennaio 2015 è stata rilasciata l’ultima versione: CyanogenMod 12. Il firmware è rilasciato in diverse varianti: Stable, Release Candidate e Nightlies. La versione Stable, come lo stesso nome suggerisce, è quella maggiormente testata, conforme agli standard (informali) di sicurezza e stabilità che la comunità degli sviluppatori si impone. Release Candidate è la fase subito precedente alla Stable: si tratta di una versione che non presenta bug o vulnerabilità fatali, ma che non è ancora stata testata completamente. Infine, le Nightlies sono piccoli aggiornamenti molto poco testati, rilasciati a distanza di poche ore l’uno dall’altro, e per questo motivo sconsigliati all’utente medio [40]. 27 Free Lossless Audio Codec è un formato di codifica audio che non comprime l’audio digitale. 41 3.2.4 Device Rooted Il termine root indica il processo di acquisizione dei diritti di superuser all’interno di un sistema Linux o suo derivato, come Android. Il superuser possiede privilegi di amministratore, pertanto è in grado di accedere ad ogni dato all’interno del sistema e di eseguire operazioni potenzialmente pericolose per la stabilità e sicurezza del sistema stesso. I sistemi Linux desktop permettono di ottenere privilegi di amministratore semplicemente attraverso la shell. La maggior parte dei sistemi operativi mobili Linux-based, essendo progettati per un’ampia utenza di competenza medio-bassa e facendosi carico delle problematiche di sicurezza trattate nell’introduzione di questo report, adottano invece una strategia più restrittiva, in cui all’utente sono fortemente limitate operazioni sensibili sul sistema. Il root (o rooting) viene spesse eseguito con lo scopo di superare queste limitazioni, imposte generalmente dagli operatori telefonici o dal produttore dell’hardware. Il rooting da l’abilità (o il permesso) di modificare o sostituire applicazioni preinstallate e impostazioni di sistema, avviare particolari applicazioni che richiedono permessi di amministratore, avere accesso di basso livello all’hardware, o eseguire altre operazioni che sono di norma inaccessibili a un normale utente Android [41]. Come ogni Mod che si rispetti, e al fine di rendere possibili molte delle caratteristiche vantaggiose che lo contraddistinguono dallo standard Android, CyanogenMod è in grado di fornire all’utente e alle applicazioni privilegi di amministratore (privilegi di root). Come già accennato, ai vantaggi suddetti si affiancano diversi svantaggi: ottenere accesso root significa anche poter aggirare le restrizioni di sicurezza standard del sistema operativo. Il che significa che worms, virus, spyware e trojan possono infettare il dispositivo, se non è protetto in altro modo (lo vedremo nella sezione 3.3.3). Ci sono diversi modi tramite cui questi malware possono infettare il proprio telefono o tablet: web downloads, link malevoli, applicazioni infette scaricate da altri app store. Software malevolo eseguito con privilegi di amministratore può avere accesso ad ogni dato contenuto nel dispositivo. 3.3 3.3.1 Tecniche di confinamento delle applicazioni Il modello Android Il modello di sicurezza di CyanogenMod realizza il confinamento delle applicazioni allo stesso modo di Android, riutilizzando il sistema nativo del Linux Kernel di gestione dei permessi utente. Nei sistemi Linux desktop, ad ogni utente è associato un identificativo univoco (UID - User Id) che è poi utilizzato per specificare i permessi di accesso a file e cartelle: ogni file e cartella contiene una lista di UID, e per ognuno dei quali sono indicati i permessi (Lettura, Scrittura, Esecuzione). Android riutilizza questo sistema considerando le applicazioni come utenti e assegnando a ognuna di esse un diverso UID. In questo modo, ogni applicazione può accedere solamente ai file di sua proprietà, o eventualmente alle risorse di altre applicazioni per cui è stato esplicitamente consentito l’accesso. Come già detto, poiché l’analisi di Android esula dagli scopi di questo report, non si scende nei dettagli implementativi di questa soluzione. Per una discussione più approfondita si rimanda a [42]. L’autorizzazione ad utilizzare risorse quali GPS, Fotocamera, Contatti, Risorse ecc... viene richiesta al momento dell’installazione: l’utente può visualizzare l’elenco dei privilegi richiesti e decidere se accettarli e proseguire con l’installazione, oppure rifiutarli e annullare. Android non presenta ad oggi una soluzione per concedere all’utente di personalizzare i permessi di una applicazione o rimuovere specifici privilegi concessi al momento dell’installazione. 42 Figura 12: Schermata di esempio di Privacy Guard 3.3.2 28 . Gestione dei permessi CyanogenMod, pur condividendo con Android la soluzione basata sugli UID per il confinamento delle applicazioni, offre una funzione in grado di permettere all’utente di revocare selettivamente ad una applicazione i permessi concessi al momento dell’installazione. Tale funzione è realizzata tramite l’applicazione built-in Privacy Guard. Privacy Guard è presente in CM a partire dalla versione 10 e, oltre a quanto detto, consente anche di selezionare quali applicazioni debbano essere avviate automaticamente al bootup del dispositivo. È stata realizzata con l’intento di portare la gestione della privacy anche nelle mani dei meno esperti, pertanto, oltre ad un menù avanzato per ogni applicazione, fornisce anche la possibilità di semplicemente attivare o disattivare il profilo Privacy Guard per una specifica App, impostando un profilo di sicurezza di default [43]. Privacy Guard è stato realizzato sulla base di App Ops. App Ops era una funzionalità già presente in versioni precedenti e nascosta, scoperta per la prima volta in Android 4.3. Il suo scopo era quello di permettere agli utenti di disabilitare specifici permessi alle applicazioni dopo l’installazione. In realtà App Ops non fu mai pensato come uno strumento per gli utenti, ma solo per scopi di debugging [44]. È stato rimosso nelle build di Android successive alla 4.3. Privacy Guard è ora l’“App Ops” di CyanogenMod a partire dalla versione 10 [45]. Non è da escludere che gli sviluppatori di CM possano aver riutilizzato parte del codice della vecchia App Ops di Google, forse avendone anche a disposizione il sorgente intero. CyanogenMod ha dunque integrato App Ops in modo che gli utenti possano individualmente impostare su on o off i permessi per la localizzazione, la lettura dei contatti e dei log delle chiamate, la lettura del calendario, permessi su SMS/MMS ecc... per ciascuna app installata. È stata aggiunta anche la possibilità di ricevere notifiche nel momento in cui una App tenta di accedere ad una risorsa bloccata. L’ultimo accesso consentito viene memorizzato e può essere visualizzato. Poiché la rimozione dei permessi ad una applicazione non è normalmente possibile, tale operazione potrebbe minare la stabilità dell’applicazione interessata. 28 Sorgente immagine: with-cm10-2-20130925/. http://androidcommunity.com/cyanogenmod-privacy-guard-updated-and-merged- 43 3.3.3 Gestione privilegi di root In passato, per poter utilizzare CyanogenMod, era necessario provvedere manualmente alla sua installazione su un dispositivo supportato, al posto del precedente sistema operativo Android. Eseguire questa operazione richiedeva competenze non comuni e rappresentava pertanto una difficoltà in grado di selezionare l’utenza di CM. A seguito di ciò, CM era utilizzato prevalentemente da individui mediamente coscienti dei rischi legati alle nuove potenzialità fornite dal sistema operativo e, in generale, all’uso di un device rooted. Ad oggi, invece, eseguire il rooting è molto più semplice, grazie all’uso di tool appositi e ad una vastissima documentazione in rete. Ciò ha reso questa Mod di Android alla portata di una gamma di utenti sempre più vasta. Inoltre, come già accennato in precedenza, proprio in questi mesi si sta assistendo all’arrivo sul mercato dei primi dispositivi venduti con CM già installato. Ciò fa capire come CM non sia più considerabile un sistema operativo di nicchia, riservato ad un’utenza mediamente competente, bensı̀ lo si trova nelle mani di chi, incosciente dei rischi di sicurezza associati, lo vuole sfruttare per provare funzionalità normalmente vietate. Per queste ragioni, la 11 è l’ultima versione di CM ad essere rooted di default. In CM11 in teoria tutte le applicazioni possono eseguire operazioni con privilegi di root. In pratica, la sicurezza viene implementata a livello di applicazione: applicazioni di terze parti, tra le quali spicca Superuser, si occupano di permettere all’utente di gestire quali applicazioni possano ottenere i privilegi di amministratore. A partire da CM12, invece, di default il device non è rooted. L’arricchimento delle API fornite dal sistema operativo rispetto ad Android è in grado di permettere a molte applicazioni di fornire nuove funzionalità pur non avendo bisogno dei privilegi di root [46]. Tuttavia, in CM12 è comunque possibile abilitare il root del dispositivo. È curioso notare come, al fine di evitare che un utente attivi inconsciamente il root, tale opzione sia stata nascosta: è necessario recarsi in “Settings”-¿“About phone” e toccare “Build number” più volte29 . Il root può essere attivato in 3 modalità distinte: • Solo per le App; • Solo per l’ADB30 ; • Per entrambi. Una volta che il root per le App è attivato, all’interno delle impostazioni di Privacy Guard per ciascuna applicazione, apparirà una nuova opzione che, come Superuser in CM11, permetterà di dare singolarmente a ciascuna applicazione il permesso di eseguire azioni con privilegi di root. Privacy Guard è in grado di intercettare le richieste delle applicazioni di eseguire il comando su, che permette di elevare i propri privilegi a quelli di superutente, ovvero amministratore, e di dare all’utente, tramite la visualizzazione di un messaggio, la possibilità di autorizzare o meno l’operazione. Per vedere questo meccanismo più nel dettaglio, si consideri il caso di un’applicazione che esegue la seguente riga di codice: Process p = Runtime.getRuntime().exec(‘‘su’’); 29 Le ragioni di questa scelta risiedono con ogni probabilità nel fatto che per scoprire tale funzionalità è necessaria una ricerca in rete, che presume un minimo livello di informazione al riguardo 30 Android Debug Bridge, è uno strumento a riga di comando per sistemi desktop che permette di comunicare con un dispositivo android connesso. 44 Tale riga causa la pubblicazione di un Intent 31 , all’interno del gestore dei messaggi di Android, che richiede a Privacy Guard di confermare o meno l’operazione. La scelta dell’utente viene salvata per i futuri utilizzi e resta modificabile attraverso il pannello di controllo di Privacy Guard. 3.4 Store Poiché CyanogenMod sfrutta lo stesso App store di Android, Google Play, non tratteremo in dettaglio le sue caratteristiche di sicurezza. Google Play prevede che le applicazioni siano firmate dagli sviluppatori e sottoposte a un processo di revisione in parte manuale e in parte automatico. È importante sottolineare che, nel caso di CyanogenMod, la sicurezza a livello di store non ha grande effetto sulla sicurezza finale del dispositivo. Infatti, una delle funzionalità più utilizzate degli utilizzatori di questo sistema operativo è la possibilità di installare applicazioni da fonti diverse dallo store “ufficiale”. Tali applicazioni spesso richiedono privilegi speciali (di root) per fornire quelle funzionalità aggiuntive che l’utente medio di CyanogenMod desidera. Del resto, come detto nell’introduzione, questo è il concetto base attorno a cui ruota questo sistema operativo. Per questo motivo, la sicurezza è molto più nelle mani dell’utente, che deve gestire manualmente privilegi speciali, piuttosto che nei meccanismi attuati a livello di store. 3.5 3.5.1 Componenti di sicurezza aggiuntivi Whisperpush Gli sviluppatori di CyanogenMod hanno lavorato per lungo tempo all’integrazione nel proprio firmware di un servizio di messaggistica sicura, fino a riuscire ad introdurlo per la prima volta ufficialmente in CM11. Si chiama Whisperpush e si basa su TextSecure, un client open-source cross-platform (iOS e Android) che cifra gli SMS sia localmente che durante l’invio ad altri utenti TextSecure. Questa funzionalità, sul modello di iMessage utilizzato nei sistemi iOS, una volta abilitata è totalmente trasparente all’utente. Nel momento in cui si invia un messaggio attraverso l’applicazione nativa per gli SMS, il sistema controlla se il destinatario possiede un client TextSecure (sia esso un dispositivo Android o iOS) e, in caso affermativo, provvede alla cifratura del messaggio e al suo invio attraverso il canale dati, altrimenti esso viene inviato come normale SMS. Il dispositivo che riceve il messaggio cifrato provvederà alla sua decifratura e a mostrarlo all’interno dell’applicazione nativa per gli SMS. Tutto ciò è totalmente nascosto all’utente, a cui non è richiesto di eseguire uno scambio di chiavi, o di sapere che il ricevente è “online”. Il protocollo TextSecure nasce come una modifica del protocollo OTR (off the record messaging protocol), che usa chiavi effimere concordate tramite l’algoritmo Diffie-Hellman a curva ellittica. L’utilizzo di chiavi effimere è utile perché usare sempre la stessa chiave pubblica può nel tempo aumenta la probabilità che sia scoperta. In tal caso, sarebbe inoltre possibile decifrare tutti i messaggi inviati precedentemente con chiunque. La modifica del protocollo OTR è stata necessaria per adattarlo ad un ambiente mobile, dove fattori come lo stato della rete e i vincoli legati al risparmio energetico richiedono che la messaggistica sia di natura asincrona. In sostanza si è dovuto gestire il caso in cui la controparte non sia al momento raggiungibile (vuoi perché non ci sia copertura di rete o perché il sistema operativo non gli permetta di essere eseguita in 31 Un Intent è un oggetto di messaggistica che può essere utilizzato per richiedere un’azione a un’altra applicazione. 45 background). Poiché Diffie-Hellman richiede ovviamente uno scambio di messaggi, per adattarlo a questo contesto asincrono è stata utilizzata la soluzione che è descritta di seguito. Dettagli del funzionamento del protocollo TextSecure: 1. Alla prima connessione al server, un client TextSecure, che si vuole chiamare A, genera preventivamente 100 messaggi per lo scambio chiavi Diffie-Hellman e li invia al server. Si chiamino questi “premessaggi”. La curva ellittica utilizzata è Curve25519. 2. Un nuovo client B, che vuole inviare ad A un messaggio sicuro, può ora connettersi al server e eseguire l’algoritmo Diffie-Hellman scaricando da esso i premessaggi inviati da A. 3. In questo modo B ottiene il segreto condiviso e lo può utilizzare per inviare al server il messaggio cifrato, insieme ai propri messaggi per il key agreement. I messaggi sono cifrati utilizzando un cifrario AES in modalità CTR, con una chiave a 256 bit. Il server, non essendo a conoscenza del segreto di A utilizzato per generare i premessaggi, non è in grado di decifrare il messaggio. 4. Nel momento in cui A si collegherà al server potrà scaricare il messaggio cifrato di B e, avendo mantenuto in memoria i premessaggi inviati al server, ricavare la chiave condivisa. 3.5.2 Protezione da remoto: Device Finder Da qualche anno, Google ha introdotto per i dispositivi Android il servizio “Android Device Manager”. Si tratta di un servizio online che da la possibilità agli utenti di eseguire da remoto operazioni sul proprio device, principalmente a scopi di sicurezza. È possibile ad esempio bloccare il proprio device con una nuova password, oppure eseguirne il wipe, ovvero la cancellazione di tutti i dati contenuti. Android device Manager consente inoltre di rintracciare il proprio dispositivo, se dotato di GPS. Gli sviluppatori di CyanogenMod hanno risposto alla soluzioni di Google con “Device Finder”. Dal punto di vista delle funzionalità offerte si tratta di un servizio del tutto simile all’Android Device Manager, ma che presenta grandi differenze nella sua implementazione, volte a garantire massima sicurezza e riservatezza agli utenti [47]. Quando si utilizza Android Device Manager per rintracciare il proprio dispositivo, è necessario autenticarsi utilizzando il proprio Account Google su un’apposita pagina web (www.google. com/android/devicemanager). Da questo, si invia al server Google la richiesta di interrogare il proprio smartphone riguardo la propria posizione. Il server Google rintraccia il dispositivo grazie a un servizio, Google Play Services, che opera silenziosamente su di esso. Il nostro device Android è progettato per fidarsi del server Google, pertanto risponde inviando la propria posizione. Infine, il server Google passa questa posizione al nostro browser, dove è possibile visualizzarla. Come si può notare, il server Google agisce da intermediario. Esso vede le informazioni trasmesse in chiaro. Teoricamente potrebbe personificare una persona e chiedere al nostro device la sua posizione in qualsiasi momento lo desideri. Potrebbe essere che qualcuno al di fuori del proprietario utilizzi il server Google per avere la nostra posizione, magari in seguito ad accordi commerciali. Ovviamente è noto che Google promette di non rivelare le nostre informazioni, ma in questo modo la nostra sicurezza consiste appunto nel fidarsi di Google, e non nell’implementazione del sistema stesso [48]. Il servizio CyanogenMod Device Finder disponibile all’interno di CyanogenMod Accounts crea invece un canale di comunicazione sicuro tra il browser e il dispositivo, in cui il server svolge solo 46 Figura 13: Confronto tra il reperimento della localizzazione del dispositivo tramite l’Android Device Manager o CyanogenMod Device Finder. In rosso si hanno le comunicazioni cifrate con la chiave simmetrica scambiata. il ruolo di intermediario, incapace di leggere il contenuto delle informazioni sensibili trasmesse. SI analizza nel dettaglio. 1. L’utente si autentica su account.cyanogenmod.org attraverso connessione sicura HTTPS, utilizzando la propria password. La password in chiaro non viene inviata al server, ne viene inviata una sua derivata. 2. Nel momento in cui viene richiesta la posizione del device, il browser genera una coppia chiave pubblica/privata, esegue l’HMAC della pubblica utilizzando la password dell’utente (non nota al server), e invia al server la chiave pubblica insieme all’hash calcolato. 3. Il server riceve questo messaggio e lo ritrasmette al device. 4. Il device, conoscendo la password dell’utente (impostata in precedenza), autentica il messaggio contenente la chiave pubblica, genera una chiave simmetrica e la manda al server, cifrata tramite la chiave pubblica appena ricevuta. 5. Il server trasmette il messaggio al nostro browser. Il server non è in grado di leggere la chiave simmetrica contenuta all’interno del messaggio cifrato in quanto non è in possesso della chiave privata per decifrarlo. 6. Il nostro browser, che invece conosce la chiave privata ottenuta nel passaggio 2, decifra il messaggio e ottiene la chiave simmetrica. 7. Da questo momento in avanti, browser e device possono comunicare attraverso un canale sicuro protetto con tale chiave asimmetrica. Il server farà sempre da intermediario, ma non potrà decifrare i contenuti in transito. La sicurezza di questo sistema consiste nella sua implementazione, non nella fiducia verso qualcuno o qualcosa. Quando il nostro dispositivo invia la propria posizione, nessun agente nel mezzo può leggerla. Nessuno può iniziare il rintracciamento se non il proprietario. Nessuno 47 può pagare o accordarsi con gli operatori del server affinché rintraccino il dispositivo senza il nostro consenso. Si ricorda che aziende come Google e Apple, se da una parte vogliono vendere i propri prodotti come sicuri per attirare gli utenti, dall’altra hanno interessi a non proteggere la loro privacy. Questo tipo di interesse non è invece riscontrabile in CyanogenMod, non essendo un prodotto a scopo di lucro. 3.6 Cifratura dati utente La cifratura è utilizzata per garantire la riservatezza dei dati memorizzati su un dispositivo in caso della perdita o furto dello stesso. In CyanogenogenMod, le possibilità di cifratura offerte sono ereditate da Android. In questo, la cifratura per proteggere i dati è disponibile soltanto dalla versione 3.0 (Honeycomb) in su. Per abilitare la cifratura su un dispositivo Android il filesystem deve essere montato su un dispositivo che presenta un interfaccia block device32 . La cifratura è effettuata con dm-crypt e, sebbene si parli di disk encryption, in realtà non è eseguita sull’intero disco (in quanto renderebbe impossibile il boot) ma solo sulla cartella data, contenente tutti i dati utente e delle applicazioni. Dm-crypt è un sistema per la crittografia dei dati utilizzato nel Kernel linux a partire dalla versione 2.6. Esso è parte dell’infrastruttura “device mapper”, ovvero quella che si occupa della mappatura dei dati tra unità virtuali di archiviazione di massa (come viste e utilizzate dalle applicazioni) e effettivo hard disk fisico. La crittografia dei dati avviene in modo trasparente al resto del sistema proprio nel corso di questa mappatura [50]. Una volta che il disco è cifrato, ogni dato creato dalle applicazioni viene automaticamente cifrato prima che sia scritto su di esso e tutti i dati letti da disco sono automaticamente decifrati prima di essere ritornati al processo che li richiede. Dm-crypt utilizza AES-128 con CBC e ESSIV SHA 256 33 . La chiave di cifratura è memorizzata sul disco in modo sicuro secondo un processo che coinvolge sia la password dell’utente sia una chiave memorizzata in hardware nel dispositivo (hardware-bound private key, HBK)34 . Si mostra tale processo nel dettaglio: 1. In modo casuale viene generata una disk encryption key (DEK) di 128 bit e un sale della stessa lunghezza. Questa prima fase è eseguita solo la prima volta che si attiva la cifratura del disco. 2. Si applica scrypt 35 alla password dell’utente e al sale della fase precedente per produrre una chiave intermedia IK1 di 256 bit. 32 Un dispositivo a blocchi (in lingua inglese block device), nei sistemi operativi Unix e Unix-like, è un dispositivo su cui è possibile effettuare operazioni di input/output per blocchi di byte di dimensione predeterminata (tipicamente dispositivi di memoria di massa come i dischi rigidi).[49] 33 ESSIV è un metodo per generare vettori di inizializzazione per cifratura a blocchi utilizzata nella cifratura di dischi di memoria. ESSIV genera i vettori di inizializzazione da una combinazione del numero di settore del disco da cifrare e l’hash della chiave di cifratura [51]. 34 Parliamo di una TEE key. TEE è acronimo di Trusted Execution Environment ed è una area sicura del processore di un dispositivo che fornisce funzionalità di sicurezza 35 Scrypt è una key derivation function. Come PBKDF2, già vista in 2.8, serve per derivare un segreto, nel nostro caso IK1 e IK3, a partire da un altro segreto, nel nostro caso la password dell’utente e IK2. A differenza di PBKDF2, scrypt è più sicura contro attacchi brute-force implementati in hardware. 48 3. A IK1 viene aggiunto del padding per portarlo alla lunghezza della HBK citata precedentemente. 4. Il risultato dell’operazione precedente è firmato utilizzando HBK per produrre IK2, di 256 byte. 5. Si applica nuovamente scrypt a IK2 utilizzando lo stessso sale della fase 2 per produrre IK3, di 256 bit. 6. I primi 128 bit di IK3 sono utilizzati come KEK (key encryption key) e gli ultimi 128 come vettore di inizializzazione IV. 7. DEK viene cifrata utilizzando AES CBC con chiave KEK e vettore di inizializzazione IV. Si noti che l’utilizzo di HBK, introdotto solo dalla versione 5 di Android, aggiunge ulteriore protezione contro attacchi “off the box” in cui l’hard disk è estratto dal dispositivo. Il lettore potrebbe chiedersi perché la DEK sia generata in modo casuale invece che direttamente derivata dalla password utente. La risposta risiede nel fatto che se cosı̀ fosse fatto, cambiare la password utente richiederebbe di decifrare e ricifrare con la nuova DEK corrispondente tutti i dati già cifrati. Nel modo sopra illustrato, al contrario, è sufficiente decifrare la DEK e ricifrarla con la nuova KEK [52]. 3.7 Protezione dell’accesso Figura 14: Esempio di Lock Pattern 36 . Il controllo di accesso tradizionale consiste in una sistema di sicurezza che consente l’accesso al dispositivo solo a chi conosce un segreto preimpostato. Tale segreto, richiesto per sbloccare il dispositivo dalla condizione di standby, può essere in forma di: 36 Sorgente immagine http://automagic4android.com/. 49 • Lock Pattern. Si tratta di uno specifico percorso su una griglia di punti 3 X 337 . Lo svantaggio è che se il display trattiene facilmente le impronte lasciate dalle dita, potrebbe essere facile recuperare il percorso. Si consigliano pertanto percorsi non troppo semplici. È mostrato in Figura 14. • Codice PIN. È una sequenza di cifre. Il numero di cifre va da 4 a 17. • Password alfanumerica. È la password classica alfanumerica. È sicuramente il sistema più sicuro, ma richiede generalmente più tempo per l’inserimento. 3.8 Conclusioni In origine, CyanogenMod rappresentava un sistema operativo accessibile ad un’utenza relativamente esperta. Ciò ha permesso per anni di trascurare alcune problematiche di sicurezza, secondo un modello di fiducia verso l’utente. Indubbiamente si trattava di un sistema più pericoloso (si pensi al root abilitato di default), ma ciò era in un certo senso il prezzo da pagare per poter usufruire di certe potenzialità. La sua recente crescente diffusione, unita a un diffuso innalzamento degli standard di sicurezza richiesti dal mercato, hanno portato gli sviluppatori ad ideare una soluzione in grado al contempo di soddisfare la necessità di un sistema sicuro e le richieste di quella grossa fetta di utenza amante del root. L’integrazione di superuser all’interno di Privacy Guard, insieme ad un’impostazione di default che disabilita il root, rendono il sistema operativo utilizzabile in modo sicuro anche dai meno esperti. Il sistema messo in pratica da Privacy Guard era divenuto particolarmente necessario da quando, sapendo dell’incoscienza dell’utente medio nell’installare applicazioni non fidate, tra gli sviluppatori è diventato di uso comune richiedere per la propria app un lungo elenco di autorizzazioni. si trova infatti oggi sul Google Play Store applicazioni come la torcia, che richiedono il permesso di accedere ai nostri contatti o al profilo Facebook, e ciò non sembra importare molto agli utenti. Ciò fa riflettere su quanto sia importante l’educazione del pubblico alla sicurezza e su quanto ci sia ancora molto da fare. Nel complesso, è possibile notare un grande passo avanti rispetto ad Android: la possibilità di gestire in modo semplice ed intuitivo le singole risorse a cui le applicazioni possono accedere è una pietra miliare nel cammino verso un sistema sempre più attento alla privacy degli utenti. Purtroppo, poiché le applicazioni scaricabili su un dispositivo CyanogenMod sono le stesse sviluppate per Android, esse non prevedono che i permessi possano essere revocati. In tal caso, la stabilità dell’App è fortemente compromessa. È importante sottolineare che l’intero codice di CyanogenMod è Open Source, scaricabile e compilabile. Nonostante i più non abbiano le competenze per comprenderlo, ciò è un aspetto importantissimo in termini di sicurezza. Avere accesso al codice consente alla comunità di sviluppatori di setacciarlo alla ricerca di problemi da risolvere. Qualcuno potrebbe obiettare che il codice open source è un’arma a doppio taglio: di fatto è vero, trovare falle di sicurezza potrebbe anche consentire ad un attaccante di sfruttarle per scopi maligni. Tuttavia, si ricorda che il codice dei nuovi moduli viene pubblicato nelle nightly build ben prima che sia inserito all’interno delle stable release. In questo lasso di tempo, è probabile che eventuali vulnerabilità siano scoperte. Per queste ragioni è consigliabile di installare solo le versioni stable. Se da questo punto di vista le nightly build possono essere meno sicure in quanto non ancora testate a sufficienza, dall’altro rappresentano un potente strumento per migliorare la sicurezza: tramite queste, infatti, gli sviluppatori possono fornire agli utenti aggiornamenti rapidi contro eventuali nuove vulnerabilità scoperte. 37 In alcune versioni è possibile modificare la dimensione della griglia 50 4 Tizen Figura 15: Schermata Home di Tizen38 4.1 Modalità dell’analisi di sicurezza L’analisi di sicurezza di Tizen è la combinazione di un’analisi documentale e sperimentale. Sebbene la prima sia quella di maggiore consistenza, tramite alcuni test sperimentali è stato possibile comprendere al meglio le tecniche impiegate nel sistema. Tizen attualmente viene installato solo in alcuni dispositivi venduti nel mercato asiatico, per questo è stato possibile eseguire i test solo nella versione virtualizzata del sistema operativo. Lo sviluppo di Tizen è recente, ma la documentazione disponibile è ampia, soprattutto quella a disposizione per gli sviluppatori39 ed il Wiki40 . Tuttavia le informazioni appaiono spesso frammentarie ed è evidente la necessità di riorganizzazione. La continua evoluzione e le nuove soluzioni proposte rendono spesso difficile il compito di analisi. Nella ricerca di informazioni hanno rivestito grande importanza anche mailing list ufficiale ed il materiale reso disponibile in occasione delle “Tizen Developer Conference”, sia nella forma 38 Sorgente immagine: https://en.wikipedia.org/wiki/Tizen#/media/File:Tizen screenshot en original.png https://developer.tizen.org/documentation 40 https://wiki.tizen.org/wiki/Main Page 39 51 di audio che di presentazioni41 . In merito alla sicurezza di Tizen, esistono due pubblicazioni [53] [54], anche se risultano sorpassate nei contenuti, a causa dei frequenti aggiornamenti dei componenti di sicurezza del sistema operativo. L’analisi segue lo schema logico definito in 1.3. Da notare che le sezioni su “Tecniche di confinamento delle applicazioni” 4.5 e “Componenti di sicurezza aggiuntivi” 4.9 prevedono alcuni paragrafi di commento da parte dell’autore del report. Inoltre, le tematiche riportate in “WebGL” 4.6.2 e “XSS” 4.6.3 non trovano completo riferimento in fonti esistenti, ma sono frutto di un processo di analisi critica delle soluzioni adottate. La sezione 4.12, invece, è completamente dedicata all’esposizione dei risultati sperimentali. 4.2 Introduzione Tizen è un sistema operativo open source per dispositivi Mobile, come smartphone e tablet, Wearable e sistemi In-Vehicle Infotainment (IVI). In futuro, punta a diventare una piattaforma open source per tutti i dispositivi dell’elettronica di consumo (netbook, TV, macchina fotografica, stampante, lavatrice). Per poter gestire la diversità dei sistemi supportati, Tizen utilizza profili dedicati: configurazioni specifiche dello stesso sistemi operativo. L’analisi si concentra sul profilo Mobile [55]. 4.2.1 Tizen, “The OS of Everything” Nell’era precedente gli smartphone, gli utenti erano abituati ad utilizzare dispositivi differenti (cellulare, navigatore auto, macchina fotografica, TV) con la consapevolezza che le applicazioni, per quanto simili nelle funzionalità, differivano nell’usabilità. I produttori dei dispositivi sviluppavano piattaforme proprietarie e specifiche per ciascun apparecchio. Oggi nel mondo dell’“Internet of the Things”, le esigenze di connettività, compatibilità ed usabilità richiedono un cambiamento nell’approccio allo sviluppo. Qui nasce l’idea alla base di Tizen: una piattaforma standard, utilizzabile in diverse categorie di dispositivi con pochi cambiamenti. Inoltre, essendo open source, i produttori possono sviluppare con maggiore semplicità. 4.2.2 Storia Nel 2010, Nokia ed Intel annunciarono MeeGo, un sistema operativo per le applicazioni Web, basato su Linux. Nokia, in seguito, uscı̀ dal progetto, concentrandosi esclusivamente sullo sviluppo di Windows Phone. Intel era ancora intenzionata a sviluppare un sistema operativo ottimizzato per i propri processori, con l’intenzione di entrare nel crescente mercato mobile. Nel 2011, con il supporto della Linux Foundation, nasce Tizen. Contemporaneamente, Samsung era alla ricerca di un nuovo sistema operativo per i propri prodotti, con il principale obiettivo di diminuire la propria dipendenza da Android. Samsung si unı̀ al progetto, portando con sé soluzioni ed esperienze acquisite con LiMo e Bada, due sistemi operativi precedenti. Nel Gennaio 2012 nasce la Tizen Association42 a cui aderiscono produttori di dispositivi (OEM), operatori telefonici, aziende di videogiochi e sviluppatori di applicazioni. Rappresenta un punto di incontro per le aziende, un’occasione per poter prendere parte alle decisioni sul futuro della piattaforma. Attualmente lo sviluppo del software è principalmente diretto da Samsung e Intel. 41 42 https://download.tizen.org/misc/media/ http://www.tizenassociation.org 52 La versione 1.0 di Tizen, Larkspur, viene rilasciata nell’Aprile del 2012. In Figura 15 viene presentata un’anteprima della schermata di home della nuova versione 3.0, attualmente ancora in fase di sviluppo. 4.2.3 Le architetture supportate Attualmente sono supportate le architetture ARM ed Intel x86, sia 32 bit che 64 bit. Quest’ultima solo dalla versione 3.0 di Tizen. 4.2.4 Le applicazioni Il package è l’entità di installazione in Tizen ed è un contenitore di applicazioni. Viene identificato in modo univoco tramite il PackageId. Ciascuna applicazione ha associato un identificativo globalmente univoco, l’AppId ed un AppName. Tutte le applicazioni del pacchetto condividono le risorse ed i privilegi [Il sistema dei privilegi 4.5.7] definiti a livello di package. Dalla versione 2.0, Tizen supporta le applicazioni Native e Web. • Native, scritte in C e C++, il linguaggio nativo della piattaforma. Ottimo per le performance e per il limitato consumo di memoria, inoltre vi è un ampia disponibilità di librerie esistenti. • Web, scritte in HTML, CSS e Javascript, i linguaggi del Web. Lo sviluppo è semplice, la compatibilità è massima. Possono anche essere installate ed eseguite quando il dispositivo è offline, ma non supportano l’esecuzione in background. Dalla versione 3.0, Tizen aggiunge il supporto per le applicazioni Ibride [56]. Combinano la semplicità dell’applicazione web con la potenza di calcolo di uno o più servizi scritti in linguaggio nativo. Permettono un rapido sviluppo dell’interfaccia, tramite HTML5 e CSS3, ed un efficace processamento dei dati in background grazie alla vasta disponibilità di librerie native. Il packaging delle applicazioni Web segue le specifiche W3C43 : • Il formato del file è un archivio ZIP. • L’estensione del file è .wgt. • MIME type: application/widget. Il packaging delle applicazioni Native ed Ibride segue invece le seguenti specifiche: • Il formato del file è un archivio ZIP. • L’estensione del file è .tpk per le Native, .wgt per quelle Ibride. • MIME type: application/x-tizen.package-archive. Dalla versione 3.0, Tizen diventa un sistema operativo multi utente [57]: nonostante il sistema possa essere utilizzato da un solo utente alla volta, più utenti possono essere registrati, ciascuno con i propri dati e le proprie applicazioni. 43 World Wide Web Consortium (W3C) 53 4.2.5 Strumenti di sviluppo Esistono versioni specifiche del Software Development Kit (SDK) per i profili Mobile, Wearable e In-Vehicle Infotainment (IVI). Viene fornito un IDE (Eclipse), gli strumenti di compilazione (toolchain) ed un emulatore basato su QEMU. Per la connessione con il dispositivo, Tizen utilizza Smart Development Bridge (SDB) [58], un tool da linea di comando che agisce da intermediario tra il dispositivo o emulatore e lo strumento di debug. Permette eseguire una shell Unix da remoto, la sincronizzazione dei file e la gestione dei log [59]. 4.3 Architettura Figura 16: Architettura del sistema operativo Tizen.44 L’architettura di Tizen, mostrata in Figura 16, è costituita da 4 componenti chiave: il Kernel, il Core, il Framework Web ed il Framework Nativo. 4.3.1 Kernel Dalla versione 2.0, Tizen adotta il Kernel di Linux 3.0. Contiene anche i driver per l’hardware del dispositivo. 4.3.2 Core Contiene l’implementazione dei servizi chiave, utilizzati sia dal Framework Web che da quello Nativo. Al suo interno si possono identificare i seguenti sotto-componenti [54] [60]: 44 Sorgente immagine: http://www.slideshare.net/seojuyung/fa-linux-tizenfinalpresent 54 • Application Framework: fornisce la gestione delle applicazioni. All’avvio del dispositivo, si occupa di eseguire i servizi pre-definiti, come l’applicazione di chiamata. Gestisce la notifica di eventi di base, come il livello di batteria basso, cambiamenti nell’orientamento dello schermo e le notifiche push. • Base: contiene le librerie di sistema di Linux. Include il supporto per il database e per il parsing XML. • Connettività: fornisce tutte le funzionalità legate alla comunicazione su rete, come 3G, Wi-Fi, Bluetooth, HTTP e NFC (Near Field Communication). Il servizio di connettività è basato sull’utilizzo del demone ConnMan45 , sviluppato da Intel. • Grafica ed UI: gestisce lo stack dell’interfaccia grafica. Comprende EFL (Enlightenment Foundation Libraries), un sistema di gestione delle finestre basato su X11, la gestione degli input e OpenGL ES. • Localizzazione: fornisce i servizi di localizzazione (LBS - Location Based Services). È basata su GeoClue46 , un servizio che fornisce informazioni di localizzazione provenienti da differenti sorgenti, come GPS, WPS (Wi-Fi Positioning System), ID della cella telefonica e sensori. Permette inoltre di avere informazioni sui satelliti e lo stato del GPS. • Messaggistica: fornisce i servizi di SMS, MMS, Email ed Instant Messaging. • Multimedia: supporto per la visualizzazione di immagini e per la riproduzione video ed audio. • PIM (Personal Information Management): gestione dei dati dell’utente, come calendario e lista dei contatti. • Sicurezza: Sandboxing, controllo degli accessi, gestione dei certificati. Contiene i servizi server di Smack, Cynara e Content Security Framework. • System: gestisce diversi aspetti del dispositivo e di sistema: è un’interfaccia per l’accesso ai sensori, al display ed alla vibrazione. Gestisce il consumo energetico. Monitora gli eventi sul dispositivo, come USB, MMC, alimentatore e jack audio. Si occupa dell’aggiornamento del sistema. Infine, fornisce le funzionalità di sveglia e ora. • Telefonia: fornisce le funzionalità di comunicazione con il modem del dispositivo. Implementa i servizi di chiamata, messaggi, trasferimenti dati a pacchetto e informazioni di rete per UMTS e CDMA. • Web: contiene l’implementazione delle Web API di Tizen, ottimizzate per il basso consumo del dispositivo. Include il Web Runtime, per l’esecuzione delle applicazioni Web. 4.3.3 Framework Nativo Viene rilasciato nella versione 2.0 di Tizen. Si occupa dell’installazione, disinstallazione e aggiornamenti dei pacchetti applicativi [61]. Gestisce il ciclo di vita delle applicazioni e fornisce un’interfaccia per la gestione degli eventi di sistema. Permette lo sviluppo di applicazioni native e di servizi in C++, fornendo l’accesso ad oltre 10000 API. Include il supporto per le librerie R ES, Open AL, R Open standard ed open source, come glibc, libstdc++, libxml2, Open GL R MP. 45 46 https://01.org/connman http://freedesktop.org/wiki/Software/GeoClue/ 55 4.3.4 Framework Web Permette di eseguire le applicazioni che usano lo standard HTML5. Fornisce accesso a tutte le API definite dal consorzio W3C: video, audio, touch, 2D canvas, WebGL, CSS3, geolocalizzazione, vibrazione, web socket, e web worker. Inoltre le Web Device API di Tizen estendono l’accesso ai servizi di bluetooth, NFC, sveglia e messaggistica. 4.3.5 Web Runtime Uno dei punti di forza di Tizen, è il supporto per le applicazioni Web. In tal senso, il Web Runtime è uno dei componenti di maggiore interesse nell’architettura del sistema operativo. Il Web Runtime (WRT) è il gestore del ciclo di vita di un’applicazione web. È responsabile della loro installazione, disinstallazione ed esecuzione [62]. Il suo ruolo, per quanto simile a quello di un browser web, differisce nell’interfaccia grafica per l’assenza dei controlli di navigazione e per l’accesso all’hardware sottostante tramite le Web API. Gestisce la creazione e la distruzione dei processi relativi alle app anche in contemporanea [63]. Fino a Tizen 2.x, il web runtime era basato su WebKit. Nel Settembre 2013, inizia il progetto Crosswalk [64], per lo sviluppo di una nuova versione basata su Blink, il nuovo motore di rendering di Google. Presentato nel 2014, è stato inserito nella versione di Tizen 3.0. Attualmente ne viene rilasciata anche una versione per Android. La creazione di un nuovo Web Runtime è stata fortemente incentivato da Intel, che desiderava uno sviluppo più aperto, senza “mailing list private”. Inoltre si voleva diminuire la differenza di prestazioni tra le applicazioni native e Web. Crosswalk è basato principalmente su Blink, ma eredita anche altri progetti, tra cui Chromium, FFmpeg, Skia (per le librerie grafiche), V8 (il motore JavaScript) e la libreria Android Cordova. Vi sono poi alcuni moduli sviluppati specificatamente per Tizen, come il parser del file di Manifest [Il file Manifest 4.5.7], il runtime mode ed il Security Framework, l’implementazione delle API W3C SysApps, oltre ad un framework per l’estensione di JavaScript. Tutte le applicazioni Web in esecuzione condividono lo stesso processo Web Runtime. 4.4 Modello di sicurezza del sistema operativo La progettazione di una soluzione di sicurezza per il sistema operativo Tizen, ha richiesto la definizione di un modello definito sulla base delle minacce offerte dal panorama mobile negli ultimi anni. In Figura 17 viene riportato uno schema riassuntivo. Le principali sfide di sicurezza sono state identificate [65] nella diffusione di applicazioni malevoli, creazione di Store non autorizzati, perdita di dati sensibili, meccanismi volti ad ingannare l’utente, nell’utente stesso ed in attacchi da remoto. A seguito è stato definito un sistema di livelli di fiducia: il kernel è trusted, ma il secure boot è specifico del produttore del dispositivo. Il livello di fiducia di un’applicazione è legato a quello associato allo sviluppatore. L’utente, nonostante sia il possessore del dispositivo, non è fidato. Ugualmente non lo è lo sviluppatore. Gli obiettivi di sicurezza sono stati dunque identificati nella protezione degli utenti, delle applicazioni e del sistema [66]. 47 Sorgente immagine: https://wiki.tizen.org/wiki/File:Threat.png 56 Figura 17: Il modello delle minacce.47 4.4.1 L’utente Il sistema operativo mira a proteggere la privacy dell’utente. L’utente ha pieni privilegi sull’interfaccia grafica, il Touch, la tastiera ed i tasti del dispositivo. Non ha privilegi di amministratore e non può innalzarli. Non può modificare il file system, né può mandare segnali ai servizi di sistema, ma può comunque invocare azioni privilegiate per mezzo di applicazioni con sufficienti privilegi. In ultimo, è autorizzato ad installare le sole applicazioni che siano state firmate da una Trusted Certificate Chain. 4.4.2 Le applicazioni Figura 18: Modello di sicurezza del ciclo di vita delle applicazioni.48 Proteggere le applicazioni significa proteggere il processo, il codice eseguibile, i dati, le connessioni di rete e le informazioni di run-time. Le applicazioni possono accedere all’interfaccia grafica ed ottenere l’input dell’utente. Non hanno privilegi di amministratore. L’accesso in scrittura è garantito solo alle proprie directory. 48 Sorgente immagine: Security Lifecycle.png https://wiki.tizen.org/w/images/thumb/0/0a/Security Lifecycle.png/600px- 57 L’utilizzo delle API, sensibili per la sicurezza dell’utente, è sottoposto a restrizione. L’accesso ai dati di altre applicazioni non è consentito. Nell’elaborazione di un modello di sicurezza per Tizen, Figura 18, viene anche definito anche il modello del ciclo di vita sicuro delle applicazioni: • Al termine della fase di sviluppo, l’applicazione deve essere firmata dallo sviluppatore per i controlli di autenticità ed integrità. • Inviata allo Store, l’applicazione viene sottoposta a controllo di validazione ed in caso di successo, viene firmata dal distributore a conferma dell’ammissione al negozio virtuale. • In fase di installazione è sottoposta a controllo anti-virus: il sistema operativo offre un’interfaccia per controllare che il pacchetto applicativo non sia malevole. • Durante la fase di esecuzione, ciascuna applicazione è confinata (Sandboxing) ed è sottoposta a controllo degli accessi. 4.4.3 Il sistema La soluzione di sicurezza adottata deve proteggere il sistema: i servizi, le librerie condivise, i database, il kernel, il boot loader ed i driver hardware. I demoni di sistema sono eseguiti in un ambiente protetto e ricevono i minori privilegi possibili (sul principio least privilege). L’accesso alle connessioni di rete è ristretto ed è garantito solo ai componenti strettamente autorizzati. L’utente root è proprietario della maggior parte dei file di sistema, accessibili unicamente in sola lettura dagli altri utenti. Per il controllo degli accessi, si fa uso di una combinazione di tecniche derivanti dai modelli Discretionary Access Control [Appendice 6.5.1] e Mandatory Access Control [Appendice 6.5.2]. 4.4.4 I principali componenti Di seguito sono elencati i principali componenti di sistema che si occupano di implementare la soluzione di sicurezza in Tizen. • Smack, Cynara e DAC : i tre pilastri della sicurezza in Tizen. • Il sistema dei privilegi: per limitare limitare l’accesso delle applicazioni a componenti “privacy-sensitive”. • Vasum: un Environment Separation Mechanism. • Tizen Store: il negozio virtuale per la distribuzione di applicazioni precedentemente sottoposte a processo di revisione. • Tizen Key Manager : un deposito sicuro, protetto da una password, per chiavi, certificati e dati sensibili. • Content Security and Reputation Framework : per la ricerca di malware e la classificazione delle pagine Web. • Tecniche di mitigazione delle vulnerabilità come ALSR e DEP. 58 • Protezione dell’accesso: una collezione di API per l’implementazione del blocco del dispositivo da accessi indesiderati. Ciascuno degli elementi precedentemente elencati verrà trattato nelle successive sezioni dell’analisi del sistema operativo. 4.5 Tecniche di confinamento delle applicazioni Il sistema operativo Tizen impiega delle tecniche di confinamento per eseguire le applicazioni in un ambiente ristretto, in cui politiche dettagliate limitano l’accesso a risorse ed a componenti di sistema. Tizen 2.x L’isolamento delle applicazioni viene realizzato tramite l’utilizzo congiunto di Smack, un’implementazione del modello MAC [Appendice 6.5.2], e dell’assegnazione di permessi di accesso al file system, specifici per utenti e gruppi. Quest’ultima è una soluzione di sicurezza classica in Unix ed è un’implementazione del modello DAC [Appendice 6.5.1]. Smack, il principale componente di sicurezza, viene analizzato nelle sezioni 4.5.1 e 4.5.2, mentre l’utilizzo degli UserID e GroupID in 4.5.3. Tizen 3.0 La struttura utilizzata per il confinamento delle applicazioni viene modificata, nel tentativo di alleggerire il ruolo di Smack all’interno del sistema operativo. Viene introdotto il nuovo modello The three domain model ed un nuovo componente di sistema, Cynara, un policy checker per il controllo degli accessi centralizzato. Le motivazioni di tale scelta e dettagli sui componenti sono trattati nelle sezioni 4.5.4 e 4.5.5. Conclude la prima parte 4.5.6 in cui vengono esposte critiche riguardo alle soluzioni adottate. In 4.5.7 e 4.5.8 vengono introdotti il sistema dei privilegi e la firma dei pacchetti applicativi. A seguire, in 4.5.9 e 4.5.10 si applicano tutti i concetti analizzati in una descrizione sull’installazione ed esecuzione delle applicazioni. In ultimo una descrizione di Vasum 4.5.11, un Environment Separation Mechanism. 4.5.1 Smack - Simplified Mandatory Access Control Kernel Introduzione Smack è un Linux Security Module (LSM) [24] che implementa il modello Mandatory Access Control (MAC). È stato proposto e sviluppato da Casey Schaufler. SELinux [27], la più nota implementazione del modello MAC, fornisce una soluzione di sicurezza completa per Linux, ma appare complesso [67]. L’approccio di Smack è più semplice ed è rivolto a risolvere problemi di sicurezza più piccoli, richiedendo minore configurazione ed un supporto applicativo limitato. Smack è utile nelle implementazione di Sandboxing su Mobile per limitare l’accesso di un utente e di alcuni processi alle risorse. In ogni caso non è da considerare general purpose come SELinux. Smack è disponibile nel kernel Linux dalla versione 2.6.25. Il controllo dell’accesso di Smack si fonda sull’utilizzo di etichette [68], semplici stringhe di caratteri. Ogni soggetto, l’entità che vuole accedere ad una risorsa, ed oggetto, la risorsa, ricevono un’etichetta. Di base un soggetto può accedere ad un oggetto solo se le due etichette sono uguali, utilizzando un confronto case sensitive. È comunque possibile definire delle regole accessorie per permettere diverse combinazioni. 49 Sorgente immagine: https://wiki.tizen.org/wiki/File:Smack-entire-flow-diagram.png 59 Figura 19: Schema di funzionamento di Smack.49 In Tizen i soggetti sono le applicazioni Web e native50 , gli oggetti, i servizi e le risorse (come Wi-Fi, Bluetooth, 3G, GPS ed accelerometro), file, cartelle e socket. L’idea alla base di Smack è estremamente semplice, ma il meccanismo di controllo degli accessi tende a diventare complesso all’aumentare del numero di applicazioni e di risorse da controllare. Un numero molto alto di etichette è difficile da gestire, ma soprattutto può portare ad errori ed inconsistenze e ad un aumento dei tempi di risposta. Smack in pillole • Soggetto: qualsiasi processo in esecuzione. • Oggetto: file, risorse, socket, processi. • Cinque tipi di accesso: lettura (r), scrittura (w), esecuzione (e), lock (l), transmute (t). • Ad ogni soggetto ed oggetto viene assegnata un’etichetta. • L’etichetta è una stringa di testo ed il suo valore non ha significato. • Gli oggetti ereditano l’etichetta dai soggetti che li crea. • La regola di accesso di base: le etichette devono coincidere (confronto case sensitive). • Ulteriori regole di accesso possono essere specificate nella forma di tupla: – soggetto - oggetto - accesso. • Esistono tre etichette speciali in Tizen: – floor: associata ad un oggetto, permette sempre la lettura. – * star: associata ad un oggetto, permette sempre accesso in lettura e scrittura. – ˆ hat: associata ad un soggetto, permette la lettura di qualsiasi oggetto. 50 Più in generale tutti i processi in esecuzione. 60 Le etichette L’etichetta, label, è una stringa ASCII lunga fino a 23 caratteri. Il nome associato dell’etichetta è importante per aumentare la leggibilità delle regole. Le etichette assegnate alle risorse, gli oggetti, sono confrontate con quelle del processo che tenta di accedervi, il soggetto. L’impostazione predefinita prevede che l’accesso sia consentito soltanto se le due etichette sono uguali. Un amministratore, però, può aggiungere delle regole sotto forma di tupla soggetto - oggetto - diritti di accesso. Smack non supporta le wildcard o espressioni regolari e non vale la proprietà transitiva delle regole. Ad esempio: se a può accedere a b e b può accedere a c, questo non vuol dire che a possa accedere a c. Affinché questo possa valere, deve essere inserita una nuova regola specifica. Esiste inoltre un insieme di etichette Smack riservate (floor , hat ˆ, star *) alle quali si applicano regole differenti da quelle di base. Questo permette all’amministratore di limitare il numero di regole da creare per utenti e processi. L’implementazione Smack utilizza gli extended attributes del file system51 , per salvare l’etichetta associata a ciascun file. Per la configurazione, Smack usa la stessa tecnica di SELinux, definendo un file system: smackfs. Montato come /sys/fs/smackfs, fornisce diversi file che possono essere letti o scritti per la configurazione. Le regole Smack vengono salvate nel database Smack Policy 52 e caricate in memoria kernel al boot time [69]. Per effettuare delle modifiche, basta aggiungere una nuova tupla: soggetto - oggetto - regola di accesso. Tool Sono disponibili delle versioni modificate di alcuni tool Unix per la gestione delle etichette [70] [71]: • attr: per impostare le etichette a file e cartelle. • chsmack: per visualizzare e settare le etichette associate ad un file. • ls -Z: visualizza le etichette associate ai file. • sshd: associa etichette agli utenti. Rimangono settate fino al logout. • id e id -Z: per mostrare l’etichetta del processo corrente. • ps -Z: per visualizzare informazioni sui processi, incluse le etichette Smack. Ad esempio: per impostare l’etichetta riservata * a /dev/null si usa il seguente comando: a t t r −S −s SMACK64 −V ’ ∗ ’ / dev / n u l l Esempio Di seguito un esempio in cui si applicano delle regole Smack accessorie per replicare i livelli di classificazione standard dei documenti governativi: Unclass per non classificato, C per classificato, S per segreto e TS per top secret. Di seguito con poche regole è possibile stabilire la tradizionale gerarchia di accesso. 51 52 Smack fa uso dell’attributo security.SMACK64 per i file e di security.SMACK64EXEC per gli eseguibili. /sys/fs/smackfs/load 61 C S S TS TS TS Unclass C Unclass S C Unclass rx rx rx rx rx rx Per default, Unclass sarà solo in grado di accedere ai dati con la stessa etichetta, mentre per le regole definite di sopra, TS può accedere ai file etichettati S, C, Unclassed files. 4.5.2 Smack in Tizen Livelli gerarchici di Smack ed utilizzo L’utilizzo della combinazione di etichette e regole Smack permette di definire dei livelli gerarchici di accesso [72], a ciascuno dei quali è associato uno specifico caso d’uso. Nella tabella che segue, a livello crescente, corrisponde un accesso più ristretto. Livello 1 2 3 4 Utilizzo Accesso illimitato Condivisione file Sandboxing Controllo accessi Etichetta soggetto qualsiasi qualsiasi specifica specifica Etichetta oggetto * Accesso rwx rx la stessa del soggetto rwx specifica basato su regole Il primo livello viene impiegato per fornire accesso illimitato a quelle risorse utili a tutti gli applicativi. Questo permette un grande risparmio di regole Smack, che altrimenti sarebbero dovute essere definite per ogni soggetto Smack (applicazione). Ad esempio, i direttori /dev/null e /dev/zero ricevono l’etichetta star (*), dunque hanno accesso illimitato. Il secondo livello viene utilizzato per la condivisione dei file tra le applicazioni. Associare alle cartelle condivise l’etichetta floor ( ), permette a qualsiasi processo l’accesso in lettura ed esecuzione ai dati contenuti. Inoltre, le cartelle /lib, /bin, /usr/lib, /etc, /dev ricevono tutte l’etichetta floor (“ ”). Il terzo livello gerarchico viene impiegato per l’implementazione del Sandboxing delle applicazioni: se le etichette del soggetto e dell’oggetto sono le stesse, l’accesso dell’applicazione ai propri dati viene gestito senza la necessità di definire altre, più specifiche, regole Smack. L’ultimo e più restrittivo livello, il quarto, viene utilizzato per la gestione dei permessi associati alle applicazioni. In Tizen 2.x, al momento dell’installazione [4.5.9] viene creato un nuovo dominio per il pacchetto applicativo e vengono definite delle regole per limitare l’accesso alle sole risorse consentite. 4.5.3 UserID e GroupID Tizen 2.x Non è un sistema operativo multi utente, ma l’utilizzo degli UserID e GroupID e l’assegnazione dei permessi di accesso al file system rappresenta un’importante componente nel confinamento delle applicazioni [73]. Questa soluzione di sicurezza, classica di Unix, è un’implementazione del modello DAC [Appendice 6.5.1]. In Tizen 2.x esistono 3 utenti: root (UID 0), app (UID 5000) e developer (UID 5100). Tutte le applicazioni sono eseguite dall’utente app (userID 5000), nessuna dall’utente root (user ID 0). La shell di sdbd 53 viene invece eseguita con user ID 5100. 53 Demone di sistema dello Smart Development Bridge (SDB), un tool di debug. 62 Nella tabella 4.5.3 sono mostrate alcune impostazione per l’accesso a file e cartelle: Descrizione Configurazione di base per tutti i file dell’utente root File eseguibili e cartelle dell’utente root File del Framework estremamente importanti Cartella shared nella home dell’applicazione54 User: root Cartelle data e tmp nella home dell’applicazione55 User: app File globalmente accessibili, come /dev/zero, /dev/null e /tmp Permessi rw-r--r-- (644) rwxr-xr-x (755) rw------- (600) rwxr-xr-x (755) rwx------ (700) rw-rw-rw (666) Tabella 1: Alcuni esempi di permessi per le cartelle degli utenti root e app. Tizen 3.0 Il sistema operativo diventa multiutente [74]. Certamente l’utilizzo degli UserID e GroupID cambia, ma non sono disponibili informazioni a riguardo. 4.5.4 The three domain model Per poter comprendere le motivazioni alla base del cambiamento attuato da Tizen 3.0 nel modello di confinamento delle applicazioni, vengono qui anticipati alcuni concetti sui privilegi delle applicazioni, che verranno poi spiegati in dettaglio nella successiva sezione 4.5.7: “Il sistema dei privilegi”. In Tizen, i privilegi delle applicazioni vengono specificati facendo riferimento a servizi astratti, come “telefonia”, piuttosto che indicando dettagliatamente le risorse di sistema effettivamente usate per implementare la soluzione. Se da un lato questa scelta facilita la definizione dei permessi nello sviluppo delle applicazioni, dall’altro rende complicato il modo in cui i servizi astratti vengono mappati nei diversi componenti di sistema utilizzati. Tizen 2.x La funzione di mappatura è affidata interamente a Smack, utilizzando delle politiche di controllo degli accessi molto dettagliate: ogni applicazione ha associato un dominio ed un’etichetta. Ad ogni nuova installazione, per tutte le risorse ed i componenti a cui l’applicazione ha il privilegio di avere accesso, è necessario definire delle specifiche regole Smack (ulteriori dettagli in 4.5.9). Il problema è il numero di regole: 41000 in Tizen 2.2.1 [75], cosı̀ vasto da risultare ingestibile. Ulteriormente, non vi è distinzione tra le etichette di sistema e quelle utente e viene impiegato un algoritmo di ricerca lineare, lento. Tizen 3.0 Viene introdotto un nuovo modello di controllo degli accessi compatto, the three domain model : tre domini, tre gruppi di etichette ed alcune regole già definite [76]. In Tizen esistono fondamentalmente due tipi di dati: • Dati utente di proprietà dell’utente finale. • Dati di sistema che non possono essere cambiati dall’utente finale. I processi utente devono avere accesso ai dati del sistema e comunicare con i processi di sistema. Una soluzione pratica è quella di dividere i dati di sistema in una parte accessibile in lettura da chiunque ed in una che comunica con il processo utente. Il risultato sono i tre domini: 63 User : per i processi ed i dati utente. System: per i processi di sistema ed i loro dati privati. Floor : per i dati di sistema pubblici. L’accesso intra-dominio è libero, ma quello cross-dominio è ristretto e strettamente controllato. Ad ogni dominio è associato un gruppo di etichette Smack. Le principali sono: • User e User::App::$app id, associate al dominio User. • System, associata al dominio System. • floor, * star e ˆ hat, associate al dominio Floor, mantengono lo stesso significato spiegato in 4.5.1. A differenza della versione precedente, dove un nuovo dominio veniva creato ad ogni installazione, in Tizen 3.0 i tre domini di sicurezza sono creati preventivamente. Da notare che ogni applicazione installata, riceve ancora una propria etichetta, ma il dominio di appartenenza rimane quello User. L’adozione del “Three Domains Model” ha permesso di rendere le regole Smack più chiare e più semplici da gestire. Inoltre, ha consentito di velocizzare il sistema, sia al tempo di boot (nella fase di loading delle regole), sia a run-time (nel processamento delle regole). Figura 20: I pilastri del modello della sicurezza di Tizen 3.0.56 Nonostante questa soluzione semplifichi il controllo degli accessi, permettendo di ridurre il numero di etichette, la bassa granularità dei tre domini, non fornisce un controllo dell’accesso alle risorse sufficientemente dettagliato per garantire la protezione del sistema e di ciascuna applicazione. È stato quindi necessario introdurre un nuovo componente, Cynara, con la funzione di policy checker : controllare i privilegi delle applicazioni che tentano di accedere alle risorse ed alle API “privacy-sensitive”. In Tizen, l’utilizzo congiunto di UserId e GroupID (DAC), Smack e Cynara da origine ai “I tre pilastri della sicurezza di Tizen 3.0”, Firgura 20. 4.5.5 Cynara Cynara è un policy checker e viene introdotto nella versione di Tizen 3.0 [77]. 56 57 Sorgente immagine: https://wiki.tizen.org/wiki/File:SmackCynaraDAC 443 418.png Sorgente immagine: https://wiki.tizen.org/wiki/File:CynaraInputData 842 504.png 64 Figura 21: Le sorgenti che popolano il database di Cynara.57 I servizi di sistema necessitano di un meccanismo di controllo per verificare che chi vi accede abbia privilegi sufficienti.58 In Tizen 2.x questa funzione veniva offerta da un set molto dettagliato di regole Smack. La semplificazione introdotta dal “Three domain model” [4.5.4] rende necessario un nuovo componente che memorizzi i privilegi associati a ciascuna applicazione ed esponga una semplice chiamata API per il controllo delle policy di accesso. Cynara fornisce un database per memorizzare i permessi associati ad un’applicazione, mantiene il complicato mapping tra i “privilegi astratti” e le risorse di sistema ed espone una libreria client leggera per rendere il controllo degli accessi semplice [78]. Cynara in dettaglio In riferimento alla Figura 21, il database di Cyanara viene popolato utilizzando diverse sorgenti: • Le regole built-in definite dall’OEM. • Le regole imposte dall’amministratore di sistema. • Utilizzando il file Manifest dell’applicazione durante la fase di installazione [ulteriori dettagli in 4.5.9]. • Utilizzando il Privacy Manager per gestire le scelte dell’utente nella concessione dei permessi alle applicazioni [ulteriori dettagli in 4.5.7]. Nel database, ogni applicazione univocamente identificata da un’etichetta Smack, ha associata un lista di privilegi. I servizi di sistema fanno richiesta a Cynara per il controllo dell’accesso fornendo una tripletta: utente, applicazione e permesso.59 Cynara è ottimizzato per minimizzare i tempi di risposta, tramite cache dei risultati. Il tempo medio per un controllo di accesso è inferiore ai 10 ms, contro i 30ms medi delle implementazioni alternative [79]. In figura 22, viene mostrato un esempio di utilizzo di Cynara. Quando un’applicazione in esecuzione richiede l’accesso ad un componente di sistema, ad esempio il GPS, il componente 58 Vengono qui anticipati alcuni concetti sui privilegi delle applicazioni, che verranno poi spiegati in dettaglio nella successiva sezione 4.5.7: “Il sistema dei privilegi”. 59 Cynara è pensato per supportare un sistema operativo multi-utente. 60 Sorgente immagine: https://wiki.tizen.org/w/images/thumb/7/7e/CynaraSchema ver 1 0.png/750pxCynaraSchema ver 1 0.png 65 Figura 22: Controllo degli accessi in Cynara.60 manda una richiesta a Cynara61 . Quest’ultimo risponde con un messaggio di ALLOW o DENY, in base alla presenza della combinazione etichetta smack e privilegi consentiti nel database delle policy. Per un controllo più fine, nel processo decisionale può intervenire un un “agent esterno”, implementato nella forma di plug-in. Ad esempio, si potrebbe usare un popup, in cui l’utente può scegliere se consentire l’accesso ad una determinata risorsa. In ogni caso l’idea alla base di Cynara è quella di offrire una risposta precisa: permesso o non permesso. Se non viene consentito l’accesso ad una risorsa, o ad un’API privilegiata, a livello applicativo viene generata una SecurityError Exception. 4.5.6 Commenti sul modello del controllo degli accessi in Tizen Di seguito vengono riportate alcune critiche sul modello del controllo degli accessi in Tizen, prendendo riferimento da quanto emerso nella presentazione ufficiale [78]. • Tizen 2.0 utilizza politiche di sicurezza del sistema scritte come un insieme di regole Smack, nel tentativo di isolare le singole applicazioni vengono creati dei domini separati ad ogni nuova installazione. La stessa soluzione viene adottata sia in SELinux che in AppArmor, per questo Smack viene ritenuto essere, in parte, la reinvenzione di una soluzione esistente. • Nella presentazione di Cynara [78], Tomasz Świerczek ha annunciato che le performance di Cynara sono migliori rispetto ad altre soluzioni esistenti, come ad esempio Polkit. Quest’ultimo, in particolare, viene indicato come caratterizzato da scelte architetturali carenti per l’utilizzo di Json e XML per lo storage e l’assenza di cache. Questi sembrano più problemi implementativi, che architetturali. In ogni caso, una soluzione studiata appositamente per un sistema operativo mobile, come Cynara, può avere alcuni vantaggi, anche in termini di velocità. • Cynara permette anche meccanismi aggiuntivi per il controllo delle policy, tra cui popup da visualizzare all’utente. È dimostrato che demandare all’utente le decisioni di sicurezza, 61 tramite l’API cynara check() 66 Figura 23: Controllo dei privilegi nel menù impostazioni.62 non è la soluzione [80]: per troppo a lungo gli utenti sono stati abituati a rispondere automaticamente si ad ogni dialog di conferma. Nonostante Smack presenti alcuni elementi in comune con le soluzioni esistenti, risulta essere cosı̀ semplice, da rimanere molto interessante. Solo con il tempo si saprà se la verifica, i permessi o le etichette di Smack possono essere falsificati da applicazioni malevoli. Con permessi falsi, un’applicazioni potrebbe accedere ai demoni di servizio ed ottenere informazioni sensibili senza il consenso dell’utente. Inoltre potrebbe avere accesso o modificare informazioni in altre applicazioni. Il modello di sicurezza crollerebbe. 4.5.7 Il sistema dei privilegi Tizen fornisce un controllo sull’accesso alle API ed ai servizi privacy-sensitive il cui utilizzo può compromettere la privacy dell’utente e la stabilità del sistema. Alcuni servizi sono sensibili per la sicurezza dell’utente e del sistema e non dovrebbero essere disponibili per tutte le applicazioni. Per esempio, leggere un SMS è un’operazione sensibile: i messaggi in arrivo potrebbero contenere informazioni riservate e quelli in uscita potrebbero comportare una spesa per l’utente [Introduzione 1.2.1]. Quindi alcune funzionalità non devono essere disponibili per tutte le applicazioni, ma solo per quelle per cui l’utente ha approvato durante l’installazione, o a run time, il loro utilizzo. Le applicazioni già installate dall’OEM, sono invece considerate trusted dal sistema operativo. La maggior parte dei privilegi sono legati all’utilizzo delle API corrispondenti. Altri, come “privilege/internet” o “privilege/mediastorage”, sono puramente basati su una risorsa. Il livello di privilegio associato alle API è definito nel file di configurazione delle Policy di Tizen. Membri della Tizen Association, possono cambiarle in accordo con le loro necessità, nonostante sia un’operazione molto rischiosa dal punto di vista della sicurezza del sistema operativo. 62 Sorgente immagine: https://developer.tizen.org/dev-guide/2.2.1/org.tizen.gettingstarted/html/tizen overview/exception 67 Le applicazioni dichiarano i permessi richiesti nel file di Manifest, ma quelli realmente concessi dalla piattaforma Tizen, dipendono dalla tipologia di firma utilizzata. In fase di installazione, il gestore dei pacchetti confronta la firma utilizzata dal distributore dell’applicazione, con quelle disponibili nel sistema per i differenti livelli di privilegio [ulteriori dettagli in 4.5.8]. Il risultato del confronto definisce il massimo livello di privilegi disponibile per l’applicazione installata ed il relativo accesso alle API. Nella versione 2.2.1[81] di Tizen è stato aggiunto il pannello Privacy Manager nel menù Settings. Selezionando un applicazione è possibile, a posteriori, la modifica delle regole di accesso63 . In Figura 23 è mostrata la schermata per l’applicazione TestApp. La modifica dei privilegi associati ad un’applicazione ha conseguenze sul funzionamento dell’eseguibile: quando un’applicazione tenta di utilizzare le API privacy-sensitive i cui privilegi di utilizzo sono stati bloccati nelle impostazioni di privacy del dispositivo, viene generata un’eccezione64 nel codice. È importante che in fase di sviluppo l’applicazione abbia gestito correttamente tali eccezioni. Le linee guida di Tizen [82] consigliano di visualizzare un messaggio all’utente per spiegare il motivo per cui l’azione è stata interrotta. Il file Manifest Il Manifest è un file in formato XML. Viene utilizzato dalle applicazioni per specificare i privilegi per le API, i servizi utilizzati ed altri parametri come l’Id dell’applicazione e del package, l’icona e se abilitare la rotazione della schermata. Le applicazioni native ed ibride utilizzano un file chiamato manifest.xml, mentre quelle Web, config.xml. Di seguito viene riportato un esempio di Manifest per le applicazioni Web [83]. <?xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8”?> <w i d g e t xmlns=” h t t p : / /www. w3 . o r g / ns / w i d g e t s ” xmlns : t i z e n=” h t t p : / / t i z e n . o r g / ns / w i d g e t s ” i d=” h t t p s : / / g i t h u b . com/01 o r g / webapps−annex ” v e r s i o n= ” 1 . 0 ” width=” 512 ” h e i g h t=” 300 ”> <i c o n s r c=” annex−i c o n . png”/> <c o n t e n t s r c=” i n d e x . html ”/> <name>annex</name> <t i z e n : a p p l i c a t i o n i d=” 33 CFo0eFJe . annex ” package=” 33 CFo0eFJe” r e q u i r e d \ v e r s i o n=” 1 . 0 ”/> <t i z e n : s e t t i n g s c r e e n −o r i e n t a t i o n=” p o r t r a i t ” contextmenu=” e n a b l e ”/> </widget> Gerarchia dei privilegi I privilegi sono organizzati su tre livelli gerarchici [84], sulla base dei rischi di sicurezza associati al loro utilizzo. • Public: è il livello minimo, garantito a tutte le applicazioni sviluppate con il SDK. È aperto a tutti gli sviluppatori. • Partner: accessibili solo dagli sviluppatori registrati come partner presso il Tizen Store. • Platform: disponibili solo per gli sviluppatori che lavorano per il consorzio di Tizen. Comprende le API utilizzate dal framework e dalla piattaforma Tizen. 63 La modifica dei privilegi tramite il Privacy Manager comporta, in Tizen 2.x, un aggiornamento dei database Privilege DB e Smack Policy (trattati in 4.5.9). A partire da Tizen 3.0, la modifica dei permessi di un’applicazione viene gestita dal nuovo componente Security Manager. 64 SecurityError per le applicazioni Web, E USER NOT CONSENTED per quelle native. 68 Tipologia dei privilegi Esistono due tipi di privilegi: i nativi o core ed i web o wrt. I primi sono associati alle applicazioni native, i secondi alle applicazioni web. Di seguito alcuni esempi di privilegi nativi: • calendar.read : l’applicazione può leggere gli eventi del calendario (livello public). • appmanager.kill : l’applicazione può chiudere altre applicazioni (livello platform). Un esempio di privilegi web: • packagemanager.install : l’applicazione può installare o disinstallare pacchetti applicativi (livello platform). Una lista esaustiva dei privilegi è disponibile nella guida per gli sviluppatori di Tizen65 4.5.8 66 . Firma delle applicazioni In Tizen è richiesto che i pacchetti applicativi, per potere essere installati, siano firmati con la firma dell’autore e del distributore [85]. La firma dell’autore è il meccanismo di verifica dell’appartenenza dell’applicazione allo sviluppatore ed assicura l’integrità del pacchetto applicativo, cosı̀ come è stato inviato dallo sviluppatore. Permette di creare una trusted-relationship tra un’applicazione ed una sua nuova versione, fondamentale nel processo di aggiornamento. Inoltre consente di instaurare una trusted inter-application-communication, un meccanismo di comunicazione tra le sole applicazioni firmate con la stessa chiave dello sviluppatore, all’interno dello stesso dispositivo. Il certificato dello sviluppatore, può essere creato tramite il Tizen IDE. La firma del distributore viene applicata dal distributore delle applicazioni, come il Tizen Store (trattato in 4.7), per certificare la provenienza e verificare l’integrità del pacchetto applicativo, cosı̀ come è stato pubblicato sullo Store. Fornisce la garanzia che l’applicazione abbia superato il processo di revisione e determina il massimo livello di privilegi concessi. Ad esempio, se l’applicazione viene firmata con un certificato di livello pubblico, allora avrà accesso ai soli privilegi di livello pubblico. In fase di sviluppo delle applicazioni, è possibile creare una coppia di certificati temporanei per ottenere il livello di privilegi partner e platform [86]. Tuttavia, a differenza dell’emulatore, per effettuare il test su dispositivi reali è necessario che le “Opzioni per gli sviluppatori” siano state abilitate nel dispositivo. Successivamente, in fase di distribuzione dell’applicazione, la firma temporanea sarà sostituita da quella del reale canale di distribuzione, come ad esempio il Tizen Store. La firma delle applicazioni segue le specifiche W3C67 : • L’algoritmo di firma raccomandato è RSA con SHA 256. • La lunghezza raccomandata della chiave per RSA è di 4096 bit. • Il metodo di digest raccomandato è SHA-256. • Il formato di certificato raccomandato è X.509 versione 3 come specificato in [RFC5280]. 65 https://www.tizen.org/privilege https://wiki.tizen.org/wiki/Security/Tizen 2.X Privileges#Privilege Categorization 67 http://www.w3.org/TR/widgets-digsig/ 66 69 4.5.9 Installazione delle applicazioni Figura 24: Schema dei passaggi per l’installazione di un’applicazione.68 Di seguito vengono descritte le fasi di installazione di un’applicazione [85]. Tizen 2.x Si faccia riferimento alla Figura 24.69 . 1. Il gestore dei pacchetti, o Installer, effettua il controllo delle firme dello sviluppatore e del distributore sul pacchetto applicativo. 2. Viene effettuato il parsing del file di Manifest, al fine di controllare che i privilegi richiesti dall’applicazione siano compatibili con la tipologia di firma utilizzata dal distributore. 3. Si procede alla copia dei file eseguibili nella cartella bin nella home dell’applicazione70 . Poiché l’Installer viene eseguito dall’utente root, di default tutti i file sono di proprietà di root [73], ma in seguito lo UserId ed il GroupId dei direttori data e tmp sono settati ad app [rif 4.5.3]. Infine l’installer setta l’etichetta Smack per tutti i file dell’applicazione uguale all’ApplicationID (ad eccezione della cartella shared a cui viene associata l’etichetta floor ). Per default, un’applicazione è quindi in grado di accedere a tutte le sue risorse. 4. I privilegi associati dall’applicazione vengono aggiunti al database dei privilegi (Privilege DB ). 5. I privilegi dichiarati dall’applicazione sono convertiti in regole Smack sulla base di alcuni template definiti in smack-privilege-config 71 [88]. 6. Il database delle Smack policy viene aggiornato, con l’aggiunta delle nuove regole Smack create al punto precedente. 68 Sorgente immagine: https://wiki.tizen.org/wiki/File:Access control architecture.png Durante la fase di installazione, tutta la gestione dei privilegi avviene tramite l’utilizzo delle libprivilegecontrol API [87]. 70 /opt/usr/apps/[APPLICATION ID] 71 Ciascun template ha estensione .smack e si trova in /usr/share/privilege-control. 69 70 Tizen 3.0 Al fine di diminuire il numero di nuove regole Smack create ad ogni nuova installazione, viene introdotto un nuovo componente: Cynara [rif 4.5.4 e 4.5.5]. Il processo di installazione rimane simile, con la differenza dell’introduzione del Security Manager [89], un demone di sistema privilegiato, incaricato di settare correttamente gli attributi di file e cartelle, di assegnare le etichette Smack e di popolare il database di Cynara. 4.5.10 Esecuzione delle applicazioni Figura 25: Schema dei passaggi per l’esecuzione di un’applicazione Nativa.72 Tizen 2.x Il launchpad daemon è il demone, eseguito dall’utente root, che interviene nella creazione di un nuovo processo [90] ed è il processo padre di tutte le applicazioni nel sistema operativo. Di seguito le fasi necessarie per il lancio di un’applicazione Nativa, Figura 25: • Il launchpad daemon crea un nuovo processo figlio, tramite la system call fork(). • UserId e GroupId del nuovo processo vengono impostati a 5000 (app) [4.5.3]. • Viene settata l’etichetta Smack corretta, utilizzando le libprivilege-control API [87]. • A seguito della chiamata alla system call exec(), inizia l’esecuzione dell’applicazione richiesta. • Durante l’esecuzione le applicazioni sono confinate tramite le tecniche descritte in 4.5. Il caso di un’applicazione Web, si differenzia da quella nativa per alcune fasi iniziali aggiuntive. In fase di installazione viene viene creato un soft link al Web Runtime73 , etichettato con la 72 73 Sorgente immagine: https://wiki.tizen.org/wiki/File:Libprivilege-control pig1.png L’eseguibile di un’applicazione Web è un link simbolico a /usr/bin/wrt-client. 71 label Smack associata all’applicazione. Quando l’applicazione Web viene lanciata, Tizen esegue il soft-link corrispondente, il Web Runtime inoltra la richiesta al wrt launchpad (una versione specializzata del launchpad daemon). Le fasi seguenti sono identiche a quelle precedentemente descritte. Tizen 3.0 Durante la fase di lancio, il Security Manager [89] setta l’etichetta Smack ed il GroupId (DAC) del nuovo processo creato, in modo tale da garantire al processo l’accesso ai propri file. A run-time l’applicazione potrebbe richiedere l’accesso ad ad un servizio di sistema o al file system. Nel primo caso l’etichetta Smack associata al processo applicativo viene usata da Cynara per controllare se l’accesso possa essere garantito. Nel secondo, il filesystem utilizza gli attributi UserId e GroupID e l’etichetta Smack per effettuare gli opportuni controlli. 4.5.11 Vasum Figura 26: L’architettura di Vasum con due zone in esecuzione.74 Tizen implementa il meccanismo di Sandboxing delle applicazioni basandosi principalmente sui modelli del controllo degli accessi MAC e DAC. Questa soluzione permette una separazione a livello dell’applicazione, ma l’ambiente di esecuzione rimane unico. Vasum [91] è un Environment Separation Mechanism basato su Linux Containers/LXC (dettagli in Appendice 6.6), che consente di avere su uno stesso device più ambienti di esecuzione separati, chiamati zones, ciascuno dei quali esegue virtualmente una copia del sistema operativo Tizen. Il principale beneficio offerto è quello di avere ambienti di esecuzione separati per il test di applicazioni malevoli, per lo sviluppo di applicazioni che necessitano di configurazioni specifiche e per limitare le funzionalità di un dispositivo dato in dotazione. Attualmente Vasum è ancora in una fase di sperimentazione e non è stato inserito nell’Open Build Service (OBS)75 , il servizio per la raccolta dei pacchetti software di una release del sistema operativo. Il modello logico di Vasum prevede l’esecuzione contemporanea di una versione nativa del sistema operativo, host, e di alcune istanze virtualizzate, guest. Tizen nativo si occupa di: 74 75 Sorgente immagine: https://wiki.tizen.org/wiki/File:VasumDiagram v1.png https://build.tizen.org/project/show?project=Tizen%3AMobile 72 • Gestire le risorse hardware del dispositivo. • Eseguire alcuni servizi critici che ha senso siano presenti in una sola istanza per ciascun dispositivo, tra cui il server Vasum, descritto in seguito. • Gestire il ciclo di vita e le risorse delle zone. • Mediare nella comunicazione tra zone e ricevere da ciascuna le richieste per le operazioni privilegiate, come l’avvicendamento della zona in foreground. Tizen virtualizzato in una zona, è incaricato di: • Installare ed eseguire le applicazioni di ciascuna zona. • Eseguire i servizi di sistema necessari per ogni guest. • Fornire lo storage per i dati e delle configurazioni di ciascuna zona. • Fornire i meccanismi di condivisione intra-zona. Installare le applicazioni nel guest, richiede che tutte le operazioni privilegiate, come settare le etichette Smack, siano eseguite dall’Installer [rif 4.5.9], con il quale l’applicazione di installazione specifica di una zona comunica su socket. L’Installation Service, rispetto alla versione standard di Tizen, necessita di alcune modifiche per supportare la gestione delle zone in Vasum. Dal punto di vista implementativo, figura 26, Vasum è costituito da una componente Server e da una Client, di seguito analizzate. Server Il server Vasum è un servizio systemd che implementa la maggioranza delle funzionalità logiche, di sopra descritte. • Per motivi di sicurezza, viene eseguito da un utente non root. • Espone un set di API utilizzabili sia dai servizi in esecuzione sull’host, che da quelli in una zona. • Si occupa di mantenere la comunicazione sia con i client, che con i bus rispettivi di ciascuna zona e permette di contattare altri servizi in esecuzione sull’host, come Cynara[rif 4.5.5]. • Gestisce il ciclo di vita delle zone (start, stop e restart), l’avvicendamento di quella in esecuzione e mantiene la configurazione di ciascuna. La decisione sullo scheduling delle zone, può essere presa autonomamente, o essere richiesta esplicitamente da un servizio di sistema, usando la chiamata ad un’API specifica o dall’utente, tramite il triplo click sul bottone di home. • Sfruttando le impostazioni dello scheduler ed i Cgroup di Linux, è in grado di dare priorità a servizi di sistema o ad alcune applicazioni critiche in esecuzione in una zona in background e di congelare quelle delle altre zone. • Fornisce un set di API per la comunicazione intra-zona, messaggi broadcast per la comunicazione tra zone e funzione di relaying per i client in ascolto. 73 Client Il client comunica con il server Vasum tramite alcune API. • Permette a servizi ed alle applicazioni in esecuzione in una zona di ottenere il controllo, anche se parziale, sul dispositivo. • Consente ad un servizio, in esecuzione sull’host, di comunicare con le applicazioni all’interno di una zona. • Include un meccanismo di notifica per l’utente, per informarlo nel caso in cui una zona in background richieda la sua attenzione. • Comprende un’applicazione grafica che consente la gestione delle zone da parte dell’utente: creazione, distruzione ed impostazione dei privilegi. 4.6 Criticità progettuali ed implementative delle applicazioni In questa sezione vengono trattate alcune tematiche che introducono delle potenziali debolezze nelle applicazioni in Tizen. In 4.6.1, viene presentata una soluzione proprietaria per la conversione delle applicazioni da Android a Tizen. Se da un lato risulta essere molto attraente per l’aumento di interesse verso la piattaforma, dall’altro non sono noti i risvolti di sicurezza. Viene in seguito trattato l’utilizzo OpenGL nelle applicazioni Web, 4.6.2, un problema ipotizzato in [92], su cui l’autore del report ha voluto indagare più approfonditamente. A concludere, 4.6.3, un’esposizione sul Cross Site Scripting nelle applicazioni Web. Un problema già noto alla comunità Tizen [92], ma per cui non sono state sviluppate contromisure, né sembra che ve ne siano in progetto. 4.6.1 Conversione automatica della applicazioni In occasione della Tizen Developer Conference del 2013 [93], Infraware ha presentato PAG Service [94], una soluzione proprietaria per la conversione automatica di applicazioni esistenti per Tizen. Seconda l’azienda, il processo di conversione di applicazioni esistenti ha innumerevoli vantaggi: permette di ridurre i costi di progetto, i tempi di sviluppo e di avere un time-to-market bassissimo. Gli sviluppatori possono sviluppare a basso costo e pubblicare sul Tizen Store in tempi brevi. Inoltre, per la piattaforma Tizen, avere più applicazioni a disposizione, significa rendere il sistema operativo più competitivo. Gli utenti non percepiscono differenze tra le applicazioni native e convertite e possono accedere a software di alta qualità e performance, indipendentemente dalla piattaforma utilizzata. Attualmente la maggior parte degli sviluppatori per applicazioni mobili si concentra su iOS ed Android. Inoltre, quest’ultimo detiene la maggiore quota di mercato. Uno strumento di conversione automatica delle applicazioni disponibili per Android in Tizen, risulterebbe molto interessante. Android fornisce un ambiente di esecuzione “Hardware Indipendent”, basato sull’utilizzo di una macchina virtuale. Il semplice porting dell’Android Runtime permette di eseguire le applicazioni 76 Sorgente immagine: http://download.tizen.org/misc/media/tds2013/slides/Publishing-to-Tizen.pdf 74 R App Player nell’architettura Tizen.76 Figura 27: POLARIS per Android in Tizen. In più, se le i pacchetti applicativi vengono convertiti (repackaged) nel formato TPK di Tizen, è possibile anche l’upload sul Tizen Store. Il processo richiede 3 fasi: R App Verifier, si controlla se l’applicazione è adatta alla • Verifica: tramite POLARIS conversione. R App Generator (PAG) converte un’applicazione per Android, • Generazione: POLARIS in formato APK, al formato TPK per Tizen. R App Player permette di eseguire un’applicazione tramite PAG • Esecuzione: POLARIS in Tizen, figura 27. Secondo quanto riportato [95], i risultati dei test dimostrano che almeno il 50% delle applicazioni R App Generator senza modifiche. Solo il 30% possono essere convertite usando POLARIS delle applicazioni richiede lievi modifiche. Il risultato finale dimostra come circa 80% delle applicazioni per Android possano essere convertite ed utilizzate in Tizen. Conclusioni dell’autore del report: Nonostante i diversi risvolti interessanti, eseguire applicazioni Android in una versione personalizzata dell’Android Runtime per Tizen, ha delle implicazioni di sicurezza. Il modello di sicurezza di Android è differente da quello di Tizen. Dalle informazioni fornite, non è deducibile come venga affrontato il problema della gestione dei R permessi per le applicazioni installate. In ultimo, non è chiaro quale sia il ruolo di POLARIS App Player nel sistema operativo Tizen: se una semplice applicazione o un vero componente di sistema. 4.6.2 WebGL WebGL è una tecnologia multipiattaforma che fornisce un’API low-level per la gestione della grafica 3D. Nel Maggio e nel Giugno 2011, Context Information Security pubblicò due report [96] [97] che evidenziarono alcune criticità sulla sicurezza di WebGL, dimostrando come fosse 75 Figura 28: Esempio di attacco a WebGL con escalation of privileges.77 possibile ottenere degli screenshot dal dispositivo della vittima, con la possibile conseguente perdita di dati sensibili. In seguito, Microsoft scelse di terminare il supporto di WebGL nel proprio browser [98]. Tizen, nelle applicazioni Web, espone le API per accedere direttamente a WebGL. Di seguito sono presentati alcuni punti di approfondimento: • Il supporto dei browser per WebGL espone le funzionalità hardware direttamente sul web. WebGL permette ad applicazioni web (tipicamente untrusted) di interagire direttamente con i driver grafici (che operano in Kernel mode). La superficie di attacco di WebGL è molto ampia ed espone codice privilegiato e non sufficientemente robusto. Il supporto browser per WebGL richiederebbe ai driver grafici delle garanzie di sicurezza di cui mai si era occupati fino ad ora. Se prima gli attacchi potevano risultare in un “escalation of privileges” locale, ora lo possono diventare da remoto. Inoltre è lecito aspettarsi dei bug solo su alcune piattaforme con hardware video specifico, facilitando attacchi mirati. Nonostante OpenGL abbia delle funzionalità aggiuntive per permettere ai driver video una validazione del codice 3D, queste sono da ritenersi incomplete. In Figura 28 sono mostrate le fasi di un esempio di attacco WebGL. • La responsabilità dei software di terze parti. La dipendenza del supporto browser per WebGL dai software di terze parti, è troppo alta per poter assicurare una navigazione web sicura. I problemi di sicurezza potrebbero non manifestarsi direttamente nelle API di WebGL, ma nei vari componenti di sistema OEM o distribuiti da vari Indipendent Hardware Vendors. Gli sviluppatori dei driver video non hanno mai affrontato questo problema, essendo in genere esposti a codice trusted (quello del sistema) ed avendo fiducia che gli 77 Sorgente immagine: http://www.contextis.com/media/images/blog-WebGL-1.width-800.png 76 sviluppatori 3D non attaccassero le vulnerabilità. Inoltre il modello di aggiornamenti utilizzato nei driver delle schede video, caratterizzato spesso da update annuali, non soddisfa le esigenze di un robusto “processo di aggiornamenti di sicurezza”. • Possibili scenari DoS. Tradizionalmente le minacce di un Denial of Service lato client non sono mai state considerate severe. L’infrastruttura grafica dei sistemi operativi non è stata disegnata per difendersi da “ombre e geometrie” appositamente create da un attaccante. Un sito web malevolo potrebbe portare al blocco del sistema ed alla necessità di reboot. 4.6.3 XSS XSS è una vulnerabilità Cross-Browser, Cross-Piattaforma e Cross-Sistema operativo che permette di inserire ed eseguire codice Javascript lato client. Ne sono affette le applicazioni web che elaborano dati provenienti da sorgenti non fidate e che non effettuano gli opportuni controlli. Un esempio è il campo di input di un form: se i dati non sono correttamente filtrati (ad esempio rimuovendo il tag <script>) e sono inseriti direttamente nel DOM, è possibile iniettare codice JavaScript da remoto, realizzando un attacco Cross Site Scripting. Nonostante sia una vulnerabilità nota fin dai tempi dell’introduzione di JavaScript nel 1995, raggiunge la sua massima popolarità nell’Ottobre 2005 con SamyWorm [99]. Attualmente continua ad essere estremamente diffusa e la classifica Oswap la inserisce al terzo posto nella Top Ten delle minacce per la applicazioni web del 2013 [100]. La crescita vertiginosa di Internet ha spinto gli sviluppatori dei browser ad aumentarne le funzionalità per venire incontro alle nuove esigenze. Soluzioni di sicurezza e regole di buona prassi sono state definite solo in seguito ad attacchi diffusi. Di seguito viene presentata una lista dei principali attacchi ottenibili con la tecnica del Cross Site Scripting [92]. • Website Defacement: modifica illecita di una o più pagine di un sito web. • Session Hijacking: dirottamento di una sessione di lavoro autorizzata per ottenere un accesso non autorizzato. • Request Forger: invio di una richiesta al server all’insaputa del client. • XSS Worms: codice JavaScript malevole in grado di diffondersi automaticamente. • Clickjacking: reindirizza il click dell’utente a sua insaputa. • JavaScript Keyloggers: uno sniffer in grado di intercettare, memorizzare ed inviare ad un attaccante tutto quello che viene digitato sulla tastiera. Le applicazioni Web, in Tizen, utilizzano le API estese di Javascript per accedere al sistema operativo: l’accesso al File System, la comunicazione tra le processi, l’accesso ai servizi di localizzazione, ai WebSocket ed a WebGL. Ogni nuova funzionalità per gli sviluppatori è anche una nuova funzionalità per gli attaccanti. Le sole limitazioni sono le operazioni ammesse, dichiarate nel file di Manifest. Le applicazioni Web di Tizen, realizzate in HTML e Javascript, possono portare nuova popolarità a Cross Site Scripting. Tutto nasce da un post su un blog [101]: una guida alla programmazione di una semplice applicazione web che visualizza gli SMS ricevuti. Inviano un normale SMS, ad esempio con il testo “Hey there!”, l’applicazione funziona correttamente, visualizzando il testo del messaggio. 77 Invece, se si invia un altro SMS contenente codice Javascript: <script>alert(’Hey there!’)<script> subito non succede nulla, ma riavviando l’applicazione si apre un pop up con scritto “Hey there!”, l’inequivocabile segno di una vulnerabilità Cross Site Scripting. Soluzioni La soluzione migliore è che sia il Framework a trattare questi problemi, gli sviluppatori non devono essere degli esperti di sicurezza per poter scrivere del codice sicuro. • SDK dovrebbe fornire degli strumenti per aiutare gli sviluppatori a non inserire vulnerabilità di sicurezza come XSS. Ad esempio non dovrebbe essere possibile modificare direttamente il DOM. • Utilizzare delle librerie di JavaScript, come JQueryMobile, per il filtraggio e la codifica dei dati. • È comunque consigliato fornire delle regole di buona prassi ed insegnare agli sviluppatori di applicazioni l’importanza di trattare correttamente i dati provenienti da fonti non fidate. 4.7 Store Figura 29: Screenshot che mostra alcune applicazioni scaricabili dal TizenStore.78 78 Sorgente immagine: http://www.tizenexperts.com/wp-content/uploads/2015/04/Samsung-SM-Z130HTizen-Smart-Phone-Tizen-Store-1.jpg 78 Figura 30: Le fasi del processo di revisione delle applicazioni.79 Il 3 maggio 2013 [102], apre il TizenStore, lo store ufficiale di Tizen: il negozio virtuale per il download di applicazioni sia gratuite che a pagamento. Lo store è accessibile tramite un’applicazione dedicata, figura 29, oppure da Web, al seguente indirizzo http://www.tizenstore.com/. Le applicazioni inviate dagli sviluppatori, prima di essere disponibili per il download, sono sottoposte ad un processo di revisione. 4.7.1 Il processo di revisione Il processo di revisione di Tizen [103] combina le metodologie utilizzate in Android, con quelle dell’Apple App Review e promette di fornire una valutazione entro tre giorni dall’invio dell’applicazione. I pacchetti applicativi sono sottoposti ad un rigoroso processo di validazione del codice e vengono analizzati con una combinazione di tecniche statiche e dinamiche [54]. Il processo di revisione si concentra su diversi criteri [104]: la verifica di sicurezza, il corretto funzionamento, l’usabilità ed il controllo sull’adeguatezza dei contenuti esposti. La figura 30 mostra le fasi della verifica: la prima, Initial Inspection & Dynamic Analysis, è principalmente automatizzata, la seconda, Content Review & Final Confirmation, viene eseguita da un revisore finale. Initial Inspection & Dynamic Analysis Inizialmente, viene effettuata un’analisi di sicurezza dinamica dove le applicazioni sono filtrate sulla base del rilevamento di possibili minacce: malware, utilizzo non consentito di API privilegiate, riconoscimento di pattern che identificano un attacco. Inoltre, viene verificato che a runtime l’applicazione non possa scaricare contenuto esterno non validato. In modo simile a Bouncer [105], il meccanismo di verifica usato da Android, il sistema di validazione di Tizen impiega una serie di emulatori per tracciare il comportamento dell’applicazione 79 Sorgente immagine: tizen validation guide ver 1.4 140529.pdf https://developer.tizen.org/sites/default/files/documentation/ 79 mentre se ne simula l’utilizzo, con l’obiettivo di scatenare ed intercettare possibili azioni malevoli. Successivamente, il Tizen Automation System controlla le funzionalità di base ed i metadati associati all’applicazione, come l’adeguatezza del linguaggio utilizzato ed il supporto linguistico, il processo di installazione e disinstallazione, la gestione degli eventi e degli interrupt. Ad esempio l’utente deve essere sempre in grado di poter effettuare una chiamata di emergenza e di rispondere ad una in arrivo. Review & Final Confirmation In questa fase l’applicazione viene validata sulla base delle linee guida esposte nella Tizen Validation Guide. Si effettua un controllo sull’applicazione in generale e su eventuali caratteristiche speciali ed infine il Content Review : una verifica sui contenuti esposti, che devono essere adeguati al limite di età dichiarato, non devono infrangere i diritti di copyright e devono evitare possibili problemi culturali. In ultimo, un revisore prende la decisione finale riguardo al processo di approvazione e viene inviato un responso allo sviluppatore. Il Tizen Validation Team ha segnalato [104] quali sono attualmente le principali cause di rigetto delle applicazioni sottoposte a processo di revisione: • Applicazioni over e sotto privilegiate: nel primo caso l’applicazione dichiara dei privilegi per funzioni che non utilizza. Nel secondo, l’applicazione non viene accettata perché non dichiara gli opportuni permessi necessari per accedere alle API utilizzate. • Assenza di firma dello sviluppatore. • Infrangimento del copyright o contenuti non adeguati: immagini o scritte che non rispettano i criteri esposti nella Tizen Validation Guide. Per risolvere preventivamente i problemi di installazione e funzionamento, Samsung mette a disposizione il Remote Test Lab 80 . Si tratta di un servizio gratuito per gli sviluppatori, che tramite Web possono accedere remotamente a dispositivi fisici, per testare e configurare l’applicazione prima della sottomissione. 4.7.2 Connessione alla Store Non sono note informazioni circa la sicurezza della connessione al TizenStore: non è noto se esista una fase di autenticazione e se il traffico di rete sia sottoposto a cifratura. Non è stata possibile un’analisi ulteriore in quanto, attualmente, i dispositivi con Tizen installato sono venduti nel solo mercato asiatico. Inoltre l’emulatore non dispone della TizenStore App e non è possibile installarla: non è stato dunque fattibile effettuare un’analisi del traffico di rete. Una nota interessante riguarda l’accesso al Tizen Store al di fuori di India e Bangladesh, gli unici paesi in cui lo smartphone Samsung Z1, il primo dispositivo con Tizen installato nativamente, viene commercializzato. Al momento del login, usando l’applicazione dedicata, gli utenti sono automaticamente connessi al Tizen Store del proprio paese sulla base del Mobile Country Code (MCC) della scheda SIM o di GeoIP se nessuna scheda SIM è inserita. Su Internet sono disponibili dei tutorial per ovviare a questa limitazione [106], basati sull’utilizzo di una connessione Virtual Private Network (VPN) per connettersi ad un server in India o in Bangladesh. 80 http://developer.samsung.com/remotetestlab/rtlDeviceList.action 80 4.7.3 Store non ufficiali Tizen accetta che le applicazioni siano scaricate anche da store differenti da quello ufficiale, purché la firma del distributore utilizzata sia tra quelle accette dal sistema operativo. Esistono alcuni store non ufficiali, distributori di applicazioni Web multipiattaforma, incluso Tizen. Ciascuno applica un processo di revisione e policy personalizzate. Tra i principali: Appbackr81 , AppsFuel82 , Boostermedia83 , Ninja84 . 4.8 Cifratura Tizen attualmente non fornisce funzionalità di cifratura del file system e non si hanno notizie circa future implementazioni. Tuttavia, è disponibile la cifratura opzionale delle risorse di un’applicazione web, di seguito dettagliata. 4.8.1 Cifratura applicazioni Web Per le applicazioni Web che richiedono la cifratura nel file di configurazione config.xml, <t i z e n : s e t t i n g e n c r y p t i o n=” e n a b l e ” /> il Web Runtime (WRT) fornisce la cifratura dei file HTML, Javascript e CSS (estensioni *.js, *.html, *.css, *.xhtml) per la protezione delle risorse dell’applicazione [107]. La cifratura avviene in fase di installazione dell’applicazione e non quando viene creato il pacchetto applicativo (wgt) in fase di sviluppo, 4.2.4. Scopo della cifratura è quello di prevenire che le applicazioni web vengano copiate tra dispositivi [108]. L’algoritmo di cifratura è AES, la chiave viene generata con l’aiuto del modulo crypto del WRT, diversa per ogni file ed in seguito salvata nel Secure Storage 4.9.2 [109]. Quando l’applicazione viene eseguita, il Web Runtime decifra i file precedentemente cifrati in memoria in modo del tutto trasparente all’applicazione ed all’utente. 4.9 Componenti di sicurezza aggiuntivi In questa sezione vengono presentati i restanti componenti di Tizen che implementano il modello di sicurezza presentato in 4.4. Attualmente Tizen fornisce diverse soluzioni alternative per la protezione dei dati sensibili: • Il Tizen Key Manager, un deposito sicuro, protetto da password, per chiavi, certificati e dati sensibili, viene descritto in 4.9.1. • Il Secure Storage, una tecnologia per il salvataggio sicuro dei dati, descritta in 4.9.2. • Gnome Keyring: essendo una soluzione di sicurezza comune ad Ubuntu Touch, viene analizzato in Appendice 6.1.1. 81 http://www.appbackr.com/tizen http://appsfuel.com/ 83 http://www.boostermedia.com/ 84 http://html5-ninja.com/ 82 81 Data la similarità dei tre componenti, è possibile che nella versione 3.0 di Tizen solo il Key Manager venga mantenuto85 . In sezione 4.9.3, viene presentato il Content Security and Reputation Framework, per la scansione di dati e la classificazione di URL. In 4.9.4 una breve descrizione sulla sicurezza del modulo WiFi ed in 4.9.5 una sezione dedicata alla gestione dei certificati SSL. A concludere 4.9.6, una breve trattazione delle tecniche, presenti nel sistemi operativo, per la mitigazione degli exploit. 4.9.1 Tizen Key Manager Figura 31: Architettura del Key Manager di Tizen.86 Il Key Manager di Tizen [110] fornisce un deposito sicuro, protetto da password, per chiavi, certificati e dati sensibili. Permette, inoltre, operazioni crittografiche sui dati salvati, senza rivelarne il contenuto in chiaro. In figura 31, sono mostrati i principali componenti. Le API Il Key Manager fornisce due tipi di API: Secure Repository e Secure Crypto. Le Secure Repository API espongono funzioni per immagazzinare, recuperare e rimuovere chiavi, certificati e dati. Le Secure Crypto API forniscono funzioni crittografiche: creazione di una coppia di chiavi asimmetriche, firma digitale e verifica dei certificati. Regole di accesso Per i dati salvati nel Key Manager è possibile definire le seguenti regole di accesso: • Esportabile o Non-Esportabile Solo per i dati che sono contrassegnati come esportabili, il Key Manager restituisce il valore in chiaro del contenuto. Altrimenti, mette a disposizione del client delle funzioni crittografiche per poter utilizzare le chiavi ed i dati, senza rivelarne il valore in chiaro. 85 Informazioni provenienti da una conversazione privata con Kidong Kim ([email protected]) autore del codice del Secure Storage. 86 Sorgente immagine: https://developer.tizen.org/dev-guide/native/2.3.0/org.tizen.mobile.native.appprogramming/html/ 82 • Protezione con password Tutti i dati nel Key Manager sono protetti dalla password dell’utente. Inoltre, un client può cifrare i dati usando una password addizionale, fornita al momento dell’inserimento. Per ottenere i dati sarà necessario inserire la password ogni volta. Accesso ai dati Per default, solo il proprietario dei dati può accedere ai propri dati. Se il proprietario fornisce l’accesso ad altre applicazioni, queste hanno il diritto di leggere e rimuovere i dati dal database. In ogni caso, quando un’applicazione viene cancellata, i dati e le informazioni sul controllo degli accessi ad essa collegati, sono rimossi. Figura 32: Schema delle operazioni al login ed al cambiamento di password dell’utente.87 User login e logout. Quando un utente effettua il login, il logout o cambia la propria password, il LockScreen (4.10) e l’applicazione di Setting notificano il Key Manager tramite specifiche API 88 . Quando un utente effettua il login per la prima volta, figura 33, viene generata casualmente la chiave DKEK (Domain Key Encryption Key). Se l’utente si scollega, logout, il DKEK viene cifrato con AES 256 bit con modalità GCM e salvato in memoria secondaria. La chiave utilizzata nell’operazione di cifratura è la PKEK1, quest’ultima viene generata tramite la tecnica PBKDF2 89 , utilizzando HMAC-SHA512 con 4096 iterazioni, a partire dalla password dell’utente unita con un Salt. In riferimento a figura 32, al momento del login il Key Manager decifra il DKEK : viene utilizzata la password dell’utente con un procedimento identico a quello descritto precedentemente per la cifratura. Quando l’utente è loggato, la chiave DKEK si trova in chiaro in memoria. Al momento di logout il Key Manager rimuove il DKEK dell’utente dalla memoria, quindi non è più possibile accedere ai dati cifrati. Se l’utente cambia la propria password, il Key Manager cifra il DKEK con la nuova password. 87 Sorgente immagine: https://wiki.tizen.org/w/images/a/a6/Key-manager-login.png Per “login” si intente lo sblocco del dispositivo con password. 89 Password-Based Key Derivation Function 2 è una funzione in grado di derivare automaticamente una o più chiavi segrete a partire da una password, usando una funzione di hash. 90 Sorgente immagine: https://wiki.tizen.org/w/images/2/2a/Key-manager-keyhierarchy.png 88 83 Figura 33: Dettagli di funzionamento del Key Manager.90 Funzionamento Il Key Manager fa uso di due chiavi per cifrari i dati dell’utente e delle applicazioni: • DDEK (Data Encryption Key for DB) è la chiave con cui viene cifrato il database di un utente. • ADEK (Application Data Encryption Key) è una chiave che viene allocata per ciascuna applicazione, utilizzata per cifrare i propri dati. Con riferimento alla Figura 33, vengono di seguito forniti ulteriori dettagli sul funzionamento del Key Manager. Le chiavi DDEK e ADEK vengono generate casualmente quando l’utente effettua il login per la prima volta. Durante il periodo di login dell’utente sono salvate in chiaro in memoria. Quando l’utente si scollega, vengono cifrate con AES 256 bit con modalità GCM, per essere salvate in modo sicuro in memoria secondaria. La chiave utilizzata è PKEK2 generata a partire da DKEK [riferimento al paragrafo precedente], tramite la tecnica PBKDF2, utilizzando HMAC-SHA512 con un numero di iterazioni pari a 4096 91 . Ulteriori dettagli Di seguito alcuni dettagli sul Key Manager ricavati dalla lettura codice sorgente 92 : • Il database di un utente cifrato viene salvato nel file /opt/data/ckm/db-uid. • La chiave di un utente DKEK cifrata viene salvata nel file /opt/data/ckm/key-uid. • La chiave di un utente DDEK cifrata viene salvata nel file /opt/data/ckm/db-key-uid. 91 Informazioni dettagliate sul funzionamento del Key Manager sono state ottenute anche dalla lettura del codice sorgente. 92 https://review.tizen.org/git/?p=platform/core/security/key-manager.git;a=summary 84 • Nei path precedenti, il suffisso finale uid corrisponde con lo user id dell’utente attualmente loggato. 4.9.2 Secure Storage Secure storage è una tecnologia per il salvataggio sicuro dei dati utilizzato sia dai moduli della piattaforma Tizen, che dalle applicazioni [111]. I dati confidenziali sono salvati in forma cifrata utilizzando l’algoritmo di cifratura simmetrica AES-128 bit con modalità CBC (Cipher Block Chaining) 93 facendo uso della libreria OpenSSL. La chiave viene generata alla prima esecuzione del secure-storage server e successivamente salvata in chiaro 94 in un file il cui path viene specificato nel campo MASTER KEY PATH nel file di configurazione /usr/share/secure-storage/config. In seguito alla richiesta di informazioni allo sviluppatore 95 circa questa possibile vulnerabilità di sicurezza, è stato risposto che il file è nascosto ed i permessi sono impostati consentono al solo utente root di accedervi. Inoltre la chiave può essere sostituita con una hardware-fused key nel caso in cui fosse disponibile una Trustzone nel dispositivo Tizen. Le applicazioni accedono al servizio utilizzando le secure-storage client API per salvare, leggere dati ed ottenere informazioni sui file salvati nel Secure Storage. La comunicazione con il securestorage server viene assicurata da meccanismi di Inter Process Communication. Quest’ultimo verifica l’identità del chiamante utilizzando l’etichetta Smack del secure-storage client, se va a buon fine, esegue l’operazione richiesta. La chiave utilizzata per cifrare le applicazioni web 4.8.1, per proteggere il codice sorgente, viene salvata nel Secure Storage. 4.9.3 Content Security and Reputation Framework Dalla versione 2.1, Tizen integra il Content Security and Reputation Framework (CSF), presentato da Samsung ed Intel in collaborazione con McAfee [112] [113]. Si tratta di un Framework per la scansione di dati e la classificazione di URL. Espone una collezione di API che possono essere utilizzate per creare dei servizi volti ad incrementare la sicurezza del dispositivo. Nel framework sono pensati due tipi di motori di scansione: scan engine e site engine [114]. Il primo è pensato per ispezionare il contenuto di applicazioni, file e dati in memoria e può essere utilizzato per la ricerca di Malware, Virus, Trojan e Spam. Il secondo adotta un sistema per la reputazione dei siti web, in cui gli URL vengono classificati e vengono create delle policy di accesso per ciascuna categoria (es. gioco d’azzardo, pornografia, spyware, etc.). La sicurezza nei sistemi operativi mobile si è da sempre focalizzata sul controllo degli accessi, nel tentativo di contenere i danni di un attacco. Tuttavia il problema della diffusione del malware sulle piattaforme mobili [Introduzione 1.2.3] rende necessario adottare soluzioni preventive, come la scansione dei file alla ricerca di signatures note, nonostante alcune limitazioni imposte dalla capacità computazionale e dal consumo energetico [Introduzione 1.2.5]. 93 Data la carenza di materiale informativo sul Secure-storage, informazioni tecniche sono state estrapolate dalla lettura del codice sorgente. 94 Testato su emulatore. 95 Kidong Kim ([email protected]) autore del codice del Secure Storage. 96 Sorgente immagine: http://cdn.download.tizen.org/misc/media/conference2013/slides/ TDC2013-Content Security Framework.pdf 85 Figura 34: Schema dell’architettura del Content Security and Reputation Framework.96 Sebbene l’idea non sia nuova, difatti è alla base di tutti i software anti-virus, il modo in cui questa è stata sviluppata nella piattaforma Tizen la rende straordinariamente interessante. Il CSF è direttamente integrato nella componente di sicurezza del Core del sistema operativo [Architettura 4.3.2], a differenza delle tradizionali soluzioni anti-virus operano a livello applicativo. Inoltre, per quanto riguarda la navigazione web, si vuole offrire un’esperienza più sicura, con soluzione di sicurezza che mira a mitigare le minacce che sfruttano il fattore sociale (social-engineering) portando l’utente a seguire link tendenziosi [Introduzione 1.2.5]. Il Content Security Framework è stato realizzato sul principio della leggerezza, di un’interfaccia API unificata e di essere action driven: le applicazioni possono iniziare l’operazione di scansione di ciò che desiderano, quando preferiscono. In aggiunta, essendo consapevoli dei dati che gestiscono, è possibile bilanciare l’esigenza di sicurezza e di performance. Il CSF, essendo un Framework, non offre un’implementazione del motore di scansione, che viene invece fornita dal Security Engine Plug-In. La Tizen Association si limita a fornire delle linee guida sulla sua realizzazione, ma ciascun membro può svilupparne la reale implementazione, operando libere scelte sulla frequenza della scansione e sulla capacità computazionale richiesta. L’utente rimane libero di scegliere un’implementazione alternativa rispetto a quella a lui proposta dall’OEM [115]. Inoltre, più Security Engines possono coesistere nella piattaforma, anche se ciascuna applicazione può fare accesso ad un solo alla volta, ma può anche non esserne presente alcuno. In Figura 34 è mostrato lo schema dell’architettura del CSF. Il Content Security Framework offre un insieme di Security API per le applicazioni utente e di sistema, un’interfaccia unificata per gli sviluppatori del Security Engine Plug-In ed un meccanismo per la gestione dei plug-in. In seguito vengono analizzati con maggiore dettaglio i motori di scansione che compongono il Security Engine [116]. 97 Sorgente immagine: http://cdn.download.tizen.org/misc/media/conference2013/slides/ TDC2013-Content Security Framework.pdf 86 Figura 35: Riepilogo delle operazioni di scansione e rilevamento malware.97 Scanning Engine - Content Security Engine L’implementazione è specifica del fornitore del “Security Engine Plug-In”. Si ipotizza che l’operazione di scansione possa basarsi sulla ricerca signatures note, oppure di pattern comportamentali noti, impiegando meccanismi euristici. In alternativa, per venire incontro alle limitazioni del dispositivo, si può decentralizzare la ricerca, con connessione al cloud del fornitore della soluzione di sicurezza. Le applicazioni client possono decidere autonomamente quando effettuare l’operazione di scansione, ad esempio validando il codice JavaScript prima del rendering di una pagina HTML. I dati da controllare vengono passati al Framework con l’informazione sul tipo e le loro caratteristiche. Poter gestire in modo personalizzato il rilevamento di una minaccia è tutto a vantaggio dell’utente, al quale viene offerta una migliore user experience. Site Engine - URL Security Agent Fornisce un insieme API di per ottenere informazioni sulla reputazione di un sito Web. Il fornitore del plug-in di sicurezza si occupa della classificazione e della definizione delle politiche di accesso. In seguito al rilevamento di una minaccia, come mostrato in Figura 35, l’accesso all’utente può essere bloccato o essere rediretto ad una pagina di notifica. Di seguito, viene presentato un esempio di utilizzo, scritto in linguaggio C. // I n i z i a l i z z a z i o n e TCSLIB HANDLE hLib ; TCSErrorCode ErrCode ; TCSScanResult S c a n R e s u l t ; hLib = TCSLibraryOpen ( ) ; i f ( hLib == INVALID TCSLIB HANDLE) { return −1; } // S c a n s i o n e d e i d a t i i f ( TCSScanData ( hLib , &ScanParam , &S c a n R e s u l t ) == 0 ) { ... 87 } // G e s t i o n e d e i r i s u l t a t i i f ( S c a n R e s u l t . iNumDetected > 0 ) { // R ile va me nt o d i una minaccia S c a n R e s u l t . p f F r e e R e s u l t (& S c a n R e s u l t ) ; } TCSLibraryClose ( hLib ) ; Alcuni dettagli aggiuntivi Il Security Plug-In viene installato insieme ai pacchetti applicativi di sicurezza e deve essere firmato con un trusted certificate per verificare l’autorizzazione. Deve essere progettato e sviluppato per supportare la scansione simultanea da parte di molteplici thread. Il framework è implementato tramite librerie condivise: il Content Security Framework in libsecfw.so, il Security Engine Plug-In in libengine.so. Entrambe vengono caricate a run-time nello spazio di indirizzamento del processo che invoca le Security API. 4.9.4 Wifi Security In Tizen, Connection Manager (ConnMan) è il demone per la gestione della connettività di rete. È comunemente usato nei sistemi embedded che eseguono il kernel Linux. L’architettura WLAN di Tizen è centrata sul sottosistema wireless di Linux IEEE-802.11 98 costituito dai componenti cfg80211 e mac80211. ConnMan utilizza wpa supplicant per interfacciarsi con il dispositivo Wi-Fi [117]. Per ogni rete wireless a cui ci si collega, ConnMan salva le password in chiaro nel file /var/lib/connman/default.profile [118], come mostrato nel seguente esempio: [ service home ] Type = w i f i Name = yourSSID S e c u r i t y = wpa2−psk P a s s p h r a s e = y ourP assP hras e wpa supplicant supporta gli standard WPA e WPA2: implementa e gestisce l’autenticazione, l’associazione e la negoziazione delle chiavi del driver WLAN con un autenticatore WPA, come definito dallo standard IEEE 802.11. Il modulo wpa supplicant, comune agli altri sistemi operativi analizzati nel report, viene analizzato in Appendice 6.2.2. 4.9.5 Gestione dei certificati SSL La piattaforma Tizen fornisce una collezione di certificati delle Certification Authority considerate trusted a livello di sistema per essere utilizzati da SSL (Secure Socket Layer) [119]. Le cartelle /etc/ssl/certs e /opt/share/cert-svc/certs/ssl sono link simbolici al direttorio /opt/etc/ssl/certs dove sono salvati tutti i certificati system trusted in formato PEM. Il nome di ciascun file è il valore di hash del soggetto, che può essere ottenuto utilizzando il comando OpenSSL come nell’esempio seguente: o p e n s s l x509 −s u b j e c t h a s h o l d −noout 98 http://linuxwireless.org/welcome/ 88 −i n c e r t i f i c a t o i n i n p u t Inoltre, in Tizen, il file ca-certificate.crt ha al suo interno salvati tutti i certificati delle Certification Authority system trusted. Di seguito ne viene riportato un estratto. sh −3.2# c a t / o p t / s h a r e / c e r t −s v c / ca−c e r t i f i c a t e . c r t −−−−−BEGIN CERTIFICATE−−−−− MIIEEjCCAvqgAwIBAgIPAMEAizw8iBHRPvZj7N9AMA0GCSqGSIb3DQEBBAUAMHAx KzApBgNVBAsTIkNvcHlyaWdodCAoYykgMTk5NyBNaWNyb3NvZnQgQ29ycC4xHjAc BgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0 ... ... BOSoRQTIWjM4bk0cDWK3CqKM09VUP0bNHFWmcNsSOoeTdZ+n0qA= −−−−−END CERTIFICATE−−−−− −−−−−BEGIN CERTIFICATE−−−−− MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf ... ... In Tizen i certificati delle Certification Authority system trusted sono protetti da privilegi di root. Anche se tutti gli utenti possono leggerli, sono l’utente root può modificarli. Nel menù impostazioni, alla voce Sicurezza [120], è disponibile un’interfaccia grafica per la visualizzazione dei Trusted root CA certificates e per la gestione dei certificati Utente, Figura 36. Figura 36: Pagina principale del menù Impostazioni/Security.99 La prima opzione permette di visualizzare la lista ed i dettagli dei certificati salvati nel direttorio /opt/etc/ssl/certs/, Figura 37. Il menù per la gestione dei certificati utente permette l’inserzione e l’eliminazione di certificati nella cartella /opt/share/cert-svc/pkcs12, Figura 38. Il formato dei certificati che possono essere gestiti è limitato a PKCS12. 99 Sorgente immagine: https://wiki.tizen.org/wiki/Security/Tizen 2.X cert-svc-ui Sorgente immagine: https://wiki.tizen.org/wiki/Security/Tizen 2.X cert-svc-ui 101 Sorgente immagine: https://wiki.tizen.org/wiki/Security/Tizen 2.X cert-svc-ui 100 89 (a) Prima figura (b) Seconda figura Figura 37: Visualizzazione dei certificati Trusted Root100 Figura 38: Interfaccia di gestione dei certificati utente.101 4.9.6 Tecniche di mitigazione degli exploit Dalla versione 2.x Tizen supporta le applicazioni native, scritte in C/C++. Dal punto di vista della sicurezza, il principale svantaggio è la possibile introduzione di vulnerabilità di tipo Stack e Heap overflow ed underflow, format string, overflow degli indici dei vettori e variabili non inizializzate. Per combattere possibili attacchi, sia a livello di sistema operativo, che applicativo, la piattaforma Tizen offre una soluzione di mitigazione basata sull’utilizzo congiunto di ASLR e DEP. 90 ASLR e DEP Address space layout randomization (ASLR) e Data Execution Prevention (DEP) sono tecniche di mitigazione per gli exploit che sfruttano vulnerabilità esistenti non ancora risolte [121]. ASLR e DEP non sono sostituti di un codice non sicuro, ma offrono protezione per quelle vulnerabilità che non sono ancora state scoperte o pubblicate, riducendo la probabilità di successo degli attacchi che prevedono la diretta manipolazione della memoria. Per una breve descrizione sull’importanza e sul funzionamento di ASLR e DEP, fare riferimento in Appendice alle sezioni 6.3 e 6.4. ASLR in Tizen Nei dispositivi mobili, l’utilizzo di ASLR, incontra alcuni ostacoli. I sistemi operativi per smartphone tentano di minimizzare il tempo di boot e di lancio delle applicazioni, il consumo della batteria ed il footprint della memoria. Queste ottimizzazioni rendono l’implementazione tradizionale di ASLR insufficiente [122]. Nella piattaforma Tizen, non si è a conoscenza se tutti i componenti, deputati al funzionamento di ASLR, siano implementati correttamente. Se ciò non fosse, un’implementazione incompleta potrebbe lasciare aperta la strada ad attacchi che utilizzano indirizzi di ritorno che puntano ad aree di memoria non randomizzate. Nella documentazione, ASLR viene indicato come implementato a partire dalla versione di Tizen 2.1. Nella sezione 4.12.2, vengono presentati i risultati di alcuni test sperimentali su ASLR. DEP in Tizen Data Execution Prevention, di default, non è completamente abilitato in Tizen. I test su emulatore lo confermano. Per ulteriori dettagli sui test sperimentali, fare riferimenti alla sezione 4.12.3. Conclusione sulle tecniche di mitigazione ASLR e DEP dovrebbero essere sempre abilitati, anche se il loro utilizzo comporta un rallentamento del sistema. Per ottenere una difesa superiore, andrebbero utilizzati in complemento con altre tecniche di mitigazione: estensioni del compilatore, come StackGuard102 ed utilizzo di librerie wrapper, come Libsafe103 . Tuttavia, le prime, per aver effetto, richiedono la ricompilazione di ogni file binario e le seconde potrebbero non essere compatibili con tutti i programmi. 4.10 Protezione dell’accesso Tizen fornisce un set di API [125] [126] per la gestione del blocco dello schermo, con o senza password, ma il sistema operativo non rende disponibile alcuna applicazione che le implementi. Anche nelle impostazioni di sicurezza dell’emulatore, non compare nessuna opzione a riguardo. Implementazioni del LockScreen (schermata di blocco) sono fornite dall’OEM del dispositivo. Ad esempio Samsung [127], nella versione dello smartphone SM-Z130h, fornisce 3 diverse opzioni 102 Nel 1997 venne introdotto StackGuard, un meccanismo volto a combattere gli attacchi buffer overflow su stack. La protezione si basa sull’utilizzo del canary, chiamato anche cookie, modificato dinamicamente e salvato prima del valore di ritorno. Un tentativo di modifica dell’indirizzo di ritorno, modificherà anche il valore del canary, che causerà la terminazione del programma [123]. 103 Libsafe previene gli exploit che tentano di sfruttare le vulnerabilità di tipo format string. Libsafe è una libreria wrapper, che include una versione più sicura di alcune funzioni vulnerabili, come sprintf(). Se gli argomenti passati alla funzione wrapper sono ritenuti sicuri, allora viene chiama l’originale, altrimenti viene terminato il programma preventivamente [124]. 104 Sorgente immagine: https://developer.tizen.org/sites/default/files/images/uioverview lock screen.png 91 Figura 39: Stack delle Viste della schermata di blocco.104 per lo sblocco dello schermo del dispositivo: swipe, pin e password. Di queste solo due, il pin (numerico) e la password (alfanumerica), forniscono una protezione sicura nell’accesso, la prima viene usata solo per scongiurare un uso involontario. In figura 39 viene mostrato lo stack delle viste quando il dispositivo è bloccato: se il LockScreen è attivo, è comunque possibile visualizzare delle notifiche. La piattaforma Tizen non fornisce alcun meccanismo per il blocco del dispositivo e la cancellazione dei dati da remoto. È ragionevole aspettarsi soluzioni proprietarie, fornite dall’OEM del dispositivo. 4.11 Vulnerabilità note È disponibile un sistema di “bug tracking”105 dove, per la prima volta, è comparsa l’unica vulnerabilità di Tizen nota. A quest’ultima è stato assegnato un identificativo CVE (Common Vulnerabilities and Exposures). CVE-2012-6459 ConnMan 1.3, in Tizen, continua a far visualizzare il bluetooth come servizio disponibile anche dopo che la modalità offline è stata abilitata [128]. ConnMan è un demone di sistema incaricato della gestione dei servizi di connettività [Architettura 4.3]. Attaccanti remoti potrebbero ottenere informazioni sensibili tramite i pacchetti Bluetooth. Il problema è stato risolto nella versione di ConnMan 1.5. Ne è affetta la versione Tizen IVI 2.11 e la vulnerabilità è stata resa nota il 1 Gennaio 2013 [129]. 105 https://bugs.tizen.org/ 92 4.12 Analisi Sperimentale Per l’analisi sperimentale, è stata creata una semplice applicazione Web, successivamente eseguita sull’emulatore. Tramite il tool Smart Development Bridge (SDB), è stato possibile ottenere una shell sul dispositivo con utente root (altrimenti non sarebbe stato possibile eseguire nessuno dei comandi di seguito citati). La versione di Tizen testata è la 2.3. 4.12.1 Test Smack label Il comando ls -lZ, eseguito nella home dell’applicazione, permette di visualizzare il security context (l’etichetta) ed altre informazioni associate alle cartelle in formato esteso. sh −4.1# l s drwxr−xr−x drwx−−−−−− drwxr−xr−x drwxr−xr−x drwx−−−−−− −l Z 2 root 3 app 3 root 5 root 2 app root app root root app p9SmpN6Z2i 4096 Mar 22 p9SmpN6Z2i 4096 Mar 22 p9SmpN6Z2i 4096 Mar 22 4096 Mar 22 p9SmpN6Z2i 4096 Mar 22 08:11 08:12 08:11 08:11 08:11 bin data res shared tmp Dall’analisi dell’output è possibile verificare il modello di gestione dei permessi e di assegnazione delle etichette, spiegato in sezione 4.5. Gestione dei permessi Dalla seconda colonna dell’output del comando ls, è possibile notare la presenza dei due utenti di Tizen 2.X: l’utente root ed app. Il primo è proprietario di tutti i direttori, ad eccezione di data e tmp di proprietà dell’utente app. I permessi sono impostati in accordo con quanto spiegato in 4.5.3. Da notare che solo l’applicazione stessa ha libero accesso in lettura (r) e scrittura (w) ai propri dati (data) ed ai file temporanei (tmp). Assegnazione di etichette Smack Alle cartelle bin, data, res e tmp viene associata l’etichetta p9SmpN6Z2i 106 , invece a shared, l’etichetta floor ( ). Come descritto nel paragrafo 4.5.2, associare l’etichetta p9SmpN6Z2i all’applicazione permette di implementare il Sandboxing: solo il processo etichettato p9SmpN6Z2i potrà accedere alle risorse dell’applicazione. Viceversa, l’utilizzo dell’etichetta floor ( ) consente sempre accesso in lettura [Smack 4.5.1], permettendo di implementare una soluzione di condivisione tra le applicazioni senza necessità di definire nuove regole Smack più specifiche ad ogni nuova installazione. 4.12.2 Test ASLR ASLR in Tizen è abilitato a livello kernel, infatti eseguendo il comando: cat /proc/sys/kernel/randomize va space il risultato è 2, indicando la completa randomizzazione dello spazio di indirizzamento di un processo. Tuttavia, in Tizen 2.1 [130], il valore di /proc/self/personality era settato a 00040000, che corrispondeva a ADDR NO RANDOMIZE, cioè ASLR disabilitato. Il problema è stato successivamente risolto in Tizen 2.2 dove il valore di /proc/self/personality è stato impostato a 00000000. Per controllare se effettivamente ASLR fosse funzionante, si è deciso di eseguire la stessa applicazione di test più volte e di utilizzare il comando 106 L’ApplicationID assegnato all’applicazione è p9SmpN6Z2i.SMSa. 93 cat /proc/[pid]/maps per monitorare il posizionamento dello stack e dello heap nello spazio di indirizzamento. Prima esecuzione: sh −4.1# c a t / pro c /2500/ maps | g r e p −E ’ v d s o | heap | s t a c k | Web ’ 08048000 −08049000 r−xp 00000000 f e : 0 0 4524 / u s r / b i n / WebProcess 08049000 −0804 a000 rw−p 00001000 f e : 0 0 4524 / u s r / b i n / WebProcess 0924 a000 −0946 e000 rw−p 00000000 0 0 : 0 0 0 [ heap ] b0f9b000−b179b000 rwxp 00000000 0 0 : 0 0 0 [ stack :2505] b179c000−b 1 f 9 c 0 0 0 rwxp 00000000 0 0 : 0 0 0 [ stack :2504] b2456000−b2c56000 rwxp 00000000 0 0 : 0 0 0 [ stack :2503] b7720000−b7721000 r−xp 00000000 0 0 : 0 0 0 [ vdso ] bfe5d000−b f e 7 e 0 0 0 rwxp 00000000 0 0 : 0 0 0 [ stack ] Seconda esecuzione: sh −4.1# c a t / pro c /2601/ maps | g r e p −E ’ v d s o | heap | s t a c k ’ 09319000 −09519000 rw−p 00000000 0 0 : 0 0 0 [ heap ] b0f95000−b1795000 rwxp 00000000 0 0 : 0 0 0 [ stack :2607] b1796000−b 1 f 9 6 0 0 0 rwxp 00000000 0 0 : 0 0 0 [ stack :2605] b2450000−b2c50000 rwxp 00000000 0 0 : 0 0 0 [ stack :2604] b771a000−b771b000 r−xp 00000000 0 0 : 0 0 0 [ vdso ] bfc32000 −b f c 5 3 0 0 0 rwxp 00000000 0 0 : 0 0 0 [ stack ] Terza esecuzione: sh −4.1# c a t / pro c /2625/ maps | g r e p −E ’ v d s o | heap | s t a c k ’ 08998000 −08 b98000 rw−p 00000000 0 0 : 0 0 0 [ heap ] b1023000−b1823000 rwxp 00000000 0 0 : 0 0 0 [ stack :2631] b1824000−b2024000 rwxp 00000000 0 0 : 0 0 0 [ stack :2630] b24de000−b2cde000 rwxp 00000000 0 0 : 0 0 0 [ stack :2629] b77a8000−b77a9000 r−xp 00000000 0 0 : 0 0 0 [ vdso ] bfdd9000−b f d f 9 0 0 0 rwxp 00000000 0 0 : 0 0 0 [ stack ] Dall’output è evidente come lo stack, lo heap e vDSO107 cambino il loro indirizzo di memoria (indicato nella prima colonna a sinistra) ad ogni esecuzione, dunque è possibile affermare che ASLR è attivo. 4.12.3 Test DEP Lo stesso comando utilizzato nel test di ASLR, cat /proc/self/maps — grep -E ’(stack — heap)’, può essere usato anche per verificare se DEP è abilitato. Osservando parte dell’output del test di ASLR, in particolare i campi sui permessi (ultima colonna a destra) 08998000 −08 b98000 rw−p 00000000 0 0 : 0 0 0 b1023000−b1823000 rwxp 00000000 0 0 : 0 0 0 [ heap ] [ stack :2631] si nota come che lo stack, a differenza dell’heap, sia impostato come eseguibile (x), dunque DEP non è abilitato. 107 http://man7.org/linux/man-pages/man7/vdso.7.html 94 4.13 Conclusioni In Tizen la sicurezza è un fattore dominante ed è stata presa seriamente in considerazione in fase di progettazione. Dall’architettura al processo di revisione delle applicazioni, in tutto si può riconoscere l’impegno di avere adottato le migliori soluzioni e di avere saputo trarre insegnamenti dalle minacce esistenti nel panorama mobile degli ultimi anni. Il software è completamente open source, in gran parte ereditato da progetti con una lunga storia alle spalle e maturi dal punto di vista della sicurezza. Tizen è un laboratorio sperimentale in cui sono state proposte soluzioni di sicurezza completamente innovative. La sua storia lo rende unico ed incredibilmente favorito sotto l’aspetto progettuale e della sicurezza in particolare. È il risultato della fusione di diversi sistemi operativi, provenienti da ambienti diversi, con differenti background e priorità distinte. Solo le migliori tecnologie, tra quelle disponibili, sono state scelte e dove nulla era presente sono state adottate nuove soluzioni. Il Content Security Framework [4.9.3] e Vasum [4.5.11] ne sono un esempio e sono cosı̀ interessanti da poter essere proposta la loro adozione in altri sistemi operativi Mobile. Per certi aspetti la sicurezza in Tizen può essere definita complessa, nonostante le idee di base, come l’utilizzo di etichette per il controllo degli accessi e la definizione di “privilegi astratti” per le operazioni sensibili, siano molto semplici. Nella release 2.0 di Tizen, un tentativo di semplificazione ha portato le regole Smack a crescere fino al numero di 40000, rendendole ingestibili. Nella 3.0, con l’adozione del “Three domain model” le regole diminuiscono, ma vengono aggiunti nuovi componenti: Cynara ed il Security Manager. In futuro per supportare nuove funzionalità, come il multi-utente [57], sarà necessario introdurne altri. Esiste, comunque, un margine di miglioramento, rendendo obbligatorie molte scelte opzionali, come l’utilizzo di Data Execution Prevention [4.12.3] ed integrando nell’IDE nuovi tool per la prevenzione di attacchi di tipo Cross Site Scripting [4.6.3]. Non sono date informazioni specifiche sul processo di revisione delle applicazioni pubblicate sullo Store e non è chiaro quali siano i criteri di filtraggio delle applicazioni over-privilegiate o malevoli. Nonostante dal punto di vista teorico, grazie all’implementazione sia del modello DAC che MAC, le soluzioni adottate siano più sicure di quelle utilizzate da Android ed iOS, Tizen rimane un progetto giovane, che non ha ancora raggiunto la maturità necessaria per essere definito più sicuro. Se la sua diffusione continuerà a crescere, la comunità internazionale dedicherà inevitabilmente sempre più attenzione e possibili falle saranno scoperte e risolte. Attualmente, il più grosso limite di Tizen è rappresentato dagli sviluppatori delle applicazioni, che non hanno ancora maturato un vero interesse verso questa piattaforma. In tal senso è da considerare molto interessante la soluzione proposta per permettere un’automatica conversione della maggioranza delle applicazioni sviluppate per Android [4.6.1]. 95 5 Conclusioni La seguente tabella riassume i punti di maggiore interesse dei tre sistemi operativi analizzati. Ubuntu Touch Nasce con l’intento di portare Ubuntu anche sui dispositivi mobile. L’idea alla base del suo sviluppo è di ottenere un sistema operativo congiunto mobile-desktop. Dal punto di vista della sicurezza vengono utilizzate soluzioni già esistenti (AppArmor) ed integrate con nuovi strumenti in grado di renderne più semplice l’utilizzo da parte degli sviluppatori (Policy Groups). È la stessa di Ubuntu 14.04 LTS con l’aggiunta di LXC, per la funzione di container per i driver Android, riutilizzati per l’interfacciamento con l’hardware. Rispetto alle versioni precedenti di Ubuntu, è stato modificata soprattutto Unity, l’interfaccia utente, adattata anche a schermi di formato diverso dagli standard desktop. QML (solo locale), HTML (locale o su web) CyanogenMod È una Mod di Android, cioè una “variante” maggiormente personalizzabile e con meno restrizioni, in grado di accontentare una fetta di utenza sempre crescente. Utilizza gli stessi meccanismi di sicurezza di Android, ma aggiunge un maggiore controllo sulla gestione dei permessi concessi alle applicazioni. Tizen È il risultato della fusione di diversi sistemi operativi esistenti. La sicurezza è un fattore dominante ed è stata presa seriamente in considerazione in fase di progettazione. Adotta le migliori soluzioni ed essendo il più giovane, fa tesoro dei progressi raggiunti, negli ultimi anni, dalla sicurezza in ambito mobile. È la stessa di Android. L’architettura è costituita da quattro componenti chiave: il Kernel (Linux), il Core (implementazione dei servizi di base), il Framework Web ed il Framework Nativo (a supporto dei rispettivi tipi di applicazione). Java, LUA108 , HTML Confinamento Basato su AppArmor (sul delle modello MAC). Gli svilupapplicazioni patori dichiarano all’interno di un file di manifest i privilegi di cui l’applicazione ha bisogno. Sulla base di questi viene generato automaticamente, al momento dell’installazione, il profilo AppArmor corrispondente. Basato sul modello DAC. Viene riutilizzato il sistema tradizionale dei permessi Unix basato sugli utenti: ogni applicazione ha un User Id diverso. Native (C++), Web (HTML, CSS e Javascript) ed Ibride (Web + Native) In Tizen 2.0, tramite l’utilizzo congiunto di Smack (modello MAC) e dell’assegnazione di permessi di accesso al file system, specifici per utenti e gruppi (modello DAC). In Tizen 3.0 si aggiunge un nuovo componente, Cynara, un policy checker. Origine Architettura Applicazioni supportate 108 Tramite Corona SDK [131]. 96 Gestione dei permessi delle applicazioni Sfrutta i Thrusted Helpers: servizi per la gestione dell’accesso alle risorse di sistema da parte di un’applicazione. La comunicazione con i Thrusted Helpers è possibile solo se il profilo AppArmor lo consente. Questi servizi mostrano all’utente un prompt di richiesta autorizzazione, memorizzando la scelta, che comunque rimane modificabile in seguito. Distribuzione Ubuntu Apps Directory applicazioni e fonti aggiunte manualmente. Secondo il modello Android i permessi vengono concessi solo al momento dell’installazione e non sono più modificabili. CyanogenMod funziona allo stesso modo, ma consente successivamente di rimuovere determinati permessi. Allo stesso tempo, permette di elevare i privilegi di una applicazione a quelli di amministratore, al fine di consentire le funzionalità aggiuntive che lo distinguono da Android. Google Play Store e fonti aggiunte manualmente. Le applicazioni dichiarano i permessi richiesti nel file di Manifest, ma quelli realmente concessi dipendono dalla tipologia di firma utilizzata dal distributore. Tramite il pannello Privacy Manager nel menù Settings, è possibile a posteriori la modifica delle regole di accesso. Verifica delle applicazioni nello Store Processo automatico o manuale a seconda delle autorizzazioni richieste tramite i Policy Groups. Processo in parte automatico ed in parte manuale Firma delle applicazioni Esecuzione delle applicazioni come utente root 110 Mercato delle applicazioni Store e, opzionalmente, sviluppatore.109 NO Solo sviluppatore.109 SI Lo store ufficiale di Tizen è il TizenStore. Distributori alternativi sono possibili, purché la firma utilizzata sia riconosciuta dal sistema operativo. Il processo di revisione del TizenStore richiede due fasi: la prima, Initial Inspection & Dynamic Analysis, è principalmente automatizzata, la seconda, Content Review & Final Confirmation, viene eseguita da un revisore finale. Firma dell’autore e del distributore NO Molto piccolo Molto grande Medio Tabella 2: Tabella di confronto tra i tre sistemi analizzati. Nel corso dell’analisi è stato dimostrato come anche i sistemi operativi mobile meno diffusi (collettivamente quelli analizzati rappresentano meno dell’1% del mercato) facciano della sicurezza un aspetto centrale della progettazione. I numerosi canali di attacco, di cui si è parlato nell’Introduzione 1.2.3, rendono difficile affrontare il problema della sicurezza puntualmente per ogni minaccia e poiché il malware oggi riveste un’importanza particolare, ciò che accomuna tutti e 109 110 Non è richiesto per le app scaricate da fonti non ufficiali. Si intende la possibilità di dare alle applicazioni privilegi di amministratore. 97 tre i sistemi analizzati, è l’isolamento delle applicazioni. Le tecniche di confinamento permettono di risolvere in un’unica soluzione diversi problemi di sicurezza. È interessante notare, come mostrato in Tabella 5, che i tre sistemi operativi adottino tutti soluzioni differenti, nonostante l’idea di base sia condivisa. Mentre Ubuntu Touch e CyanogenMod utilizzano soluzioni già esistenti, in Tizen si è scelto di adottare nuovi componenti, anche se in parte basati su modelli noti. In tutti e tre i sistemi analizzati esiste la volontà di semplificare la gestione della sicurezza, sia dal lato utente che sviluppatore. Il primo caso è testimoniato dalla capacità di mostrare, in modo facilmente comprensibile, i permessi associati ad una applicazione e di fornire interfacce intuitive per la loro gestione. Inoltre, in tutti e tre i sistemi operativi, i permessi sono stati definiti sulla base di servizi astratti e non dei componenti di sistema che li implementano, facilitandone la comprensione. Ubuntu Touch mostra i privilegi di un’applicazione sia in fase di installazione, che al momento del primo utilizzo. CyanogenMod li mostra solo in fase di installazione, ma consente di modificarli in un secondo momento. Al momento dell’installazione Tizen non richiede all’utente di accettare i privilegi di un’applicazione, ma ne permette la gestione a posteriori. A proposito, si sottolinea che mentre le applicazioni per Ubuntu Touch e Tizen sono in grado di gestire il caso in cui venga revocato un permesso, quelle per CyanogenMod, essendo le stesse di Android, non possiedono normalmente questa capacità. Dunque, in CyanogenMod revocare alcuni privilegi successivamente all’installazione rischia di minare l’instabilità di un’applicazione. Dal punto di vista dello sviluppatore, la gestione della sicurezza è semplifica in quasi tutti i sistemi, anche grazie all’impiego di SDK evoluti (l’SDK di CyanogenMod è lo stesso di Android). UbuntuTouch mette a disposizione semplici strumenti per specificare i permessi necessari all’applicazione in sviluppo. Al contrario, in Tizen ci sono dei margini di miglioramento, soprattutto per agevolare la scrittura di codice sicuro, come spiegato in 4.6.3. Dal punto di vista della sicurezza offerta dalla distribuzione ed installazione delle applicazioni, sono emersi tre diversi modelli: • CyanogenMod utilizza lo stesso negozio virtuale di Android, Google Play. Il processo di revisione è prevalentemente automatico, solo ultimamente è stato affiancato dalla possibilità di controllo manuale. È richiesto che le applicazioni siano firmate solo dallo sviluppatore. • In Ubuntu Touch le applicazioni sono sempre firmate dallo store che le distribuisce e, in modo opzionale, anche dallo sviluppatore. Anche in questo caso è prevista la possibilità di revisione manuale delle applicazioni. Non si è in possesso di dati concreti al riguardo, tuttavia si presuppone che gli strumenti di controllo automatico delle applicazioni, utilizzati nello store di Ubuntu Touch, non siano avanzati come quelli di Google Play, che al contrario vanta diversi anni di esperienza. • Tizen presenta il modello più sicuro: è richiesto infatti che l’applicazione sia firmata sia dallo sviluppatore, che dal distributore. Il Tizen Store sottopone i pacchetti applicativi ad un rigoroso processo di validazione del codice, analizzandoli con una combinazione di tecniche statiche e dinamiche. La verifica consta di due fasi, la prima è principalmente automatizzata, la seconda viene eseguita da un revisore finale. Dall’analisi emerge la caratteristica distintiva di CyanogenMod: l’unico a lasciare all’utente la possibilità di “fidarsi” di un’applicazione concedendole privilegi di amministratore. In queste condizioni, in caso di applicazione malevole, le conseguenze sarebbero devastanti. Ubuntu Touch e Tizen applicano un modello di sicurezza differente, dove l’utente non è fidato, vietando in principio la possibilità di concedere autorizzazioni potenzialmente dannose. 98 Al momento, i sistemi operativi trattati possiedono collettivamente una fetta molto piccola di un mercato dominato principalmente da Android ed iOS. Gli utenti sono sempre più alla ricerca di semplicità ed integrazione tra i dispositivi, ragione per cui si pensa che saranno solo i sistemi più diffusi a sopravvivere. Ubuntu Touch, dato il progetto di integrazione con Ubuntu, potrà diffondersi specialmente tra gli utilizzatori della versione desktop. Tizen è un sistema operativo giovane, attualmente impiegato solo in pochi dispositivi di fascia bassa, soprattutto nel mercato asiatico. Possiede tutti i presupposti necessari per ottenere, in futuro, una sua fascia di mercato. CyanogenMod, al contrario, è un sistema già affermato. Tuttavia, le possibilità di crescita sono ancora grandi, essendo l’unico in grado di accontentare le esigenze di una crescente fascia di utenti competenti, alla ricerca di innovazione. 99 6 Appendice 6.1 Memorizzazione dati critici Sia in ambiente mobile che desktop, le applicazioni possono avere il bisogno di salvare dati critici, come password, in modo “sicuro”. Sebbene ogni applicazione possa utilizzare una propria soluzione al problema, un sistema centralizzato di gestione dei dati critici, fornito dal sistema operativo, è conveniente sotto diversi aspetti: • Permette all’utente di avere una chiara visione e facile gestione dei dati critici salvati dalle varie applicazioni. • Concentrare la funzionalità in un unico modulo facilita il processo di aggiornamento nel caso in cui venisse scoperta una vulnerabilità. • Consente la condivisione di un segreto tra applicazioni. • Permette di utilizzare password più sicure (più lunghe e complesse) in quanto esse possono essere memorizzate in questo modulo e protette con un’unica password da ricordare. Tuttavia, proteggere più segreti con un’altro segreto determina che se un attaccante scoprisse il secondo avrebbe accesso a tutti gli altri. È dunque importante scegliere una password molto sicura a questo scopo. Soluzioni di questo tipo sono note con il nome “keyring”: un portachiavi, contenitore di segreti. In Linux, una soluzione di keyring molto diffusa, che sarà prossimamente adottata in Ubuntu Touch e che è attualmente inclusa in Tizen, è GNOME Keyring. Essendo una soluzione ideata per ambiente desktop, nella sua descrizione utilizzeremo il concetto di login, che in ambito mobile coincide con lo sblocco del dispositivo. 6.1.1 GNOME Keyring GNOME Keyring è un’applicazione demone111 per la gestione di dati critici. Viene utilizzato per la memorizzazione di segreti, password, chiavi, certificati, resi disponibili alle applicazioni che vi accedono tramite apposite API. I dati sensibili sono cifrati e memorizzati in file situati nella cartella home dell’utente112 . Lo scopo di GNOME Keyring è di proteggere l’utente da: • Furto di password dal dispositivo nel momento in cui è spento accedendo fisicamente alla memoria secondaria (hard disk). • Lettura delle password dalla memoria RAM dopo che l’utente ha effettuato il logout, oppure dall’area di swap del disco. • Lettura di keyring appartenente ad un altro utente113 . • Furto di passwords da keyring bloccati. 111 Nei sistemi Unix, e più in generale nei sistemi operativi multitasking, un demone (daemon in inglese) è un programma eseguito in background, che fornisce un servizio. 112 I sistemi operativi analizzati in questo report sono tutti basati su Linux ed utilizzano il Linux File System, caratterizzato da una cartella home per ogni utente. 113 Al momento i sistemi operativi mobili sono monoutente. Ubuntu Touch nella versione per tablet è in via di divenire multiutente [132]. Tizen 3.0 sarà un sistema multiutente. 100 Il demone può gestire diversi portachiavi, keyring, ciascuno associato ad un file diverso situato in /.gnome2/keyrings/ e con i propri segreti. Ogni portachiavi può trovarsi nello stato bloccato o sbloccato. Nel primo caso, il corrispondente file è cifrato tramite l’algoritmo AES-128 bit. La chiave di cifratura è ricavata da quella specificata dall’utente al momento della creazione del keyring, combinata con un sale, su cui è eseguito iterativamente (in numero compreso tra 1000 e 2000) l’algoritmo di hash SHA-256. Nel momento in cui un keyring viene sbloccato (sotto richiesta di una applicazione tramite le API a disposizione, oppure automaticamente al login, come descritto in seguito), viene decifrato ed il risultato, in plain text, viene caricato in RAM. Avere il contenuto di un keyring in chiaro in RAM può essere rischioso dal punto di vista della sicurezza. Infatti, sarebbe soggetto ad attacchi che sfruttano memory dumping e swapping 114 . Quest’ultima operazione potrebbe scrivere sull’hard disk dati sensibili in chiaro: avere accesso al disco fisico significherebbe avere accesso a tali dati. Al fine di eliminare questo rischio, GNOME Keyring utilizza la chiamata di sistema mlock() che consente di allocare in RAM una certa quantità di memoria non soggetta a swapping. In GNOME keyring, due portachiavi hanno funzioni particolari: • Il portachiavi di sessione. Non è associato ad alcun file in quanto non viene mai scritto su disco: viene creato al momento del login dell’utente, salvato in memoria RAM ed eliminato al logout. Le applicazioni possono utilizzarlo per salvare segreti temporanei. • Il portachiavi di default, chiamato “login”, protetto dalla stessa password di login. Al momento del login dell’utente, il modulo PAM (Pluggable Authentication Modules) comunica con GNOME Keyring e gli fornisce la password appena inserita al fine di decifrare automaticamente il keyring login, che è cosı̀ sbloccato. Il keyring viene poi automaticamente ri-bloccato al logout. I segreti sono memorizzati all’interno dei keyring sotto forma di items. Ogni item ha un nome, un segreto e una lista illimitata di attributi. Ogni attributo consiste in una coppia chiave-valore, che può essere utilizzata dalle applicazioni per la ricerca di tale segreto all’interno del keyring. Di seguito un esempio del contenuto di un keyring non cifrato. $ cat f o o . k e y r i n g [ keyring ] d i s p l a y −name=f o o c t i m e=0 mtime=0 l o c k −on−i d l e=f a l s e l o c k −a f t e r=f a l s e [1] item−type=0 d i s p l a y −name=key1 s e c r e t=p a s s 1 mtime =1311897928 c t i m e=0 [2] 114 Ogni sistema operativo normalmente può trasferire temporaneamente dati dalla memoria all’hard disk al fine di incrementare virtualmente la quantità di memoria disponibile. 101 item−type=0 d i s p l a y −name=key2 s e c r e t=p a s s 2 mtime =1311900380 c t i m e=0 Possibili attacchi Sebben GNOME Keyring sia una soluzione semplice e sicura, è vulnerabile ad alcuni tipi di attacco: • Attacco brute-force offline, per scoprire la password di cifratura di un keyring. • Attacco cold boot [133]. Consiste nel forzare lo spegnimento istantaneo del dispositivo (ad esempio rimuovendone la batteria) nel momento in cui uno o più keyring sono sbloccati. La natura circuitale della maggior parte delle memorie RAM fa si che l’informazione sia mantenuta per alcuni secondi/minuti anche in mancanza di alimentazione. Dunque i dati salvati in RAM sarebbero accessibili avendo diretto accesso ad essa utilizzando un secondo dispositivo, oppure eseguendo il boot tramite un sistema operativo secondario. Si tratta di un attacco teoricamente fattibile, ma in pratica tecnicamente complesso. Considerazioni sull’adozione del Keyring nei sitemi operativi mobile. GNOME keyring è una soluzione pensata per dispositivi desktop, dove le applicazioni non sono isolate le une dalle altre: consente ad ogni applicazione eseguita dall’utente autenticato di accedere alle informazioni contenute nei keyring sbloccati. In ambito mobile è necessario introdurre una separazione tra le applicazioni, in modo che ciascuna sia in grado di specificare le regole di accesso al proprio keyring. 6.2 Sicurezza delle connessioni di rete Nell’intento di analizzare le caratteristiche di sicurezza dei sistemi operativi mobile trattati, la maggior parte del report si concentra sugli aspetti di sicurezza interni al sistema, relativi soprattutto alla protezione a livello software: isolamento delle applicazioni, gestione privilegi, firma della applicazioni. Trattandosi di dispositivi mobili, una componente di sicurezza importante è rappresentata delle comunicazioni con l’esterno, principalmente tramite WiFi e rete cellulare GSM. Per ovvie ragioni di interoperabilità tra diversi dispositivi, le soluzioni qui adottate sono regolamentate da standard internazionali. Tuttavia, vista l’importanza che rivestono nel campo della sicurezza mobile, riteniamo opportuno fornire una breve descrizione di alcuni dei meccanismi di sicurezza adottati. 6.2.1 GSM Nelle comunicazioni via GSM si distinguono due parti principali: la stazione mobile (lo smartphone o tablet, contenente una scheda SIM) e l’operatore GSM (che comunica tramite le stazioni base). La sicurezza del GSM prevede l’autenticazione della stazione mobile e la cifratura dei dati trasmessi. L’operatore non è autenticato, tuttavia, come viene in seguito spiegato, è impossibile per un falso operatore decifrare i dati inviati dalla stazione mobile. Con riferimento a Figura 40, viene di seguito fornita una descrizione generale del protocollo di autenticazione e cifratura utilizzato nel GSM 115 . Si suppone che l’operatore abbia già ricevuto 115 Viene tralasciata la descrizione degli algoritmi A3, A5, A8 utilizzati. 102 dalla stazione mobile comunicazione dell’IMSI ( International Mobile Subscriber Identity) della SIM, numero che la identifica univocamente. Figura 40: Sorgente immagine: Schema di autenticazione e cifratura nel GSM.116 1. L’operatore genera una stringa casuale di 128 bit, chiamata RAND, che invia alla stazione mobile. 2. La stazione mobile e operatore calcolano, utilizzando l’algoritmo A3 e la chiave segreta Ki di 128 bit, associata alla SIM, il valore SRES = A3(Ki , RAN D). L’operatore conosce Ki dai propri registri, tenuti segreti, mentre la stazione mobile contiene tale dato all’interno della SIM. 3. La stazione mobile invia SRES all’operatore, che lo confronta con quello da lui calcolato per verificarne l’uguaglianza. 4. Stazione mobile e operatore calcolano la chiave di cifratura di 64 bit come Kc = A8(RAN D, Ki ). 5. Le future comunicazioni sono cifrate con l’algoritmo A5 (stream cipher, implementato efficientemente in hardware) e la chiave Kc . Come visibile in Figura 40, gli algoritmi A3 e A8 sono implementati direttamente in hardware sulla SIM. Ciò è fondamentale ai fini della sicurezza, in quanto consente di non rendere mai leggibile alla stazione mobile la chiave Ki [134][135]. 6.2.2 WiFi La protezione della connessione WiFi è implementata usando 3 diversi protocolli: WEP, WPA, WPA2. Il primo attacco per WEP (Wired Equivalent Privacy) è stato scoperto nel 2001 [136]. In seguito altri attacchi sono stati formulati, sfruttando diverse tecniche nel 2004, 2005, 2007 e 2010 [137]. Più recentemente, anche su WPA sono state scoperte vulnerabilità nel 2008 [138], 2009 e 2010 [137]. Attualmente WPA2 è il protocollo più sicuro ed utilizzato. WPA2 prevede sia l’autenticazione che la cifratura. L’autenticazione può avvenire in due modi: 116 http://pages.cpsc.ucalgary.ca/ 103 • WPA Personal : detto anche WPA-PSK (Pre Shared Key), è progettato per abitazioni e piccole reti. Non necessita di un server di autenticazione. Viene impostata una password nell’Access Point (ad esempio il router WiFi) e la stessa va digitata sul dispositivo mobile al momento della connessione. • WAP Enterprise: dello anche WPA-802.1X, è progettato per reti aziendali e necessita di un server di autenticazione RADIUS. Il setup è più complicato, ma fornisce maggiore sicurezza (ad esempio protezione contro attacchi dizionario). Utilizzando l’Extensible Authentication Protocol (EAP), consente di utilizzare per l’autenticazione token cards (Smart Cards), Kerberos, one-time passwords, certificati e autenticazione con chiave pubblica. L’autenticazione si articola in due fasi: Prima fase: L’utilizzo della modalità WPA Personal o WPA Enterprise determina il modo in cui viene eseguita la prima fase della procedura di autenticazione, in cui stazione mobile e punto di accesso devono arrivare a conoscere una stessa Pairwise Mater Key (PMK) di 256 bit. In WPA Personal, la PMK è calcolata da entrambe le parti applicando la funzione PBKDF2 alla password della connessione: l’SSID è utilizzato come sale e sono eseguite 4096 iterazioni di HMAC-SHA1. In WPA Enterprise, la PMK è già nota alla stazione mobile (in modi diversi a seconda del metodo di autenticazione utilizzato) e viene resa nota al punto di accesso in seguito all’autenticazione eseguita col server RADIUS. A differenza del caso WPA Personal, la PMK è diversa per ogni utente con accesso alla rete. Al termine della procedura sotto illustrata, nel caso WPA Enterprise si avrà autenticazione dello specifico utente con accesso alla rete, mentre in WPA Personal si ha autenticazione di un generico utente a conoscenza della password della rete. Seconda fase: La seconda fase della procedura di autenticazione prevede che stazione mobile e punto di accesso provino l’uno all’altra di essere a conoscenza della PMK. Ciò avviene con un meccanismo di four-way handshake descritto nel protocollo IEEE 802.11i [139]. Poiché la PMK è progettata per durare per l’intera sessione e deve essere esposta il meno possibile, vengono generate chiavi temporanee (Pairwise Transient Key, PTK) per cifrare il traffico dati tra stazione mobile e punto di accesso. Tali chiavi, di 128 bit, sono generate sempre nel corso del four-way handshake e la procedura è ripetuta periodicamente allo scadere di un timeout. Le PTK sono utilizzate per cifrare la comunicazione tra stazione mobile e punto di accesso, che avviene secondo il protocollo CCMP basato su AES in modalità CCM (che combina CTR per la confidenzialità e CBC-MAC per autenticazione e integrità). WPA supplicant wpa supplicant implementa e gestisce l’autenticazione, l’associazione e la negoziazione delle chiavi del driver WLAN con un Autenticatore WPA, o l’autenticazione EAP con un server di autenticazione. wpa supplicant è un demone di sistema che viene eseguito in background ed è il componente designato per il controllo della connessione wireless [140]. Di seguito i principali passaggi utilizzati per associare un dispositivo wifi ad un Access Point usando WPA2 [141]: 1. wpa supplicant richiede al driver del kernel di eseguire una scansione per individuare le vicine Base Station (BSS). 104 2. wpa supplicant richiede al driver kernel di associarsi con la BSS scelta. 3. Se WPA-EAP: il supplicant IEEE 802.1X completa l’autenticazione EAP con il server di autenticazione ed in seguito riceve una master session key. 4. Se WPA-PSK: wpa supplicant usa la Pre Shared Key come master session key. 5. wpa supplicant completa il WPA 4-Way Handshake con l’Access Point. 6. wpa supplicant configura le chiavi di cifratura per il traffico unicast e broadcast. 7. Normali pacchetti dati possono essere trasmessi e ricevuti. Per la connessione ad una rete wireless usando la modalità WPA Personal è necessario compilare il file configurazione /etc/wpa supplicant.conf con le informazioni sulla rete, come nell’esempio sotto riportato. Nel caso in cui siano a disposizione dei tool grafici, la compilazione del file avviene in modo automatico. È interessante notare come il valore della password, psk, venga salvato in chiaro. network={ s s i d=”home” s c a n s s i d =1 key mgmt=WPA−PSK psk=” v e r y s e c r e t p a s s p h r a s e ” } Se nel campo PSK la password viene scritta in caratteri ASCII tra apici, al momento della connessione il modulo wpa supplicant si occupa di generare la chiave PMK (Pairwise Master Key) secondo l’algoritmo spiegato nel paragrafo precedente, ottenendo una chiave di 256 bit. Alternativamente, per evitare di memorizzare la password PSK ASCII in chiaro [142], è possibile utilizzare il programma wpa passphrase per generare la chiave PMK e memorizzare direttamente quest’ultima. È importante rimarcare come questa non sia una misura di sicurezza per la protezione della password della rete wifi: il valore della chiave PMK calcolato viene sempre salvato in chiaro. Copiando questo valore nel file di configurazione /etc/wpa supplicant.conf è sufficiente per connettersi alla rete wifi. Resta comunque una misura di sicurezza interessante nel caso in cui la stessa password di accesso alla rete wifi sia utilizzata anche in altri contesti, dunque si previene di salvarla in chiaro. 6.3 Address Space Layout Randomization ASLR è una tecnica di sicurezza che impiega il posizionamento casuale di aree di memoria chiave all’interno dello spazio di indirizzamento di un processo. Introducendo un ordinamento casuale nel layout di memoria di un programma, ASLR ne diminuisce la predicibilità e riduce la possibilità che un tentativo di exploit abbia successo [121]. Nelle comuni tecniche di exploit, per eseguire codice malevole, viene sovrascritto l’indirizzo di ritorno di una funzione utilizzando dei puntatori hard-coded. L’utilizzo di ASLR riduce la predicibilità degli indirizzi di memoria, perché lo spazio di indirizzamento viene randomizzato ad ogni esecuzione del programma. La probabilità che un tentativo di exploit mandi in crash il processo è alta. Sebbene un attacco di questo tipo potrebbe essere ancora utilizzato per un denial of service, la sua semplice individuazione lo rende non efficace. In un processo, le principali aree di memoria sono: 105 • Stack: contiene i parametri e le variabili locali. • Heap: contiene le strutture dati allocate dinamicamente. • BSS: contiene le variabili non inizializzate sia statiche locali, che globali. • Data: contiene le variabili inizializzate globali e quelle statiche locali. • Text: contiene il codice del programma. Utilizzando ASLR, il loro posizionamento varia ad ogni esecuzione. Originariamente ASLR era parte del progetto Page Exec (PaX) ed è disponibile dalla versione 2.6.12 del Kernel Linux, pubblicata nel giugno 2005. ASLR non è una soluzione perfetta[143]: la sicurezza offerta è basata su diversi fattori che includono il grado di predicibilità del layout di memoria di un programma, quando è tollerante una tecnica di exploit al layout di memoria ed il numero di tentativi un attaccante è in grado di eseguire. La sua efficacia dipende anche dal numero di bit dell’indirizzo di memoria utilizzati nella randomizzazione: ogni bit in più duplica il numero dei possibili layout di memoria. L’utilizzo di un’architettura a 64 bit è notevolmente più efficace: la maggior parte degli attacchi brute-force su un’architettura a 32 bit non avranno successo in una a 64 bit. Uno degli svantaggi dell’utilizzo di ASLR è quello di rendere l’operazione di analisi dei crash e di debug più complicata. Per questo motivo è quasi sempre possibile disattivarlo. 6.4 Data Execution Prevention DEP è una tecnica di mitigazione degli exploit che rende l’area di memoria in cui vengono salvati i dati non eseguibile, prevenendo l’esecuzione di codice arbitrario [144]. L’architettura dei calcolatori moderni permette a codice e dati di coesistere nella stessa regione di memoria contemporaneamente: i programmi possono essere più facilmente caricati da disco e gli aggiornamenti software sono più semplici [123]. Per implementare DEP, i dispositivi moderni usano una combinazione di tecniche hardware e software. Entrambi i processori ARM e x86 prevedono la non esecuzione delle aree di memoria riservate ai dati, ma ciascuna piattaforma utilizza tecnologie leggermente diverse, che devono essere supportate a livello Kernel. Se un programma tenta di eseguire un’area di memoria marcata come non eseguibile, a livello di processore viene generato un segnale di fault. In seguito, viene gestito dal kernel del sistema operativo e conseguentemente inviato un segnale al processo, causandone la terminazione. 6.5 Modelli per il controllo degli accessi I modelli di controllo per gli accessi forniscono la protezione dell’informazione da accessi non autorizzati e garantiscono l’integrità delle politiche di sicurezza che stabiliscono le regole di accesso e condivisione delle informazioni all’interno di un sistema [145]. I modelli di seguito brevemente trattati sono il “Discretionary access control” ed il “Mandatory Access Control”, 106 6.5.1 Discretionary access control DAC è un modello di controllo degli accessi che permette all’utente di decidere, in modo discrezionario (“Discretionary”), i diritti di accesso agli oggetti di sua proprietà [145]. Storicamente, i sistemi operativi derivati da Unix usano il modello DAC [146]. L’implementazione si basa sul concetto di proprietà e permessi di accesso (lettura, scrittura, esecuzione). Ad ogni oggetto di sistema, come file e cartelle, viene associato un utente ed un gruppo proprietari ed i permessi di accesso per l’utente ed il gruppo proprietari e per tutti gli altri. La flessibilità del modello, ma anche la sua principale debolezza, è data dalla possibilità per gli utenti di cambiare i permessi dei propri file. Ad esempio, un utente potrebbe dare accesso in lettura, scrittura ed esecuzione a chiunque alla propria directory home. In seguito, nulla potrebbe prevenire che altri utenti o processi accedano al contenuto della cartella in questione. Le scelte sul controllo degli accessi vengono prese dall’utente individuale, indipendentemente dalla presenza di una politica globale, introducendo possibili inconsistenze [145]. Inoltre, il modello è fortemente insicuro in presenza di programmi malevoli: un malware potrebbe cambiare le politiche DAC di accesso ad alcuni file, per conto dell’utente che lo esegue. 6.5.2 Mandatory Access Control MAC è un modello di controllo degli accessi in cui una politica di sistema decreta (“Mandatory”) “a chi è consentito avere accesso a ciascun oggetto”. Gli utenti individuali non possono alterare le scelte. In un sistema operativo che implementa il modello “Mandatory Access Control” la politica di accesso è stabilita da un amministratore [146]. Anche se venissero cambiate le impostazioni DAC nella cartella “home” di un utente, se esiste una politica che previene che altri utenti o processi vi accedano, prevale quest’ultima. Le politiche MAC possono essere definite in modo molto dettagliato, per controllare ad esempio l’accesso tra utenti, file, direttori, memoria, socket udp e tcp, ecc. 6.6 LXC / Linux Containers LXC è una soluzione di virtualizzazione leggera, nota anche come “virtualizzazione a livello di sistema operativo” [147]. L’unità virtualizzata è il container, che fornisce l’isolamento del processo e delle risorse: permette di eseguire in modo sicuro più applicazioni su un singolo sistema senza il rischio che queste interferiscano tra loro. Se la sicurezza di un container venisse compromessa, gli altri container rimarrebbero non affetti. LXC è leggero e “resource-friendly” [148]: consente di eseguire istanze multiple di un sistema operativo e delle relative applicazioni su un singolo host, senza avere overhead in termini di CPU e memoria. Risulta essere più veloce rispetto all’alternativa virtualizzazione completa, avendo un footprint medio fino a dieci volte inferiore [149]. Un container è un processo in userspace. Per la creazione viene sfruttato il supporto del kernel, utilizzando sia i namespace, che i control groups. I primi vengono impiegati per l’isolamento delle risorse, i secondi per la loro limitazione ed accounting. Ad esempio, i container possono essere configurati per usare una differente quantità di risorse in termini di CPU, memoria e I/O. Tutti i container condividono lo stesso kernel del sistema operativo host. 107 Riferimenti bibliografici [1] Francesco Russo. I dispositivi mobili connessi superano la popolazione mondiale. http: //www.agoravox.it/I-dispositivi-mobili-connessi.html. [2] Antonio Dini. Gli smartphone sono 1,2 miliardi, saranno 4 nel 2018. boom traffico dati, il rapporto con la voce è 8 a 1. http://www.ilsole24ore.com/art/tecnologie/201305-31/smartphone-sono-miliardi-saranno-185531.shtml. [3] Infonetics Research. Infonetics projects mobile device security software market to reach 3.4 billion in 2018. http://www.infonetics.com/pr/2014/2H13-Mobile-SecurityClient-Software-Market-Highlights.asp. [4] Adrienne Porter Felt, Matthew Finifter, Erika Chin, Steve Hanna, and David Wagner. A survey of mobile malware in the wild. In Proceedings of the 1st ACM workshop on Security and privacy in smartphones and mobile devices, pages 3–14. ACM, 2011. [5] Philip Marquardt, Arunabh Verma, Henry Carter, and Patrick Traynor. (sp) iphone: decoding vibrations from nearby keyboards using mobile phone accelerometers. In Proceedings of the 18th ACM conference on Computer and communications security, pages 551–562. ACM, 2011. [6] A cryptolocker for android? android/. https://blog.kaspersky.com/new-ransomware-for- [7] Mariantonietta La Polla, Fabio Martinelli, and Daniele Sgandurra. A survey on security for mobile devices. Communications Surveys & Tutorials, IEEE, 15(1):446–471, 2013. [8] Siemens s55 sms send prompt bypass weakness. http://marc.info/?l=secunia-secadv&m=108315642409515. [9] Intrusion and protection of mobile devices. http://www.fortiguard.com/files/ Intrusion_and_Protection_of_Mobile_Devices.pdf. [10] Bluetooth-worm:symbos/cabir. https://www.f-secure.com/v-descs/cabir.shtml. [11] Peter Szor. The art of computer virus research and defense. Pearson Education, 2005. [12] Fakeav holds android phones for ransom. http://www.symantec.com/connect/blogs/ fakeav-holds-android-phones-ransom. [13] Simplocker: First confirmed file-encrypting ransomware for android. //www.symantec.com/connect/blogs/simplocker-first-confirmed-fileencrypting-ransomware-android. http: [14] A detailed analysis of the first locking and file encrypting ransomware for android. https://hackmag.com/malware/a-detailed-analysis-of-the-first-lockingand-file-encrypting-ransomware-for-android/. [15] Understanding crypto-ransomware. http://www.bromium.com/sites/default/files/ bromium-report-ransomware.pdf. [16] Cryptolocker e altri ransomware: come decodificare i file. http://www.ilsoftware. it/articoli.asp?tag=Cryptolocker-e-altri-ransomware-come-decodificare-ifile_12149. 108 [17] Faq ubuntu touch. https://wiki.ubuntu.com/Touch/FAQ. [18] Ricardo Salveti. O2qEAbuk_i8. Ubuntu touch internals. https://www.youtube.com/watch?v= [19] Container architecture. https://wiki.ubuntu.com/Touch/ContainerArchitecture. [20] Unity8. https://wiki.ubuntu.com/UnityNextSpec. [21] Qml. http://en.wikipedia.org/wiki/QML. [22] Qt. http://en.wikipedia.org/wiki/Qt_%28software%29. [23] Rex Tsai. Ubuntu phone engineering. [24] Linux security modules. https://en.wikipedia.org/wiki/Linux_Security_Modules. [25] Crispin Cowan. Securing linux application with apparmor. https://www.youtube.com/ watch?v=mp23AO8qtE4. [26] Overview of linux capabilities. http://manpages.ubuntu.com/manpages/gutsy/man7/ capabilities.7.html. [27] Se-linux guide. https://access.redhat.com/documentation/en-US/Red_Hat_ Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/. [28] Marc Deslauriers. Ubuntu touch and user privacy. http://mdeslaur.blogspot.ch/ 2013/12/ubuntu-touch-and-user-privacy.html. [29] Content hub. https://design.ubuntu.com/apps/patterns/content-hub. [30] Content hub guide. https://developer.ubuntu.com/en/apps/platform/guides/ content-hub-guide/. [31] Click package signing. https://wiki.ubuntu.com/SecurityTeam/Specifications/ ClickPackageSigning. [32] Application confinement. https://wiki.ubuntu.com/SecurityTeam/Specifications/ ApplicationConfinement. [33] Mike Halcrow. ecryptfs: a stacked cryptographic filesystem. http://www.linuxjournal. com/article/9400. [34] Disk encryption. https://wiki.archlinux.org/index.php/Disk_encryption. [35] ecryptfs. https://wiki.archlinux.org/index.php/ECryptfs. [36] How does apparmor do environment scrubbing. http://stackoverflow.com/ questions/5835664/how-does-apparmor-do-environment-scrubbing. [37] Prey project. https://preyproject.com/. [38] Cyanogenmod. http://en.wikipedia.org/wiki/CyanogenMod. [39] About cyanogenmod. http://wiki.cyanogenmod.org/w/About. [40] About cyanogenmod. http://www.cyanogenmod.org/about. 109 [41] Rooting (android os). http://en.wikipedia.org/wiki/Rooting_%28Android_OS%29. [42] Android Wiki. Content providers. security/index.html. https://source.android.com/devices/tech/ [43] Cyanogenmod privacy guard updated and merged with cm10.2. http: //androidcommunity.com/cyanogenmod-privacy-guard-updated-and-mergedwith-cm10-2-20130925/. [44] Ryan Whitwam. App ops was never meant for end users, used for internal testing and debugging only. http://www.androidpolice.com/2013/12/11/googler-app-ops-wasnever-meant-for-end-users-used-for-internal-testing-and-debugging-only/. [45] Protecting your privacy: App ops, privacy guard, and xprivacy. http://www.xdadevelopers.com/protecting-your-privacy-app-ops-privacy-guard-andxprivacy/. [46] Jonathan Feist. Superuser settings to be handled in cyanogenmod 12 through privacy guard. http://androidcommunity.com/cyanogenmod-privacy-guard-updated-andmerged-with-cm10-2-20130925/. [47] Cyanogenmod account. http://www.cyanogenmod.org/blog/cyanogenmod-account. [48] Scott Brown. Cyanogenmod breaks new ground on mobile privacy. http: //www.scottbrownconsulting.com/2013/08/cyanogenmod-breaks-new-groundon-mobile-privacy/. [49] Dispositivo a blocchi. https://it.wikipedia.org/wiki/Dispositivo_a_blocchi. [50] Dm-crypt. https://en.wikipedia.org/wiki/Dm-crypt. [51] Disk encryption theory. https://en.wikipedia.org/wiki/Disk_encryption_theory# Encrypted_salt-sector_initialization_vector_.28ESSIV.29. [52] Encryption. https://source.android.com/devices/tech/security/encryption/. [53] Olga Gadyatskaya, Fabio Massacci, and Yury Zhauniarovich. Emerging mobile platforms: Firefox os and tizen. [54] Irfan Asrar. Attack surface analysis of the tizen os. [55] Samsung Electronics Seokjae Jeong. Tizen overview and architecture. https://events. linuxfoundation.org/images/stories/pdf/lceu2012_haitzler.pdf. [56] Kirill Kruchinkin. Practical approach to creating hybrid/native tizen apps. http://www.slideshare.net/SymphonyTeleca/practical-approach-to-creatinghybridnative-tizen-apps. [57] Multi-user architecture. https://wiki.tizen.org/wiki/Multi-user_Architecture. [58] Smart development bridge. https://developer.tizen.org/documentation/ articles/smart-development-bridge. [59] Security/tizen 2.x debugging environment. https://wiki.tizen.org/wiki/Security/ Tizen_2.X_Debugging_Environment. 110 [60] Tizen architecture overview. https://www.tizen.org/sites/default/files/tizenarchitecture-linuxcollab.pdf. [61] Byung Woan Kim. Overview of the tizen native application framework. http://cdn.download.tizen.org/misc/media/conference2013/slides/TDC2013Overview_of_the_Tizen_Native_Application_Framework.pdf. [62] Web runtime. https://developer.tizen.org/dev-guide/2.2.0/org.tizen.web. appprogramming/html/basics_tizen_programming/web_runtime.htm. [63] Ming Jin. Tizen web runtime. https://download.tizen.org/misc/media/ conference2012/tuesday/ballroom-a/2012-05-08_1515-1555-tizen_web_runtime. pdf. [64] Nathan Willis. A look at the crosswalk web runtime. http://lwn.net/Articles/ 618152/. [65] Security/tizen 3.x overview. Overview. https://wiki.tizen.org/wiki/Security/Tizen_3.X_ [66] Security/tizen 2.x overview. Overview. https://wiki.tizen.org/wiki/Security/Tizen_2.X_ [67] Jake Edge. Smack for simplified access control. http://lwn.net/Articles/244531/. [68] Casey Schaufler. Smack and the application ecosystem. http://linuxplumbersconf. org/2009/slides/Casey-SmackPlumbers2010.pdf. [69] Security/tizen 2.x libprivilege-control. Tizen_2.X_libprivilege-control. https://wiki.tizen.org/wiki/Security/ [70] Casey Schaufler. The smack project. http://www.schaufler-ca.com. [71] Security:smack. https://wiki.tizen.org/wiki/Security:Smack. [72] Security/tizen 2.x smack. Smack. https://wiki.tizen.org/wiki/Security/Tizen_2.X_ [73] Security/tizen 2.x user id & group id. Tizen_2.X_User_ID_%26_group_ID. https://wiki.tizen.org/wiki/Security/ [74] Multi-user architecture. https://wiki.tizen.org/wiki/Multi-user_Architecture. [75] Nathan Willis. Talking smack for tizen security. https://lwn.net/Articles/552787/. [76] Security:smackthreedomainmodel. SmackThreeDomainModel. https://wiki.tizen.org/wiki/Security: [77] Security:cynara. https://wiki.tizen.org/wiki/Security:Cynara. [78] Nathan Willis. Tizen’s new access-control broker cynara. http://lwn.net/Articles/ 602060/. [79] Security:cynara:comparisonwithothersolutions. https://wiki.tizen.org/wiki/ Security:Cynara:ComparisonWithOtherSolutions. 111 [80] Franziska Roesner, Tadayoshi Kohno, Alexander Moshchuk, Bryan Parno, Helen J Wang, and Crispin Cowan. User-driven access control: Rethinking permission granting in modern operating systems. In Security and privacy (SP), 2012 IEEE Symposium on, pages 224–238. IEEE, 2012. [81] Tizen 2.2.1 release notes. https://developer.tizen.org/tizen-sdk. [82] Exception handling for privacy-sensitive apis. https://developer.tizen.org/devguide/2.2.1/org.tizen.gettingstarted/html/tizen_overview/exception_ handling.htm. [83] Security/webapps and smack. and_Smack. https://wiki.tizen.org/wiki/Security/WebApps_ [84] Security/tizen 2.x privileges. https://wiki.tizen.org/wiki/Security/Tizen_2.X_ Privileges. [85] Security/tizen 2.x architecture. https://wiki.tizen.org/wiki/Security/Tizen_2.X_ Architecture. [86] HoJun Jaygarl, Cheng Luo, YoonSoo Kim, Eunyoung Choi, Kevin Bradwick, et al. Professional Tizen Application Development. John Wiley & Sons, 2014. [87] Security/tizen 2.x libprivilege-control. Tizen_2.X_libprivilege-control. https://wiki.tizen.org/wiki/Security/ [88] Security/tizen 2.x smack-privilege-config. https://wiki.tizen.org/wiki/Security/ Tizen_2.X_smack-privilege-config. [89] Security/tizen 3.x security manager. https://wiki.tizen.org/wiki/Security/Tizen_ 3.X_Security_Manager. [90] Mailing list for discussions about the development of tizen itself. http://comments. gmane.org/gmane.comp.handhelds.tizen.devel/17. [91] Security:vasum. https://wiki.tizen.org/wiki/Security:Vasum. [92] Dean Pierce. Breaking same-origin for fun and profit. https://download.tizen. org/misc/media/conference2012/tuesday/seacliff/2012-05-08-1600-1640breaking_same-origin_for_fun_and_profit.pdf. [93] Ltd. Hyeokgon Ryu, Infraware Technology. Publishing to tizen using the automated conversion/repackaging of existing android apps. http://cdn.download.tizen.org/ misc/media/conference2013/slides/TDC2013-Publishing_to_TIZEN_Using_the_ Automated_Conversion-Repackaging_of_Existing_Android_Apps.pdf. [94] http://pag.polarismobile.com. http://pag.polarismobile.com/login. [95] Conversion of existing android apps to tizen apps using polaris app generator (pag). http://www.whatistizen.com/conversion-of-existing-android-apps-totizen-apps-using-polaris-app-generator-pag/. [96] James Forshaw. Webgl-a new dimension for browser exploitation. Online: http://www. contextis. com/resources/blog/webgl, 2011. 112 [97] James Forshaw, Paul Stone, and Michael Jordon. Webgl-more webgl security flaws. Context Blog. URL: http://www. contextis. com/research/blog/webgl2/-Retrieved April, 10, 2012. [98] Webgl considered harmful. http://blogs.technet.com/b/srd/archive/2011/06/16/ webgl-considered-harmful.aspx. [99] Technical explanation of the myspace worm. http://namb.la/popular/tech.html. [100] Dave Wichers. Owasp top-10 2013. OWASP Foundation, February, 2013. [101] Guilherme Iscaro. A simple sms reader. https://giscaro.wordpress.com/2012/04/ 10/a-simple-sms-reader/. [102] Tizen. http://it.wikipedia.org/wiki/Tizen. [103] Tizen validation guidelines. https://developer.tizen.org/sites/default/files/ documentation/tizen_validation_guide_ver_1.4_140529.pdf. [104] Tizen Validation Team Taegu Lee. Tizen application validation. http: //download.tizen.org/misc/media/conference2014/slides/tdc2014-tizenapplication-validation.pdf. [105] Jon Oberheide and Charlie Miller. Dissecting the android bouncer. SummerCon2012, New York, 2012. [106] How to access the tizen store in samsung z1 – using vpn + laptop in windows. http://www.downloadtizenapps.com/2015/02/tutorial-how-to-access-thetizen-store-in-samsung-z1-using-vpn-laptop-in-windows.html. [107] App installer workshop status. http://permalink.gmane.org/gmane.comp.handhelds. tizen.devel/5056. [108] wgt package source code encryption. https://developer.tizen.org/fr/forums/webapplication-development/wgt-package-source-code-encryption?langswitch=fr. [109] Web application protection. https://tizendevelopers.wordpress.com/2013/09/30/ web-application-protection/. [110] Key manager. https://developer.tizen.org/documentation/guides/nativeapplication/security/key-manager. [111] Tizen 2.x secure-storage. Secure-storage. https://wiki.tizen.org/wiki/Security/Tizen_2.X_ [112] Inc. Sreenu Pillutla, Director of Engg. McAfee. Content security framework. http://cdn.download.tizen.org/misc/media/conference2013/slides/TDC2013Content_Security_Framework.pdf. [113] Collaboration summit 2013 - tizen content security framework. https://www.youtube. com/watch?v=GtiAQOo4beg. [114] Nathan Willis. Tizen content scanning and app obfuscation. Articles/553676/. https://lwn.net/ [115] Tizen’s content security framework. https://developer.tizen.org/forums/generalsupport/tizens-content-security-framework. 113 [116] Security/tizen 2.x csr-framework. https://wiki.tizen.org/wiki/Security/Tizen_2. X_csr-framework. [117] Porting guide/connectivity. Connectivity. https://wiki.tizen.org/wiki/Porting_Guide/ [118] http://t3746.handhelds-tizen-general.pdatalk.info/in-wich-file-is-wlanpassword-saved-t3746.html. [119] Security/tizen 2.x ca-certificates. https://wiki.tizen.org/wiki/Security/Tizen_2. X_ca-certificates. [120] Security/tizen 2.x cert-svc-ui. https://wiki.tizen.org/wiki/Security/Tizen_2.X_ cert-svc-ui. [121] Ollie Whitehouse. An analysis of address space layout randomization on windows vista. Symantec advanced threat research, pages 1–14, 2007. [122] Hristo Bojinov, Dan Boneh, Rich Cannings, and Iliyan Malchev. Address space randomization for mobile devices. In Proceedings of the fourth ACM conference on Wireless network security, pages 127–138. ACM, 2011. [123] Joshua J Drake, Zach Lanier, Collin Mulliner, Pau Oliva Fora, Stephen A Ridley, and Georg Wicherski. Android Hacker’s Handbook. John Wiley & Sons, 2014. [124] Robert C Seacord. Secure Coding in C and C++. Pearson Education, 2005. [125] Tizen::shell::lockmanager class reference. https://developer.tizen.org/devguide/2.2.0/org.tizen.native.apireference/classTizen_1_1Shell_1_ 1LockManager.html#a59b473817e9dda49128f14ff3b1b19f5. [126] Lock screen. https://developer.tizen.org/dev-guide/2.2.1/org.tizen.native. appprogramming/html/guide/shell/lock_screen.htm. [127] Types of screen lock options in tizen based smartphones. http://www.samsung.com/in/ support/skp/faq/1073648. [128] Vulnerability summary for cve-2012-6459. detail?vulnId=CVE-2012-6459. http://web.nvd.nist.gov/view/vuln/ [129] Bugs tizen: still see bluetooth service even offline mode turned on. https://bugs.tizen. org/jira/browse/TIVI-211. [130] AJIN ABRAHAM. Hacking tizen the os of everything. http://www.slideshare.net/ ajin25/hacking-tizen-the-os-everything-nullcon-goa-2015. [131] Corona sdk. https://coronalabs.com/. [132] Ubuntu touch tablet. http://www.ubuntu.com/tablet. [133] Cold boot attack. https://en.wikipedia.org/wiki/Cold_boot_attack. [134] Gsm authentication. http://pages.cpsc.ucalgary.ca/~szrrizvi/cpsc329/t2.html. [135] How authentication works in gsm. http://www.teletopix.org/gsm/howauthentication-center-auc-works-in-gsm/. 114 [136] Scott Fluhrer, Itsik Mantin, and Adi Shamir. Weaknesses in the key scheduling algorithm of rc4. In Selected areas in cryptography, pages 1–24. Springer, 2001. [137] Caneill Matthieu and Gills Jean-Loup. Attacks against the wifi protocols wep and wpa. [138] Erik Tews and Martin Beck. Practical attacks against wep and wpa. In Proceedings of the second ACM conference on Wireless network security, pages 79–86. ACM, 2009. [139] Wikipedia - ieee 802.11i. https://en.wikipedia.org/wiki/IEEE_802.11i-2004. https://www.freebsd.org/cgi/man.cgi?query=wpa_ [140] Wpa supplicant.conf(5). supplicant.conf&sektion=5. [141] wpa supplicant(8) - linux man page. http://linux.die.net/man/8/wpa_supplicant. http://superuser.com/ [142] wpa supplicant passphrase, can it be normal password? questions/679956/wpa-supplicant-passphrase-can-it-be-normal-password. [143] Tilo Muller. Aslr smack & laugh reference-seminar on advanced exploitation techniques. RWTH Aachen, Germany-Chair of Computer Science, 4, 2008. [144] Vinay Katoch Vulnerability Research Specialist. Whitepaper on bypassing aslr/dep. [145] Ryan Ausanka-Crues. Methods for access control: advances and limitations. Harvey Mudd College, 301, 2001. [146] Se linux for mere mortal. http://people.redhat.com/tcameron/summit2010/ selinux/SELinuxMereMortals.pdf. [147] Christoph Mitasch. Lightweight virtualization. https://www.thomas-krenn.com/de/ wikiDE/images/c/cf/20121106-Lighweight_Virtualization_LXC_Best_Practices. pdf. [148] Linux containers (lxc). features-1405324.pdf. http://www.oracle.com/us/technologies/linux/lxc- [149] Jerome Petazzoni. Lightweight virtualization lxc container. https://www. socallinuxexpo.org/scale11x-supporting/default/files/presentations/ Jerome-Scale11x%20LXC%20Talk.pdf. 115