# Base image FROM python:3.12-slim-bookworm LABEL \ name="MobSF" \ author="Ajin Abraham " \ maintainer="Ajin Abraham " \ contributor_1="OscarAkaElvis " \ contributor_2="Vincent Nadal " \ description="Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis." ENV DEBIAN_FRONTEND=noninteractive \ LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONFAULTHANDLER=1 \ MOBSF_USER=mobsf \ USER_ID=9901 \ MOBSF_PLATFORM=docker \ MOBSF_ADB_BINARY=/usr/bin/adb \ JAVA_HOME=/jdk-22.0.2 \ PATH=/jdk-22.0.2/bin:/root/.local/bin:$PATH \ DJANGO_SUPERUSER_USERNAME=mobsf \ DJANGO_SUPERUSER_PASSWORD=mobsf # See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run RUN apt update -y && \ apt install -y --no-install-recommends \ android-sdk-build-tools \ android-tools-adb \ build-essential \ curl \ fontconfig \ fontconfig-config \ git \ libfontconfig1 \ libjpeg62-turbo \ libxext6 \ libxrender1 \ locales \ python3-dev \ sqlite3 \ unzip \ wget \ xfonts-75dpi \ xfonts-base && \ echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \ locale-gen en_US.UTF-8 && \ update-locale LANG=en_US.UTF-8 && \ apt upgrade -y && \ curl -sSL https://install.python-poetry.org | python3 - && \ apt autoremove -y && apt clean -y && rm -rf /var/lib/apt/lists/* /tmp/* ARG TARGETPLATFORM # Install wkhtmltopdf, OpenJDK and jadx COPY scripts/dependencies.sh mobsf/MobSF/tools_download.py ./ RUN chmod +x ./dependencies.sh && ./dependencies.sh # Install Python dependencies COPY pyproject.toml . RUN poetry config virtualenvs.create false && \ poetry lock && \ poetry install --only main --no-root --no-interaction --no-ansi && \ poetry cache clear . --all --no-interaction && \ rm -rf /root/.cache/ # Cleanup RUN \ apt remove -y \ git \ python3-dev \ wget && \ apt clean && \ apt autoclean && \ apt autoremove -y && \ rm -rf /var/lib/apt/lists/* /tmp/* > /dev/null 2>&1 # Copy source code #COPY ./run.sh /home/mobsf/run.sh WORKDIR /home/mobsf/ COPY . . #HEALTHCHECK CMD curl --fail http://host.docker.internal:8000/ || exit 1 HEALTHCHECK CMD curl --fail http://localhost:8000/ || echo "Healthcheck failed" # Expose MobSF Port and Proxy Port EXPOSE 8000 5000 # Create mobsf user RUN groupadd --gid $USER_ID $MOBSF_USER && \ useradd $MOBSF_USER --uid $USER_ID --gid $MOBSF_USER --shell /bin/false && \ chown -R $MOBSF_USER:$MOBSF_USER /home/mobsf RUN chmod +x /home/mobsf/scripts/entrypoint.sh RUN mkdir -p /home/mobsf/.MobSF && chown $MOBSF_USER:$MOBSF_USER /home/mobsf/.MobSF && chmod -R 777 /home/mobsf/.MobSF RUN mkdir -p /home/mobsf/mobsf/StaticAnalyzer/migrations && \ chown -R $MOBSF_USER:$MOBSF_USER /home/mobsf/mobsf/StaticAnalyzer && \ chmod -R 777 /home/mobsf/mobsf/StaticAnalyzer RUN python manage.py migrate && python manage.py migrate auth && python manage.py runserver ENV MOBSF_HOME=/home/mobsf/.MobSF ENV MOBSF_HOME_DIR=/home/mobsf/.MobSF # Switch to mobsf user USER $MOBSF_USER RUN echo '#!/bin/bash\n\ var="$1"\n\ function validate_ip() {\n\ local IP=$1\n\ if [[ $IP =~ ^([0-9]{1,3}\\.){3}[0-9]{1,3}$ ]]; then\n\ for i in ${IP//./ }; do ((i >= 0 && i <= 255 )) || { echo "Bad IP"; exit 1; } done\n\ else\n\ echo "Bad IP"\n\ exit 1\n\ fi\n\ }\n\ function validate_port() {\n\ local PORT=$1\n\ if [[ -z "$PORT" || "$PORT" -le 1024 || "$PORT" -ge 65535 ]]; then\n\ echo "Invalid Port"\n\ exit 1\n\ fi\n\ }\n\ if [[ -n "$var" ]]; then\n\ IP="${var%%:*}"\n\ PORT="${var##*:}"\n\ validate_ip "$IP"\n\ validate_port "$PORT"\n\ else\n\ IP="[::]"\n\ PORT="8000"\n\ fi\n\ python3 -m poetry run gunicorn -b ${IP}:${PORT} mobsf.MobSF.wsgi:application --workers=1 --threads=10 --timeout=3600 \\\n\ --log-level=critical --log-file=- --access-logfile=- --error-logfile=- --capture-output' > /home/mobsf/run.sh RUN chmod +x /home/mobsf/run.sh # Run MobSF CMD ["/home/mobsf/scripts/entrypoint.sh", "/home/mobsf/run.sh"]