
Фреймворк на основе контейнеров для интеграции мобильных компонентов в платформы обучения безопасности
Dockerized Android — это контейнерная платформа, позволяющая запускать эмулятор Android внутри Docker и управлять им через браузер. Этот проект был разработан для того, чтобы стать отправной точкой для интеграции компонентов мобильной безопасности в Cyber Ranges, но он может использоваться для любых целей. В любом случае, для целей разработки и тестирования рекомендуется проект docker-android.
Как указано в кратком описании выше, этот проект был создан для того, чтобы стать отправной точкой для внедрения компонентов мобильной безопасности в Cyber Ranges. По этой причине уже реализованные функции и те, которые будут добавлены в будущем, помогут пользователю упростить настройку реалистичного моделирования (например, для обучения безопасности). Этот README довольно длинный, возможно, вы захотите сразу перейти к разделу «Как запустить».
В настоящее время доступны следующие функции:
| Начальная настройка | Настройка диспетчера экземпляров | Ручная настройка |
|---|---|---|
| initial-setup | instance-manager-setup | manual-setup |
| Функции панели инструментов | Переключение экземпляров |
|---|---|
| toolbox | instance-switch |
Проект состоит из трех основных частей:
На следующем рисунке представлен обзор фактической архитектуры двух обязательных компонентов:
Основной компонент — это тот, который выполняет все процессы, необходимые для запуска компонента Android (эмулированного или реального) внутри контейнера Docker, а также предоставляет некоторые функции внешним системам. Это, несомненно, самая сложная часть, поскольку она должна управлять различными процессами, чтобы обеспечить набор функций. На приведенном выше рисунке показано четкое различие между долгоживущими процессами, процессами запуска и служебными сценариями. Кроме того, на этом рисунке показано, что существует 6 долгоживущих процессов; это небольшая неточность, добавленная для общего обзора основного компонента. В реальности существуют две разные разновидности основного компонента:
Основное архитектурное различие касается долгоживущих процессов: ядро для эмулятора запускает долгоживущий процесс эмулятора, в то время как ядро для реального устройства запускает долгоживущий процесс scrcpy для отображения и управления физическим устройством. Остальные части довольно схожи, с небольшой разницей в логике для обеспечения различного поведения в зависимости от типа основного компонента.
Компонент пользовательского интерфейса предоставляет простой способ использования всех функций, предоставляемых серверной частью, а также добавляет возможность отображения и управления устройством. Пользователь должен вручную ввести адрес основного компонента и соответствующие порты (порт, предоставляемый серверной частью, и порт, предоставляемый websockify); с помощью этой ручной настройки можно изменить порты по умолчанию (которые равны 4242 для серверной части и 6080 для websockify).
Компонент диспетчера экземпляров отвечает за предоставление всей информации (т.е. адресов и портов) о работающих ядрах через единый REST API. Это достигается путем написания простого JSON-файла конфигурации, который содержит всю информацию о ядрах, присутствующих в docker-compose, чтобы избежать утомительной работы по ручному добавлению каждого по отдельности. Структура JSON-файла конфигурации следующая:
{
"instances": [
{
"name": [Generic string to identify the device],
"address": [Address of the component],
"core_port": [Port of the backend],
"vnc_port": [Port of VNC]
}
]
}
Образ secsi/dockerized-android-core-bare не загружает никакого системного образа, и вы можете смонтировать папку на хост-машине, где находятся все папки SDK.
Чтобы увидеть полный пример того, как запустить платформу, вы можете посмотреть на docker-compose, доступный в каталоге examples. Этот каталог содержит три различные конфигурации:
Когда вы поймете, как это работает, вы можете изменить конфигурацию в соответствии с вашими потребностями.
Docker и Docker Compose должны быть установлены на вашем компьютере.
Эта платформа ведет себя по-разному в зависимости от хост-ОС; ниже приведена таблица, обобщающая текущую совместимость:
| Linux | Windows | OS X | |
|---|---|---|---|
| Ядро для эмулятора | Полная совместимость | Не поддерживается (пока) | Не поддерживается |
| Ядро для реального устройства | Полная совместимость | Полная совместимость | Обходной путь |
Для Windows и OS X необходимо использовать виртуальную машину Linux с вложенной виртуализацией.
Чтобы проверить, поддерживает ли ваш компьютер Linux вложенную виртуализацию, выполните следующие команды:
sudo apt install cpu-checker
kvm-ok
Чтобы использовать ядро для реального устройства на OS X, вы можете:
Для беспроводного соединения Google предоставляет простое руководство. Чтобы подключиться к adb хост-системы из контейнера, необходимо вручную войти в контейнер и выполнить:
adb -H host.docker.internal devices
Команды для начала использования фреймворка следующие:
cp ./examples/docker-compose-core.yml docker-compose.yml
docker-compose up
Проще можно также использовать команду:
docker-compose -f ./examples/docker-compose-core.yml up
Остается только перейти через браузер по адресу http://127.0.0.1:8080 и установить текущую конфигурацию:
Если диспетчер экземпляров не использовался, нажмите Ручная настройка и введите следующую информацию:
Если используется диспетчер экземпляров, нажмите «Диспетчер экземпляров» и просто введите IP-адрес и номер порта (например, 193.21.1.100:7373).
Вот и все! Вы можете использовать фреймворк в браузере.
Вы также можете самостоятельно собрать образы с помощью скриптов, расположенных в папке utils.
Вы можете настроить некоторые функции с помощью переменных окружения (ENV); следующая таблица содержит их полный список:
Переменная REAL_DEVICE_SERIAL является критически важной, если подключено более одного физического устройства, так как при ее отсутствии ничего не будет работать.
Наконец, список портов, предоставляемых каждым компонентом:
Dockerized Android — это программное обеспечение с открытым исходным кодом, распространяемое по лицензии MIT.
Если вы находите этот код полезным для своих исследований, пожалуйста, рассмотрите возможность цитирования нашей статьи:
@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})}
}
Этот проект представляет собой нашу магистерскую диссертацию по компьютерной инженерии в Университете Федерико II в Неаполе. Особая благодарность профессору Саймону Пьетро Романо и инженеру Франческо Катурано, источникам вдохновения для этой работы.
| Версия 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 |
| Компонент | Имя ENV | Значение по умолчанию | Описание |
|---|
| Ядро | TARGET_PORT | 6080 | Порт websockify |
| Ядро | CUSTOM_APP_DEFAULT_PORT | 4242 | Порт серверной части Node.js |
| Ядро | DEVICEINFO | Не задано, но ведет себя как true | Включает/отключает функцию информации об устройстве |
| Ядро | TERMINAL | Не задано, но ведет себя как true | Включает/отключает функцию терминала |
| Ядро | APK | Не задано, но ведет себя как true | Включает/отключает функцию установки APK |
| Ядро | FORWARD | Не задано, но ведет себя как true | Включает/отключает функцию перенаправления портов |
| Ядро | SMS | Не задано, но ведет себя как true | Включает/отключает функцию эмуляции SMS |
| Ядро | REBOOT | Не задано, но ведет себя как true | Включает/отключает функцию перезагрузки |
| Ядро | INSTALL_ON_STARTUP | false | Включает/отключает функцию, позволяющую устанавливать все APK, размещенные в папке /root/dockerized-android/apk |
| Ядро | ENABLE_UNKNOWN_SOURCES | false | Включает установку из неизвестных источников |
| Ядро | REAL_DEVICE_SERIAL | не задано | Если подключено более одного физического устройства, это значение должно быть установлено на серийный номер устройства, которым необходимо управлять, иначе все остальные функции не будут работать |
| Диспетчер экземпляров | DEFAULT_PORT | 7373 | Порт REST API |
| Компонент | Порт № | Описание |
|---|
| Ядро | 5555 | Порт ADB |
| Ядро | 4242 | Серверная часть Node.js |
| Ядро | 6080 | Websockify (для noVNC) |
| Пользовательский интерфейс | 80 | Фронтенд |
| Диспетчер экземпляров | 7373 | REST API |