Android: Introduzione all'architettura, alla programmazione e alla sicurezza
1. Android
Introduzione all’architettura, alla
programmazione e alla sicurezza
Alessandro Tanasi - http://www.tanasi.it - alessandro@tanasi.it
2. Fun & profit
● Fun
● Sviluppo applicazioni
● Invenzione di “nuove” applicazioni per soddisfare
vecchie e nuove esigenze
● Attività di ricerca
● Profit
● Vendita delle applicazioni
● Sviluppo applicazioni su commissione
● Vendita o abuso dei risultati di ricerca
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
4. Android
● Software stack per device mobili
● Sistema operativo
● Linux con kernel 2.6
● Driver per l'hardware (GPS, accelerometri, ..)
● Middleware
● Librerie
● Android runtime
● Application framework
● Applicazioni
● Native: telefono, contatti, browser, …
● Di terze parti
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
5. Kernel
● Linux kernel e driver che fanno da hardware
abstraction layer
● Core system services per security, memory
management, process management, network
stack
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
6. Librerie e runtime
● Librerie (per la gran parte in linguaggio
nativo) esposte attraverso l'application
framework
● Android runtime: Dalvik Virtual Machine e
sue librerie core
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
7. Application framework
● API ad alto livello
● Le applicazioni native Android e quelle di
terze parti usano le stesse API
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
8. Sequenza di avvio
● Il bootloader carica il
kernel
● Demoni per la
gestione low level
dell'hardware
● Zygote e Dalvik VM
● Il service manager
viene avviato (binders
e comunicazioni IPC)
● Altri manager
● App rimanenti
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
9. Dalvik Virtual Machine
● Bytecode interpreter (no JIT)
● Lente CPU (250-500 MHz), poca RAM (64MB)
● Senza swap
● Register based
● Alta densità semantica
● Istruzioni speciali
● Ottimizzata per istanze multiple
● Ottimizzata per avere un memory footprint
minimale
● Esegue file .dex su OS POSIX compliant
● Si appoggia al kernel per threading e
memory management di basso livello
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
10. Dalvik Executable Format
● Riduzione delle dimensioni
● Sostanziale differenza semantica con il
bytecode Java
● Nessuna compressione
● Comunque minori di un JAR nel caso medio
● Vengono gestiti in modo efficace da mmap()
● Dexdump, undx
http://www.dalvikvm.com/
http://sites.google.com/site/io/dalvik-vm-internals
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
11. Compilazione e building
● Compilazione con il compilatore standard
Java
● Conversion in .dex con l'utility dx
● Nel caso si usino IPC, processing AIDL
● Le risorse sono incluse nel package apk
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
13. Android SDK
● Android API
● Development tools
● Emulatore Android
● Dalvik Debug Monitoring Service (DDMS)
● Documentazione ed esempi
http://developer.android.com/sdk/1.6_r1/index.html
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
14. Native Development Kit (NDK)
● Permettono l'utilizzo di componenti in codice
nativo ( C o C++)
● Cross-toolchains (compilatori, linkers, etc..)
per generare binari ARM
● Libc, libm, OpenGL ES 1.1, JNI interface, libz
● Non permette di creare applicazione native-
only
● Il runtime applicativo rimane la Dalvik VM
http://developer.android.com/sdk/ndk/1.6_r1/index.html
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
15. Android Scripting Environment
● Programmare in Python, Perlm, Jruby,
BeanShell, Lua..
● Per casi particolare in cui bisogna adottare
paradigmi di programmazione diversi da
quelli imposti dall'SDK
● Accesso semplificato e non completo alle
API
● Es: web server in 4 righe di python
http://code.google.com/p/android-scripting/
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
16. Development Tools
● Eclipse Plugin: Andreoid Dev Tools
● Compila e crea il pacchetto automaticamente
● Lancia l'emulatore in debugging mode
● CLI: activityCreator.py
● Genere la struttura del progetto
● Ant build.xml file
● IntelliJ project files
● DroidDraw, SensorSimulator
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
17. Esempio
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
19. Lego per costruzioni
● Activity: Componente UI (tipicamente una
schermata, presentation layer)
● Service: Task in background
● Content Provider: Gestisce e condivide dati
tra applicazioni
● Intent: Messaggistica asincrona
● Intent filter: Dichiarazione XML dei
messaggi che possono essere gestiti
● Broadcast Receiver: attende intents
broadcast che corrispondono a certi criteri
(Intent filter)
● Manifest: Proprietà dell'applicazione
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
20. User interface
● Composta da oggetti View e ViewGroup (vari
tipi)
● Layout definito in file XML
● Stringhe memorizzate separatamente
● Sottoscrizione agli eventi dell'UI tramite
listener o overriding callback
● Definizione dei menu e loro creazione
automatica
● Notifiche
● Adapter per le viste dinamicamente
● Stili e temi
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
21. Esempio
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
22. Resource e asset
● Generalmente sono elementi esterni
referenziati dall'applicazione
● Immagini, audio, video, stringhe di testo,
layout, temi
● Directory per resource (res/) e directory per
asset (assets/)
● La differenza è nel metodo di accesso
● I18n
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
23. Data Storage
● Tecniche differenti per memorizzare dati
● Shared preferences: meccanismo per
memorizzare strutture chiavi-valore
● SQLite: “DBMS relazionale” per
memorizzare dati articolati
● Files: RW di file sulla memoria locale ed SD
card
● Network: Utilizzando java.net.* e
android.net.*
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
24. Multimedia
● Grafica 2D e grafica 3D con OpenGL ES API
● Offre funzioni built-in di encoding/decoding
per alcuni media types
● MediaPlayer e MediaRecorder
● android.location e Google Maps library
● Accelerometro, bussola
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
25. AndroidManifest.xml
● Ogni applicazione deve avere un
AndroidManifest.xml file
● Descrive l'applicazione:
● Nome del package Java
● Descrive i suoi componenti
● Permessi richiesti dall'applicazione
● Permessi richiesti per interagire con i suoi
componenti
● Opzionali informazioni per testing (profiling)
● Dipendenza dalla versione delle android API
● Librerie utilizzate
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
27. Life Cycle
● Le applicazioni running sono gestite in una
gerarchia:
● foreground process (priorità critica)
● visible process (alta priorità)
● service process (bassa priorità)
● background process
● empty process
● Le Activity sono mantenute in un activity
stack (LIFO)
● Un activity ha tre stati: running o active,
paused, stopped
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
28. Life cycle in dettaglio
http://code.google.com/android/reference/android/app/Activity.html#ActivityLifecycle
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
29. Pubblicare un'applicazione
● Iscriversi al market come sviluppatore (25€)
● Dare un numero di versione
● Firmare il pacchetto
● Pubblicare l'applicazione
● Google trattiene il 30% degli incassi
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
31. Android Security Model
● Ogni processo viene eseguito in una DVM
separata
● File non condivisi tra applicazioni
● Linux + Android permission model
● UID e GID distinti assegnati all'installazione
● Stack address randomization
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
32. Android Permissions
● Limite alle funzionalità di un software:
android.permission
● Granularità sulle azioni e sull'accesso ai dati
● Specificate nel file manifest
<uses-permission
android:name="android.permission.READ_CONTACTS">
</uses-permission>
<uses-permission
android:name="android.permission.WRITE_CONTACTS">
</uses-permission>
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
33. Ma ...
● Bypass memory protections
● Vunerabilità riscontrate
● La sandbox è abbastanza granulare per far
girare applicazioni non trusted?
● Marketing profiling, E.T. chiama sempre casa
● Non conoscenza del funzionamento interno
di un'applicazione (client HTTP o HTTPS?)
● Rootkit, managed code rootkit
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste
35. Conclusioni
● L'architettura è disegnata pensando anche
allo sviluppatore
● Lo sviluppo è semplice e veloce
● Sistemi di security granulari allo scopo di
isolare le applicazioni in una sandbox
● Lo sviluppo può essere divertente e redditizio
● C'è ampio spazio per la ricerca
Alessandro Tanasi - alessandro@tanasi.it LUG Trieste