
Um framework baseado em contêineres para permitir a integração de componentes móveis em plataformas de treinamento de segurança.
Dockerized Android é um framework baseado em containers que permite executar um Android Emulator dentro do Docker e controlá-lo através de um navegador. Este projeto foi desenvolvido para fornecer um ponto de partida para integrar componentes de segurança móvel em Cyber Ranges, mas pode ser usado para qualquer finalidade. De qualquer forma, para fins de desenvolvimento e teste, o projeto sugerido é docker-android.
Conforme afirmado na breve descrição acima, este projeto foi criado para fornecer um ponto de partida para a introdução de componentes de segurança móvel em Cyber Ranges. Por esse motivo, os recursos já desenvolvidos e os que serão adicionados no futuro ajudarão o usuário a configurar mais facilmente uma simulação realista (por exemplo, para treinamento de segurança). Este README é bastante longo; talvez você queira pular direto para a parte "Como executar".
Os seguintes recursos estão atualmente disponíveis:
| Configuração inicial | Configuração do Gerenciador de Instâncias | Configuração manual |
|---|---|---|
| initial-setup | instance-manager-setup | manual-setup |
| Recursos da caixa de ferramentas | Troca de instância |
|---|---|
| toolbox | instance-switch |
O projeto é composto por três partes principais:
O componente Core é aquele que executa todos os processos necessários para executar um Android Component (Emulado ou Real) dentro de um container Docker, expondo também alguns recursos para o exterior. É sem dúvida a parte mais complexa, pois precisa gerenciar diferentes processos para fornecer um conjunto de recursos. A figura acima mostra uma distinção clara entre processos de longa duração, processos de inicialização e scripts de utilidade. Além disso, esta figura mostra que existem 6 processos de longa duração; isso é uma pequena imprecisão adicionada para fornecer uma visão geral do componente Core. Na realidade, existem duas variações diferentes do componente Core:
A principal diferença arquitetural está relacionada aos processos de longa duração: o Core para Emulador executa o processo de longa duração emulator, enquanto o Core para Dispositivo Real executa o processo de longa duração scrcpy para exibir e controlar o dispositivo físico. As outras partes são bastante semelhantes, com apenas alguma lógica para seguir um comportamento diferente com base no tipo do componente Core.
O componente UI fornece uma maneira simples de usar todos os recursos expostos pelo backend e também adiciona a capacidade de exibir e controlar o dispositivo. O usuário deve inserir manualmente o endereço do componente Core e as portas correspondentes (a porta exposta pelo backend e a porta exposta pelo websockify); através desta configuração manual é possível alterar as portas padrão (que são 4242 para o backend e 6080 para o websockify).
O componente Gerenciador de Instâncias tem a função de fornecer todas as informações (ou seja, endereços e portas) sobre os Cores em execução através de uma única API REST. Isso é feito escrevendo um arquivo de configuração JSON simples que contém todas as informações sobre os Cores presentes no docker-compose para evitar o trabalho tedioso de adicioná-los manualmente um por um. A estrutura do arquivo de configuração JSON é a seguinte:
{
"instances": [
{
"name": [Generic string to identify the device],
"address": [Address of the component],
"core_port": [Port of the backend],
"vnc_port": [Port of VNC]
}
]
}
O secsi/dockerized-android-core-bare não baixa nenhuma imagem de sistema e você pode montar a pasta na sua máquina host onde você tem todas as pastas do SDK
Para ver um exemplo completo de como executar a plataforma, você pode conferir o docker-compose disponível no diretório examples. Este diretório contém três configurações diferentes:
Depois de entender como funciona, você pode modificá-lo para atender às suas necessidades.
Docker e Docker Compose precisam estar instalados na sua máquina.
Esta plataforma se comporta de maneiras diferentes com base no SO host. Aqui está uma tabela que resume a compatibilidade atual:
| Linux | Windows | OS X | |
|---|---|---|---|
| Core para Emulador | Compatibilidade total | Não suportado (ainda) | Não suportado |
| Core para Dispositivo Real | Compatibilidade total | Compatibilidade total | Solução alternativa |
Para Windows e OS X, você precisa usar uma VM Linux com virtualização aninhada.
Para verificar se sua máquina Linux suporta virtualização aninhada, você pode executar os seguintes comandos:
sudo apt install cpu-checker
kvm-ok
Para usar o Core para Dispositivo Real no OS X, você pode:
Para a conexão sem fio, o Google fornece um tutorial simples. Para se conectar ao adb do host de dentro do container, você precisa entrar manualmente no container e executar:
adb -H host.docker.internal devices
Os comandos para começar a usar o framework são os seguintes:
cp ./examples/docker-compose-core.yml docker-compose.yml
docker-compose up
Mais simplesmente, você também pode usar o comando:
docker-compose -f ./examples/docker-compose-core.yml up
Resta apenas navegar através de um navegador no seguinte endereço http://127.0.0.1:8080 e definir a configuração atual:
Se o Gerenciador de Instâncias não foi usado, clique em Configuração manual e insira as seguintes informações:
Se o Gerenciador de Instâncias for usado, clique em "Gerenciador de Instâncias" e insira apenas o endereço IP e seu número de porta (por exemplo, 193.21.1.100:7373).
Pronto! Você pode usar o framework dentro do navegador.
Você também pode construir as imagens você mesmo através dos scripts colocados na pasta utils
Você pode configurar alguns recursos para personalizar a configuração através de variáveis de ambiente (ENV). A tabela a seguir fornece uma lista de todas elas:
A variável REAL_DEVICE_SERIAL é fundamental se houver mais de um dispositivo físico conectado, porque se estiver ausente, nada funcionará. Finalmente, há uma lista de portas expostas por cada componente:
Dockerized Android é um software de código aberto e gratuito distribuído sob a Licença MIT.
Se você achar este código útil em sua pesquisa, por favor, considere citar nosso artigo:
@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})}
}
Este projeto representa nossa dissertação de Mestrado em Engenharia da Computação na Universidade Federico II de Nápoles. Agradecimentos especiais ao Professor Simon Pietro Romano e ao Engenheiro Francesco Caturano, fontes de inspiração para este trabalho.
| Versão do Android | API | Imagem |
|---|
| 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 da ENV | Valor padrão | Descrição |
|---|
| Core | TARGET_PORT | 6080 | Porta do Websockify |
| Core | CUSTOM_APP_DEFAULT_PORT | 4242 | Porta do backend Node.js |
| Core | DEVICEINFO | Não definido, mas funciona como true | Habilita/Desabilita o recurso de informações do dispositivo |
| Core | TERMINAL | Não definido, mas funciona como true | Habilita/Desabilita o recurso de terminal |
| Core | APK | Não definido, mas funciona como true | Habilita/Desabilita o recurso de instalação de APK |
| Core | FORWARD | Não definido, mas funciona como true | Habilita/Desabilita o recurso de encaminhamento de porta |
| Core | SMS | Não definido, mas funciona como true | Habilita/Desabilita o recurso de emulação de SMS |
| Core | REBOOT | Não definido, mas funciona como true | Habilita/Desabilita o recurso de reinicialização |
| Core | INSTALL_ON_STARTUP | false | Habilita/Desabilita o recurso que permite instalar todos os APKs colocados na pasta /root/dockerized-android/apk |
| Core | ENABLE_UNKNOWN_SOURCES | false | Habilita a instalação de fontes desconhecidas |
| Core | REAL_DEVICE_SERIAL | não definido | Se houver mais de um dispositivo físico conectado, este valor deve ser definido com o serial do dispositivo a ser controlado; caso contrário, todos os outros recursos não funcionarão |
| Gerenciador de Instâncias | DEFAULT_PORT | 7373 | Porta da API REST |
| Componente | Porta # | Descrição |
|---|
| Core | 5555 | Porta ADB |
| Core | 4242 | Backend Node.js |
| Core | 6080 | Websockify (para noVNC) |
| UI | 80 | Frontend |
| Gerenciador de Instâncias | 7373 | API REST |