
Un framework basato su contenitori per abilitare l'integrazione di componenti mobili nelle piattaforme di formazione sulla sicurezza.
Dockerized Android è un framework basato su container che consente di eseguire un emulatore Android all'interno di Docker e controllarlo tramite browser. Questo progetto è stato sviluppato per fornire un punto di partenza per l'integrazione di componenti di sicurezza mobile nei Cyber Range, ma può essere utilizzato per qualsiasi scopo. Comunque, a scopi di sviluppo e test, il progetto suggerito è docker-android.
Come detto nella breve descrizione sopra, questo progetto è stato creato per fornire un punto di partenza per l'introduzione di componenti di sicurezza mobile nei Cyber Range. Per questo motivo, le funzionalità già sviluppate e quelle che verranno aggiunte in futuro aiuteranno l'utente a rendere più semplice impostare una simulazione realistica (ad esempio per la formazione sulla sicurezza). Questa README è piuttosto lunga, forse vuoi saltare direttamente alla parte "Come eseguire".
Le seguenti funzionalità sono attualmente disponibili:
| Configurazione iniziale | Configurazione Instance Manager | Configurazione manuale |
|---|---|---|
| initial-setup | instance-manager-setup | manual-setup |
| Funzionalità della toolbox | Cambio istanza |
|---|---|
| toolbox | instance-switch |
Il progetto è composto da tre parti principali:
Il componente Core è quello che esegue tutti i processi necessari per far funzionare un componente Android (Emulato o Reale) all'interno di un container Docker, esponendo anche alcune funzionalità all'esterno. È senza dubbio la parte più complessa perché deve gestire diversi processi per fornire un insieme di funzionalità. La figura sopra mostra una chiara distinzione tra processi long-lived, processi start e script utilità. Inoltre, questa figura mostra che ci sono 6 processi long-lived, questa è una piccola inesattezza aggiunta per fornire una panoramica generale del componente Core; in realtà ci sono due diverse varianti del componente Core:
La principale differenza architetturale riguarda i processi long-lived: il Core per Emulatore esegue il processo long-lived emulator mentre il Core per Dispositivo Reale esegue il processo long-lived scrcpy per visualizzare e controllare il dispositivo fisico. Le altre parti sono abbastanza simili con solo un po' di logica per seguire un comportamento diverso in base al tipo di componente Core.
Il componente UI fornisce un modo semplice per utilizzare tutte le funzionalità esposte dal backend e aggiunge anche la capacità di visualizzare e controllare il dispositivo. L'utente deve inserire manualmente l'indirizzo del componente Core e le porte corrispondenti (la porta esposta dal backend e la porta esposta da websockify); attraverso questa configurazione manuale è possibile cambiare le porte predefinite (che sono 4242 per il backend e 6080 per websockify).
Il componente Instance Manager ha il compito di fornire tutte le informazioni (cioè indirizzi e porte) sui Core in esecuzione attraverso una singola API REST. Questo viene fatto scrivendo un semplice file di configurazione JSON che contiene tutte le informazioni sui Core presenti nel docker-compose per evitare il noioso lavoro di aggiungerli manualmente uno per uno. La struttura del file di configurazione JSON è la seguente:
{
"instances": [
{
"name": [Generic string to identify the device],
"address": [Address of the component],
"core_port": [Port of the backend],
"vnc_port": [Port of VNC]
}
]
}
L'immagine secsi/dockerized-android-core-bare non scarica nessuna immagine di sistema e puoi montare la cartella sulla tua macchina host dove hai tutte le cartelle SDK
Per vedere un esempio completo su come eseguire la piattaforma, puoi guardare il docker-compose disponibile nella directory examples. Questa directory contiene tre diverse configurazioni:
Una volta capito come funziona, puoi modificarlo per soddisfare qualsiasi esigenza.
Docker e Docker Compose devono essere installati sulla tua macchina.
Questa piattaforma si comporta in modi diversi in base al sistema operativo host; ecco una tabella che riassume la compatibilità attuale:
| Linux | Windows | OS X | |
|---|---|---|---|
| Core per Emulatore | Piena compatibilità | Non supportato (ancora) | Non supportato |
| Core per Dispositivo Reale | Piena compatibilità | Piena compatibilità | Soluzione alternativa |
Per Windows e OS X devi usare una VM Linux con virtualizzazione annidata.
Per verificare se la tua macchina Linux supporta la virtualizzazione annidata puoi eseguire i seguenti comandi:
sudo apt install cpu-checker
kvm-ok
Per usare il Core per Dispositivo Reale su OS X puoi:
Per la connessione wireless Google fornisce un semplice tutorial. Per connetterti all'adb dell'host dall'interno del container devi entrare manualmente nel container ed eseguire:
adb -H host.docker.internal devices
I comandi per iniziare a usare il framework sono i seguenti:
cp ./examples/docker-compose-core.yml docker-compose.yml
docker-compose up
Più semplicemente puoi anche usare il comando:
docker-compose -f ./examples/docker-compose-core.yml up
Non resta che navigare con un browser all'indirizzo http://127.0.0.1:8080 e impostare la configurazione corrente:
Se Instance Manager non è stato usato, clicca su Configurazione manuale e inserisci le seguenti informazioni:
Se Instance Manager viene usato, clicca su 'Instance Manager' e inserisci semplicemente l'indirizzo IP e il suo numero di porta (ad esempio, 193.21.1.100:7373).
Questo è tutto! Puoi usare il framework all'interno del browser.
Puoi anche compilare le immagini tu stesso attraverso gli script nella cartella utils
Puoi configurare alcune funzionalità per personalizzare l'installazione tramite variabili d'ambiente; la tabella seguente fornisce un elenco di tutte:
La variabile REAL_DEVICE_SERIAL è fondamentale se è collegato più di un dispositivo fisico perché se manca non funzionerà nulla. Infine c'è un elenco di porte esposte da ciascun componente:
Dockerized Android è un software open-source e gratuito rilasciato sotto la Licenza MIT.
Se trovi utile questo codice nella tua ricerca, considera di citare il nostro articolo:
@inproceedings{Capone2022,
doi = {10.1109/icecet55527.2022.9872834},
url = {https://doi.org/10.1109/icecet55527.2022.9872834},
year = {2022},
month = jul,
publisher = {{IEEE}},
author = {Daniele Capone and Francesco Caturano and Angelo Delicato and Gaetano Perrone and Simon Pietro Romano},
title = {Dockerized Android: a container-based platform to build mobile Android scenarios for Cyber Ranges},
booktitle = {2022 International Conference on Electrical, Computer and Energy Technologies ({ICECET})}
}
Questo progetto rappresenta la nostra tesi di laurea magistrale in Ingegneria Informatica presso l'Università Federico II di Napoli. Un ringraziamento speciale al Professor Simon Pietro Romano e all'Ingegnere Francesco Caturano, fonti di ispirazione per questo lavoro.
| Versione Android | API | Immagine |
|---|
| 5.0.1 | 21 | secsi/dockerized-android-core-emulator-5.0.1 |
| 5.1.1 | 22 | secsi/dockerized-android-core-emulator-5.1.1 |
| 6.0 | 23 | secsi/dockerized-android-core-emulator-6.0 |
| 7.0 | 24 | secsi/dockerized-android-core-emulator-7.0 |
| 7.1.1 | 25 | secsi/dockerized-android-core-emulator-7.1.1 |
| 8.0 | 26 | secsi/dockerized-android-core-emulator-8.0 |
| 8.1 | 27 | secsi/dockerized-android-core-emulator-8.1 |
| 9.0 | 28 | secsi/dockerized-android-core-emulator-9.0 |
| 10.0 | 29 | secsi/dockerized-android-core-emulator-10.0 |
| 11.0 | 30 | secsi/dockerized-android-core-emulator-11.0 |
| - | - | secsi/dockerized-android-core-bare |
| - | - | secsi/docker-android-core-real-device |
| Componente | Nome ENV | Valore predefinito | Descrizione |
|---|
| Core | TARGET_PORT | 6080 | Porta Websockify |
| Core | CUSTOM_APP_DEFAULT_PORT | 4242 | Porta backend Node.js |
| Core | DEVICEINFO | Non impostato, ma si comporta come true | Abilita/Disabilita la funzionalità di informazioni sul dispositivo |
| Core | TERMINAL | Non impostato, ma si comporta come true | Abilita/Disabilita la funzionalità del terminale |
| Core | APK | Non impostato, ma si comporta come true | Abilita/Disabilita la funzionalità di installazione APK |
| Core | FORWARD | Non impostato, ma si comporta come true | Abilita/Disabilita la funzionalità di port forwarding |
| Core | SMS | Non impostato, ma si comporta come true | Abilita/Disabilita la funzionalità di emulazione SMS |
| Core | REBOOT | Non impostato, ma si comporta come true | Abilita/Disabilita la funzionalità di riavvio |
| Core | INSTALL_ON_STARTUP | false | Abilita/Disabilita la funzionalità che permette di installare tutti gli apk posti nella cartella /root/dockerized-android/apk |
| Core | ENABLE_UNKNOWN_SOURCES | false | Abilita l'installazione da fonti sconosciute |
| Core | REAL_DEVICE_SERIAL | non impostato | Se è collegato più di un dispositivo fisico, questo valore deve essere impostato al seriale del dispositivo che deve essere controllato, altrimenti tutte le altre funzionalità non funzioneranno |
| Instance Manager | DEFAULT_PORT | 7373 | Porta della REST API |
| Componente | Porta | Descrizione |
|---|
| Core | 5555 | Porta ADB |
| Core | 4242 | Backend Node.js |
| Core | 6080 | Websockify (per noVNC) |
| UI | 80 | Frontend |
| Instance Manager | 7373 | API REST |