
Un framework basé sur des conteneurs pour permettre l'intégration de composants mobiles dans les plateformes de formation en sécurité.
Dockerized Android est un framework basé sur des conteneurs qui permet d'exécuter un émulateur Android dans Docker et de le contrôler via un navigateur. Ce projet a été développé pour fournir un point de départ pour intégrer des composants de sécurité mobile dans des Cyber Ranges, mais il peut être utilisé à n'importe quelle fin. Quoi qu'il en soit, pour les besoins de développement et de test, le projet suggéré est docker-android.
Comme indiqué dans la brève description ci-dessus, ce projet a été créé pour fournir un point de départ pour l'introduction de composants de sécurité mobile dans les Cyber Ranges. Pour cette raison, les fonctionnalités déjà développées et celles qui seront ajoutées à l'avenir aideront l'utilisateur à configurer plus facilement une simulation réaliste (par exemple pour la formation à la sécurité). Ce README est assez long, vous voudrez peut-être passer directement à la partie "How to run".
Les fonctionnalités suivantes sont actuellement disponibles :
| Configuration initiale | Configuration du gestionnaire d'instances | Configuration manuelle |
|---|---|---|
| initial-setup | instance-manager-setup | manual-setup |
| Fonctionnalités de la boîte à outils | Changement d'instance |
|---|---|
| toolbox | instance-switch |
Le projet est composé de trois éléments principaux :
Le composant Core est celui qui exécute tous les processus nécessaires au fonctionnement d'un composant Android (émulé ou réel) dans un conteneur Docker, tout en exposant certaines fonctionnalités à l'extérieur. C'est sans aucun doute la partie la plus complexe car elle doit gérer différents processus afin de fournir un ensemble de fonctionnalités. La figure ci-dessus montre une distinction claire entre les processus de longue durée, les processus de démarrage et les scripts utilitaires. De plus, cette figure montre qu'il y a 6 processus de longue durée, ce qui est une légère inexactitude ajoutée pour donner une vue d'ensemble du composant Core ; en réalité, il existe deux variantes différentes du composant Core :
La principale différence architecturale concerne les processus de longue durée : le Core pour émulateur exécute le processus de longue durée emulator tandis que le Core pour appareil réel exécute le processus de longue durée scrcpy pour afficher et contrôler l'appareil physique. Les autres parties sont assez similaires, avec seulement une logique différente pour suivre un comportement différent selon le type du composant Core.
Le composant UI fournit un moyen simple d'utiliser toutes les fonctionnalités exposées par le backend et ajoute également la possibilité d'afficher et de contrôler l'appareil. L'utilisateur doit insérer manuellement l'adresse du composant Core et les ports correspondants (le port exposé par le backend et le port exposé par websockify) ; grâce à cette configuration manuelle, il est possible de modifier les ports par défaut (qui sont 4242 pour le backend et 6080 pour websockify).
Le composant Instance Manager a pour tâche de fournir toutes les informations (c'est-à-dire les adresses et les ports) sur les Cores en cours d'exécution via une seule API REST. Cela se fait en écrivant un simple fichier de configuration JSON qui contient toutes les informations sur les Cores présents dans le docker-compose afin d'éviter le travail pénible de les ajouter un par un manuellement. La structure du fichier de configuration JSON est la suivante :
{
"instances": [
{
"name": [Chaîne générique pour identifier l'appareil],
"address": [Adresse du composant],
"core_port": [Port du backend],
"vnc_port": [Port VNC]
}
]
}
L'image secsi/dockerized-android-core-bare ne télécharge aucune image système et vous pouvez monter le dossier de votre machine hôte où se trouvent tous les dossiers du SDK.
Pour voir un exemple complet d'exécution de la plateforme, vous pouvez consulter le fichier docker-compose disponible dans le répertoire examples. Ce répertoire contient trois configurations différentes :
Une fois que vous avez compris comment cela fonctionne, vous pouvez le modifier pour répondre à tous vos besoins.
Docker et Docker Compose doivent être installés sur votre machine.
Cette plateforme se comporte différemment selon le système d'exploitation hôte. Voici un tableau récapitulatif de la compatibilité actuelle :
| Linux | Windows | OS X | |
|---|---|---|---|
| Core pour émulateur | Compatibilité totale | Non supporté (pour le moment) | Non supporté |
| Core pour appareil réel | Compatibilité totale | Compatibilité totale | Solution de contournement |
Pour Windows et OS X, vous devez utiliser une machine virtuelle Linux avec virtualisation imbriquée.
Pour vérifier si votre machine Linux prend en charge la virtualisation imbriquée, vous pouvez exécuter les commandes suivantes :
sudo apt install cpu-checker
kvm-ok
Pour utiliser le Core pour appareil réel sur OS X, vous pouvez :
Pour la connexion sans fil, Google fournit un tutoriel simple. Pour vous connecter à l'adb hôte depuis le conteneur, vous devez entrer manuellement dans le conteneur et exécuter :
adb -H host.docker.internal devices
Les commandes pour commencer à utiliser le framework sont les suivantes :
cp ./examples/docker-compose-core.yml docker-compose.yml
docker-compose up
Plus simplement, vous pouvez également utiliser la commande :
docker-compose -f ./examples/docker-compose-core.yml up
Il ne reste plus qu'à naviguer dans un navigateur à l'adresse suivante http://127.0.0.1:8080 et à configurer la configuration actuelle :
Si l'Instance Manager n'a pas été utilisé, cliquez sur Manual Setup et entrez les informations suivantes :
Si l'Instance Manager est utilisé, cliquez sur "Instance Manager" et entrez simplement l'adresse IP et son numéro de port (par exemple, 193.21.1.100:7373).
Voilà ! Vous pouvez utiliser le framework depuis le navigateur.
Vous pouvez également construire les images vous-même grâce aux scripts placés dans le dossier utils.
Vous pouvez configurer certaines fonctionnalités pour personnaliser la configuration à l'aide de variables d'environnement. Le tableau suivant en donne la liste complète :
La variable REAL_DEVICE_SERIAL est fondamentale s'il y a plus d'un appareil physique connecté, car si elle est absente, rien ne fonctionnera.
Enfin, voici la liste des ports exposés par chaque composant :
Dockerized Android est un logiciel open-source et gratuit publié sous la licence MIT.
Si vous trouvez ce code utile dans vos recherches, veuillez envisager de citer notre article :
@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})}
}
Ce projet représente notre mémoire de thèse de Master en Génie Informatique à l'Université Federico II de Naples. Un remerciement spécial au Professeur Simon Pietro Romano et à l'Ingénieur Francesco Caturano, sources d'inspiration pour ce travail.
| Version Android | API | Image |
|---|
| 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 |
| Composant | Nom ENV | Valeur par défaut | Description |
|---|
| Core | TARGET_PORT | 6080 | Port de Websockify |
| Core | CUSTOM_APP_DEFAULT_PORT | 4242 | Port du backend Node.js |
| Core | DEVICEINFO | Non défini, mais se comporte comme true | Active/Désactive la fonction d'information sur l'appareil |
| Core | TERMINAL | Non défini, mais se comporte comme true | Active/Désactive la fonction terminal |
| Core | APK | Non défini, mais se comporte comme true | Active/Désactive la fonction d'installation d'APK |
| Core | FORWARD | Non défini, mais se comporte comme true | Active/Désactive la fonction de transfert de port |
| Core | SMS | Non défini, mais se comporte comme true | Active/Désactive la fonction d'émulation de SMS |
| Core | REBOOT | Non défini, mais se comporte comme true | Active/Désactive la fonction de redémarrage |
| Core | INSTALL_ON_STARTUP | false | Active/Désactive la fonction qui permet d'installer tous les apks placés dans le dossier /root/dockerized-android/apk |
| Core | ENABLE_UNKNOWN_SOURCES | false | Active l'installation depuis des sources inconnues |
| Core | REAL_DEVICE_SERIAL | non défini | Si plusieurs appareils physiques sont connectés, cette valeur doit être définie sur le numéro de série de l'appareil à contrôler, sinon toutes les autres fonctionnalités ne fonctionneront pas |
| Instance Manager | DEFAULT_PORT | 7373 | Port de l'API REST |
| Composant | Port # | Description |
|---|
| Core | 5555 | Port ADB |
| Core | 4242 | Backend Node.js |
| Core | 6080 | Websockify (pour noVNC) |
| UI | 80 | Frontend |
| Instance Manager | 7373 | API REST |