Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema @ serate a tema
1. Alessandro Tanasi -Alessandro Tanasi - http://www.tanasi.ithttp://www.tanasi.it - alessandro@tanasi.it- alessandro@tanasi.it
AndroidAndroid
Introduzione all’architettura, allaIntroduzione all’architettura, alla
programmazione e alla sicurezzaprogrammazione e alla sicurezza
2. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
Fun & profit
● Fun
● Sviluppo applicazioni
● Invenzione di “nuove” applicazioni per soddisfare
vecchie e nuove esigenze
● Poter soddisfare le proprie esigenze,
personalizzazione
● Attività di ricerca
● Profit
● Vendita delle applicazioni
● Sviluppo applicazioni su commissione
● Vendita o abuso dei risultati di ricerca
5. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
6. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
Kernel
● Linux kernel e driver che fanno da hardware
abstraction layer
● Core system services per security, memory
management, process management, network
stack
7. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
8. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
Application framework
● API ad alto livello
● Le applicazioni native Android e quelle di
terze parti usano le stesse API
9. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
10. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 252 164 c0082240 0000ab0c S /init
root 2 0 0 0 c0048eac 00000000 S kthreadd
root 3 2 0 0 c003acf0 00000000 S ksoftirqd/0
root 4 2 0 0 c0045e5c 00000000 S events/0
root 5 2 0 0 c0045e5c 00000000 S khelper
root 8 2 0 0 c0045e5c 00000000 S suspend/0
root 33 2 0 0 c0045e5c 00000000 S kblockd/0
root 36 2 0 0 c0045e5c 00000000 S cqueue/0
root 38 2 0 0 c0150c44 00000000 S kseriod
root 75 2 0 0 c005bed0 00000000 S pdflush
root 76 2 0 0 c005bed0 00000000 S pdflush
root 77 2 0 0 c005f880 00000000 S kswapd0
root 78 2 0 0 c0045e5c 00000000 S aio/0
root 201 2 0 0 c014e2f4 00000000 S mtdblockd
root 217 2 0 0 c0045e5c 00000000 S kmmcd
root 231 2 0 0 c0045e5c 00000000 S rpciod/0
root 450 1 728 300 c00386a4 afe092ac S /system/bin/sh
root 451 1 1256 96 ffffffff 0000ceb4 S /sbin/adbd
root 452 1 2816 284 ffffffff afe08b9c S /system/bin/usbd
root 453 1 636 216 c017c114 afe08e9c S /system/bin/debuggerd
root 454 1 12576 584 ffffffff afe08b9c S /system/bin/rild
root 455 1 56572 14616 c01dc388 afe083dc S zygote
root 456 1 18528 2072 ffffffff afe0861c S /system/bin/runtime
bluetooth 458 1 1200 760 c0082240 afe0947c S /system/bin/dbus-daemon
root 467 455 95616 18728 ffffffff afe0861c S system_server
app_4 503 455 74148 15340 ffffffff afe09604 S com.google.android.home
phone 506 455 96528 19244 ffffffff afe09604 S com.google.android.phone
app_2 522 455 73372 14704 ffffffff afe09604 S com.google.process.content
app_1 805 455 91460 14296 ffffffff afe09604 S com.google.android.contacts
root 1178 450 932 312 00000000 afe083dc R ps
11. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
12. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
13. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
15. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
16. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
17. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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/
18. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
21. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
22. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
23. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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>
24. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
25. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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.*
26. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
27. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
29. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
30. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
Life cycle in dettaglio
http://code.google.com/android/reference/android/app/Activity.html#ActivityLifecycle
31. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
33. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
34. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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>
35. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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
37. LUG TriesteAlessandro Tanasi - alessandro@tanasi.it
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