
보안 교육 플랫폼에서 모바일 구성 요소의 통합을 가능하게 하는 컨테이너 기반 프레임워크
Dockerized Android는 Docker 내에서 Android 에뮬레이터를 실행하고 브라우저를 통해 제어할 수 있는 컨테이너 기반 프레임워크입니다. 이 프로젝트는 모바일 보안 구성 요소를 Cyber Range에 통합하기 위한 시작점을 제공하기 위해 개발되었지만, 어떤 목적으로든 사용할 수 있습니다. 다만 개발 및 테스트 목적으로는 docker-android 프로젝트를 권장합니다.
위의 간략한 설명에서 언급했듯이 이 프로젝트는 Cyber Range에 모바일 보안 구성 요소를 도입하기 위한 시작점을 제공하기 위해 만들어졌습니다. 이러한 이유로 이미 개발된 기능과 앞으로 추가될 기능은 사용자가 실제 시뮬레이션(예: 보안 훈련)을 더 쉽게 설정할 수 있도록 도와줄 것입니다. 이 README는 상당히 길기 때문에 "실행 방법" 부분으로 바로 건너뛰고 싶을 수도 있습니다.
현재 다음 기능을 사용할 수 있습니다:
| 초기 설정 | 인스턴스 관리자 설정 | 수동 설정 |
|---|---|---|
| initial-setup | instance-manager-setup | manual-setup |
| 도구 상자 기능 | 인스턴스 전환 |
|---|---|
| toolbox | instance-switch |
이 프로젝트는 세 가지 주요 부분으로 구성됩니다:
핵심 구성 요소는 Docker 컨테이너 내에서 Android 구성 요소(에뮬레이트 또는 실제)를 실행하는 데 필요한 모든 프로세스를 실행하고 외부에 일부 기능을 노출하는 구성 요소입니다. 여러 프로세스를 관리하여 기능 세트를 제공해야 하기 때문에 의심할 여지 없이 가장 복잡한 부분입니다. 위 그림은 장기 실행 프로세스, 시작 프로세스 및 유틸 스크립트 간의 명확한 구분을 보여줍니다. 또한 이 그림에는 6개의 장기 실행 프로세스가 있다고 표시되어 있는데, 이는 핵심 구성 요소에 대한 일반적인 개요를 제공하기 위해 추가된 약간의 부정확성입니다. 실제로는 핵심 구성 요소에는 두 가지 변형이 있습니다:
주요 아키텍처 차이점은 장기 실행 프로세스와 관련이 있습니다. 에뮬레이터용 Core는 장기 실행 emulator 프로세스를 실행하는 반면, 실제 장치용 Core는 물리적 장치를 표시하고 제어하기 위해 장기 실행 scrcpy 프로세스를 실행합니다. 다른 부분은 Core 구성 요소의 유형에 따라 다른 동작을 따르는 일부 로직을 제외하면 상당히 유사합니다.
UI 구성 요소는 백엔드가 노출하는 모든 기능을 간편하게 사용할 수 있는 방법을 제공하며 장치를 표시하고 제어하는 기능도 추가합니다. 사용자는 Core 구성 요소의 주소와 해당 포트(백엔드가 노출하는 포트와 websockify가 노출하는 포트)를 수동으로 입력해야 합니다. 이 수동 설정을 통해 기본 포트(백엔드의 경우 4242, websockify의 경우 6080)를 변경할 수 있습니다.
인스턴스 관리자 구성 요소는 단일 REST API를 통해 실행 중인 Core에 대한 모든 정보(주소 및 포트)를 제공하는 역할을 합니다. 이는 docker-compose에 있는 Core에 대한 모든 정보를 포함하는 간단한 JSON 구성 파일을 작성하여 수행되며, 하나씩 수동으로 추가하는 번거로운 작업을 피할 수 있습니다. JSON 구성 파일의 구조는 다음과 같습니다:
{
"instances": [
{
"name": [장치를 식별하는 일반 문자열],
"address": [구성 요소의 주소],
"core_port": [백엔드의 포트],
"vnc_port": [VNC의 포트]
}
]
}
secsi/dockerized-android-core-bare는 시스템 이미지를 다운로드하지 않으며, 모든 SDK 폴더가 있는 호스트 머신의 폴더를 마운트할 수 있습니다.
플랫폼을 실행하는 방법에 대한 전체 예제를 보려면 examples 디렉토리의 docker-compose를 참조하십시오. 이 디렉토리에는 세 가지 다른 구성이 포함되어 있습니다:
작동 방식을 이해한 후에는 필요에 맞게 변경할 수 있습니다.
머신에 Docker와 Docker Compose가 설치되어 있어야 합니다.
이 플랫폼은 호스트 OS에 따라 다르게 동작합니다. 다음 표는 현재 호환성을 요약한 것입니다:
| Linux | Windows | OS X | |
|---|---|---|---|
| 에뮬레이터용 Core | 완벽 호환 | 아직 지원되지 않음 | 지원되지 않음 |
| 실제 장치용 Core | 완벽 호환 | 완벽 호환 | 우회 방법 |
Windows 및 OS X의 경우 중첩 가상화를 지원하는 Linux VM을 사용해야 합니다.
Linux 머신이 중첩 가상화를 지원하는지 확인하려면 다음 명령을 실행할 수 있습니다:
sudo apt install cpu-checker
kvm-ok
OS X에서 실제 장치용 Core를 사용하려면:
무선 연결을 위해 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 주소로 이동하여 현재 구성을 설정하기만 하면 됩니다:
Instance Manager를 사용하지 않은 경우 수동 설정을 클릭하고 다음 정보를 입력합니다:
Instance Manager를 사용하는 경우 "Instance Manager"를 클릭하고 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})}
}
이 프로젝트는 나폴리 페데리코 2세 대학교에서 컴퓨터 공학 석사 학위 논문을 대표합니다. 이 작업에 영감을 주신 Simon Pietro Romano 교수님과 엔지니어 Francesco Caturano 님께 특별히 감사드립니다.
| Android 버전 | API | 이미지 |
|---|
| 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 이름 | 기본값 | 설명 |
|---|
| Core | TARGET_PORT | 6080 | Websockify 포트 |
| Core | CUSTOM_APP_DEFAULT_PORT | 4242 | Node.js 백엔드 포트 |
| Core | DEVICEINFO | 설정되지 않음, true처럼 동작 | 장치 정보 기능 활성화/비활성화 |
| Core | TERMINAL | 설정되지 않음, true처럼 동작 | 터미널 기능 활성화/비활성화 |
| Core | APK | 설정되지 않음, true처럼 동작 | APK 설치 기능 활성화/비활성화 |
| Core | FORWARD | 설정되지 않음, true처럼 동작 | 포트 포워딩 기능 활성화/비활성화 |
| Core | SMS | 설정되지 않음, true처럼 동작 | SMS 에뮬레이션 기능 활성화/비활성화 |
| Core | REBOOT | 설정되지 않음, true처럼 동작 | 재부팅 기능 활성화/비활성화 |
| Core | INSTALL_ON_STARTUP | false | /root/dockerized-android/apk 폴더에 있는 모든 apk를 설치하는 기능 활성화/비활성화 |
| Core | ENABLE_UNKNOWN_SOURCES | false | 알 수 없는 소스에서 설치 활성화 |
| Core | REAL_DEVICE_SERIAL | 설정되지 않음 | 연결된 물리적 장치가 두 개 이상인 경우 제어할 장치의 시리얼 번호로 설정해야 하며, 그렇지 않으면 다른 모든 기능이 작동하지 않음 |
| Instance Manager | DEFAULT_PORT | 7373 | REST API의 포트 |
| 구성 요소 | 포트 # | 설명 |
|---|
| Core | 5555 | ADB 포트 |
| Core | 4242 | Node.js 백엔드 |
| Core | 6080 | Websockify (noVNC용) |
| UI | 80 | 프론트엔드 |
| Instance Manager | 7373 | REST API |