
Una herramienta de análisis estático centrada en la seguridad para aplicaciones Android y Java.

Mariana Trench es una plataforma de análisis estático enfocada en seguridad dirigida a Android.
Esta guía te guiará a través de la configuración de Mariana Trench en tu máquina y te llevará a encontrar tu primera vulnerabilidad de ejecución remota de código en una pequeña aplicación de ejemplo. Estas instrucciones también están disponibles en nuestro sitio web.
Mariana Trench requiere una versión reciente de Python. En MacOS puedes obtener una versión actual a través de homebrew:
$ brew install python3
En un Linux con sabor Debian (Ubuntu, Mint, Debian), puedes usar apt-get:
$ sudo apt-get install python3 python3-pip python3-venv
Esta guía también asume que tienes instalado el Android SDK y una variable de entorno $ANDROID_SDK apuntando a la ubicación del SDK.
Para el resto de esta guía, asumimos que estás trabajando dentro de un entorno virtual. Puedes configurarlo con
$ python3 -m venv ~/.venvs/mariana-trench
$ source ~/.venvs/mariana-trench/bin/activate
(mariana-trench)$
El nombre del entorno virtual al frente del símbolo del sistema indica que el entorno virtual está activo.
Dentro de tu entorno virtual, instalar Mariana Trench es tan fácil como ejecutar
(mariana-trench)$ pip install mariana-trench
Nota: pip install no es compatible actualmente con Macs con Apple Silicon; puedes compilar desde la fuente usando las instrucciones en la Guía del Desarrollador.
Usaremos una pequeña aplicación que es parte de nuestra documentación. Puedes obtenerla ejecutando
(mariana-trench)$ git clone https://github.com/facebook/mariana-trench
(mariana-trench)$ cd mariana-trench/
Ahora estamos listos para ejecutar el análisis
(mariana-trench)$ mariana-trench \
--system-jar-configuration-path=configuration/default_system_jar_paths.json \
--model-generator-configuration-paths=configuration/default_generator_config.json \
--lifecycles-paths=configuration/lifecycles.json \
--rules-paths=configuration/rules.json \
--apk-path=documentation/sample-app/app/build/outputs/apk/debug/app-debug.apk \
--source-root-directory=documentation/sample-app/app/src/main/java \
--model-generator-search-paths=configuration/model-generators/
# ...
INFO Analyzed 68937 models in 7.47s. Found 9 issues!
# ...
El análisis ha encontrado 9 problemas en nuestra aplicación de ejemplo. La salida del análisis es un conjunto de especificaciones para cada método de la aplicación.
Las especificaciones en sí no están diseñadas para ser leídas por humanos. Necesitamos un paso de procesamiento adicional para hacer los resultados más presentables. Hacemos esto con SAPP instalado vía PyPi para nosotros:
(mariana-trench)$ sapp --tool=mariana-trench analyze .
(mariana-trench)$ sapp --database-name=sapp.db server --source-directory=documentation/sample-app/app/src/main/java
# ...
2021-05-12 12:27:22,867 [INFO] * Running on http://localhost:13337/ (Press CTRL+C to quit)
La última línea de la salida nos dice que SAPP inició un servidor web local que nos permite ver los resultados. Abre el enlace y verás los 4 problemas encontrados por el análisis.
Enfoquémonos en el problema de ejecución remota de código encontrado en la aplicación de ejemplo. Puedes identificarlo por su código de problema 1 (para todas las ejecuciones remotas de código) y el invocable void MainActivity.onCreate(Bundle). Con solo 4 problemas para ver, es fácil identificar el problema manualmente, pero una vez que se ejecuten más reglas, la funcionalidad de filtro en la parte superior derecha de la página resulta útil.

El problema te dice que Mariana Trench encontró una ejecución remota de código en MainActivity.onCreate donde los datos provienen de Activity.getIntent a una llamada de distancia, y fluyen hacia el constructor de ProcessBuilder a 3 llamadas de distancia. Haz clic en "Traces" en la esquina superior derecha del problema para ver un ejemplo de traza.
La traza descubierta por Mariana Trench consta de tres partes.
La traza fuente representa de dónde provienen los datos. En nuestro ejemplo, la traza es muy corta: Activity.getIntent se llama directamente en MainActivity.onCreate.

La raíz de la traza representa donde la traza fuente se encuentra con la traza sumidero. En nuestro ejemplo, este es el método onCreate de la actividad.

La parte final de la traza es la traza sumidero: aquí es donde los datos de la fuente fluyen hacia un sumidero. En nuestro ejemplo desde onCreate, a onClick, a execute, y finalmente al constructor de ProcessBuilder.

Puede que te estés preguntando: "¿cómo sabe la herramienta qué son datos controlados por el usuario y qué es un sumidero?". Esta guía está pensada para que empieces rápidamente con una aplicación pequeña. No cubrimos cómo configurar Mariana Trench. Puedes leer más sobre eso en nuestro sitio web en Configuración.
Para una guía detallada sobre compilar desde la fuente y desarrollo en Mariana Trench, consulta la Guía del Desarrollador en nuestro sitio web.
Mariana Trench está licenciado bajo la licencia MIT.