
Un outil d'analyse statique orienté sécurité pour les applications Android et Java.

Mariana Trench est une plateforme d'analyse statique orientée sécurité ciblant Android.
Ce guide vous accompagnera dans l'installation de Mariana Trench sur votre machine et vous permettra de trouver votre première vulnérabilité d'exécution de code à distance dans une petite application exemple. Ces instructions sont également disponibles sur notre site web.
Mariana Trench nécessite une version récente de Python. Sur MacOS, vous pouvez obtenir une version récente via homebrew :
$ brew install python3
Sur un Linux de type Debian (Ubuntu, Mint, Debian), vous pouvez utiliser apt-get :
$ sudo apt-get install python3 python3-pip python3-venv
Ce guide suppose également que vous avez installé le Android SDK et une variable d'environnement $ANDROID_SDK pointant vers l'emplacement du SDK.
Pour le reste de ce guide, nous supposons que vous travaillez dans un environnement virtuel. Vous pouvez le configurer avec
$ python3 -m venv ~/.venvs/mariana-trench
$ source ~/.venvs/mariana-trench/bin/activate
(mariana-trench)$
Le nom de l'environnement virtuel devant votre invite de commande indique que l'environnement virtuel est actif.
Dans votre environnement virtuel, installer Mariana Trench est aussi simple que d'exécuter
(mariana-trench)$ pip install mariana-trench
Remarque : pip install n'est actuellement pas pris en charge pour les Macs Apple Silicon ; vous pouvez compiler depuis les sources en suivant les instructions dans le Guide du développeur.
Nous allons utiliser une petite application faisant partie de notre documentation. Vous pouvez l'obtenir en exécutant
(mariana-trench)$ git clone https://github.com/facebook/mariana-trench
(mariana-trench)$ cd mariana-trench/
Nous sommes maintenant prêts à exécuter l'analyse
(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!
# ...
L'analyse a trouvé 9 problèmes dans notre application exemple. La sortie de l'analyse est un ensemble de spécifications pour chaque méthode de l'application.
Les spécifications elles-mêmes ne sont pas destinées à être lues par des humains. Nous avons besoin d'une étape de traitement supplémentaire pour rendre les résultats plus présentables. Nous faisons cela avec SAPP installé via PyPi :
(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 dernière ligne de la sortie nous indique que SAPP a démarré un serveur web local qui nous permet de consulter les résultats. Ouvrez le lien et vous verrez les 4 problèmes trouvés par l'analyse.
Concentrons-nous sur le problème d'exécution de code à distance trouvé dans l'application exemple. Vous pouvez l'identifier par son code de problème 1 (pour toutes les exécutions de code à distance) et l'appelable void MainActivity.onCreate(Bundle). Avec seulement 4 problèmes à voir, il est facile d'identifier le problème manuellement, mais une fois que plus de règles sont exécutées, la fonctionnalité de filtre en haut à droite de la page devient pratique.

Le problème vous indique que Mariana Trench a trouvé une exécution de code à distance dans MainActivity.onCreate où les données proviennent de Activity.getIntent à un appel de distance, et s'écoulent dans le constructeur de ProcessBuilder à trois appels de distance. Cliquez sur « Traces » dans le coin supérieur droit du problème pour voir un exemple de trace.
La trace révélée par Mariana Trench se compose de trois parties.
La trace source représente d'où proviennent les données. Dans notre exemple, la trace est très courte : Activity.getIntent est appelée directement dans MainActivity.onCreate.

La racine de la trace représente où la trace source rencontre la trace sink. Dans notre exemple, il s'agit de la méthode onCreate de l'activité.

La dernière partie de la trace est la trace sink : c'est là que les données de la source s'écoulent dans un sink. Dans notre exemple, de onCreate à onClick, à execute, et enfin dans le constructeur de ProcessBuilder.

Vous vous demandez peut-être : « comment l'outil sait-il ce qui est une donnée contrôlée par l'utilisateur et ce qui est un sink ? ». Ce guide est destiné à vous aider à démarrer rapidement sur une petite application. Nous n'avons pas couvert comment configurer Mariana Trench. Vous pouvez en lire plus sur notre site web sous Configuration.
Pour un guide détaillé sur la compilation depuis les sources et le développement sur Mariana Trench, consultez le Guide du développeur sur notre site web.
Mariana Trench est sous licence MIT.