
Assistant d'évaluation des deeplinks Android, des Intents et des ponts WebView pour le hacking éthique
Outil d'évaluation des ponts Android deeplink, Intent et WebView
apk-interceptor est une APK de test Android portable destinée aux évaluations de sécurité d'applications autorisées. Il aide les ingénieurs sécurité à vérifier comment une application Android gère les points d'entrée externes tels que les schémas d'URI personnalisés, les deeplinks, les Activities exportées et les ponts JavaScript WebView.
L'outil est volontairement limité :
android.permission.INTERNETcontent://Lors des évaluations de sécurité d'applications Android, de nombreux résultats d'analyse statique nécessitent encore une petite preuve de concept sur l'appareil avant d'être confirmés : enregistrer un schéma d'URI personnalisé, envoyer une Intent explicite, servir une charge utile locale content://, ou vérifier si JavaScript peut atteindre un pont WebView.
Créer une nouvelle application de test jetable pour chaque cas est répétitif et sujet aux erreurs. De petites différences dans les entrées du manifeste, les authorities, les autorisations d'URI, les noms de paquets ou la construction des Intents peuvent ralentir la vérification et rendre les résultats plus difficiles à reproduire.
apk-interceptor a été créé pour rendre cette étape de confirmation reproductible. Au lieu d'écrire une nouvelle APK de preuve de concept pour chaque évaluation, vous compilez cet outil avec le schéma autorisé ou l'ID d'application dont vous avez besoin, vous exécutez le test sur l'appareil, et vous gardez le flux de travail limité par conception : pas de permission INTERNET, pas de transmission de données externe, pas d'exécution shell, et aucune dépendance root.
apk-interceptor est utile pour ces tâches d'évaluation :
Procédures détaillées des vulnérabilités :
content://L'application conserve un journal d'évaluation en mémoire pour les Intents envoyées, les deeplinks reçus, les rappels de pont, les résultats JavaScript et les erreurs. Les journaux disparaissent lorsque le processus de l'application est tué. Comme les journaux ne sont pas persistants, capturez les preuves avec des captures d'écran ou un enregistrement vidéo pendant que vous travaillez.
apk-interceptor est un outil de confirmation, pas un cadre de découverte ou d'exploitation. Il suppose que vous savez déjà quoi tester (schéma, classe d'Activity, nom du pont) grâce à l'analyse statique, et vous offre un moyen sûr, sur l'appareil, de vérifier l'atteignabilité et de capturer des preuves. Il est conçu pour être installé sur un appareil d'évaluation et même partagé avec un client, il ne comporte donc aucune permission INTERNET, aucune exécution shell, aucune exfiltration de données et aucune exigence de root.
Sa place parmi les outils Android habituels :
Les deux domaines où apk-interceptor a l'avantage le plus net sur les alternatives :
adb/statique ne peut pas montrer.content:// : un fournisseur non exporté, à fichier unique, dont la charge utile n'est délivrée que via une autorisation de lecture d'Intent temporaire, plus une WebView d'auto-test locale pour valider d'abord la syntaxe de la charge utile.apk-interceptor traite l'envoi et l'interception différemment, et c'est la chose la plus importante à comprendre avant de l'utiliser :
| Action | Module | Schéma personnalisé requis à la compilation ? |
|---|---|---|
| Envoyer une Intent ou un deeplink vers une autre application | Sender | Non, saisissez n'importe quelle URI, paquet ou Activity à l'exécution |
| Intercepter (recevoir) un deeplink pour un schéma personnalisé | Interceptor | Oui, le schéma est fixé dans l'APK au moment de la compilation |
Pour envoyer un deeplink conçu à l'application évaluée, pas besoin de recompiler : utilisez le mode Implicit Deeplink de l'onglet Sender et saisissez n'importe quelle URI.
Pour intercepter un deeplink, c'est-à-dire faire en sorte qu'Android route un schéma personnalisé vers apk-interceptor afin d'observer un possible détournement de schéma, vous devez compiler l'APK avec ce schéma via --scheme. Le schéma est fixé au moment de la compilation à dessein (un garde-fou de conception) ; apk-interceptor n'enregistre jamais de schémas arbitraires à l'exécution. Si vous changez le schéma que vous évaluez, recompilez et réinstallez.
adb pour l'installation sur l'appareil et les tests en ligne de commande optionnelsCompilez l'APK avec le schéma d'URI personnalisé que vous êtes autorisé à évaluer :
./build-interceptor.sh --scheme <authorized_custom_scheme>
adb install ./out/apk-interceptor-<authorized_custom_scheme>-debug.apk
Indicateurs de compilation optionnels :
./build-interceptor.sh \
--scheme <authorized_custom_scheme> \
--app-id <custom.application.id> \
--output ./out
--app-id définit l'ID d'application installé (l'identité du paquet sur l'appareil et l'autorité content://<applicationId>.payload) au moment de la compilation. La valeur par défaut est com.sterrasec.apkinterceptor. Remplacez-la avec --app-id lorsque vous avez besoin de plusieurs versions installables séparément pour différentes évaluations. L'équivalent Windows est build-interceptor.bat.
Le schéma par défaut intercept-poc-example est un espace réservé inoffensif. Le script de compilation refuse de produire une APK d'évaluation avec ce schéma par défaut.
Au premier lancement de chaque version de l'application, apk-interceptor affiche une boîte de dialogue d'utilisation autorisée. Après avoir appuyé sur I understand, la même version n'affiche plus la boîte de dialogue. L'onglet Sender affiche toujours un avertissement persistant car il peut envoyer des Intents vers d'autres applications.
| Sender | Payload | Interceptor |
|---|---|---|
![]() | ![]() | ![]() |
Utilisez cet onglet pour vérifier l'interception de schémas d'URI personnalisés.
Ce qu'il affiche :
Procédure de base :
À propos de Send Test Deeplink : il envoie toujours <scheme>://test?<vos paramètres> avec un hôte test fixe, il est donc destiné à confirmer qu'apk-interceptor reçoit et journalise le schéma, pas à piloter les routes deeplink spécifiques de l'application évaluée. Pour envoyer un deeplink conçu qui correspond à l'hôte ou au chemin requis par l'application évaluée, utilisez plutôt le mode Implicit Deeplink de l'onglet Sender.
Exemple avec adb :
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb\&message=hello%20world'
Utilisez \& lors de l'envoi de plusieurs paramètres de requête via adb shell ; sinon, le shell de l'appareil peut traiter & comme un séparateur de commandes.
Résultat attendu :
RECEIVED apparaîtUtilisez cet onglet pour envoyer des Intents contrôlées lors d'un test autorisé.
Modes :
Intent(ACTION_VIEW, Uri.parse(uri))Champs et contrôles :
Procédure de deeplink implicite :
Procédure d'Activity explicite :
Remarques :
content:// est utile pour tester si une Activity cible transmet des données d'Intent non fiables à une WebView.data de l'Intent, ce qui écraserait l'URI que vous saisissez en mode Implicit Deeplink, donc l'option est masquée dans ce mode.PayloadProvider n'est pas exporté. L'application évaluée ne peut lire la charge utile content:// jointe que parce que l'Intent lui accorde un accès en lecture temporaire via FLAG_GRANT_READ_URI_PERMISSION. Gardez ce drapeau activé et délivrez l'URI via l'Intent. Une URI content:// ouverte d'une autre manière ne sera pas lisible par une autre application.Utilisez cet onglet pour créer une charge utile HTML locale et valider la syntaxe du pont JavaScript dans la WebView d'auto-test d'apk-interceptor.
Ce qu'il contient :
content:// généréeFormat de l'URI de charge utile générée :
content://<applicationId>.payload/current.html
Le fournisseur ne sert que ce fichier fixe :
filesDir/payloads/current.html
Procédure d'auto-test de la charge utile :
localBridge.BRIDGE_RESULT, console.log et evaluateJavascript result dans le journal.Exemple de JavaScript d'auto-test :
console.log("payload loaded");
window.localBridge.logResult(window.localBridge.getInfo());
Le pont d'auto-test expose :
window.<bridgeName>.logResult("message");
window.<bridgeName>.getInfo();
Limitation importante :
La WebView d'auto-test confirme que votre charge utile locale et la syntaxe d'appel du pont fonctionnent dans apk-interceptor. Elle ne peut pas observer si la WebView d'une autre application a exécuté votre charge utile ou appelé son propre pont. Pour l'application évaluée, vérifiez via l'interface de cette application, ses journaux, ses hooks de test ou Chrome DevTools si l'application est débogable.
Risque :
Une application Android enregistre un schéma d'URI personnalisé au lieu d'un App Link vérifié. Toute autre application peut enregistrer le même schéma, donc Android peut afficher un sélecteur d'applications ou router les liens vers une autre application.
Utilisez apk-interceptor pour vérifier :
Étapes :
Preuves à capturer :
Risque :
L'application évaluée fait confiance aux paramètres de deeplink pour la navigation, le chargement d'URL, les indicateurs de fonctionnalités, la sélection de compte ou le rendu sans validation suffisante.
Utilisez apk-interceptor pour vérifier :
Étapes :
Exemple d'espace réservé :
my-authorized-scheme://open?next=https%3A%2F%2Fauthorized-test.example%2Flanding
N'utilisez pas de vrais domaines ou comptes tiers sauf s'ils sont explicitement dans le périmètre.
Risque :
Une Activity exportée effectue des actions sensibles ou affiche des données sensibles sans vérifier l'appelant, l'état de l'utilisateur ou l'autorisation requise.
Utilisez apk-interceptor pour vérifier :
Étapes :
content://.Preuves à capturer :
content://Risque :
L'application évaluée charge des données d'Intent content:// non fiables dans une WebView qui expose également un pont JavaScript via addJavascriptInterface.
Utilisez apk-interceptor pour vérifier :
content://Étapes :
Limitation importante :
apk-interceptor ne peut pas recevoir de résultats d'une autre application à moins que cette application ne les renvoie ou ne les affiche explicitement. L'outil est conçu pour délivrer une charge utile locale et valider la syntaxe, pas pour exfiltrer des données.
Vérifiez que l'APK ne demande pas d'accès réseau :
aapt dump permissions ./out/apk-interceptor-<scheme>-debug.apk
Attendu : pas de android.permission.INTERNET.
Déclenchez un deeplink explicitement vers apk-interceptor :
adb shell am start -W \
-n com.sterrasec.apkinterceptor/.InterceptActivity \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
Déclenchez un deeplink via le résolveur d'Android :
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
La commande explicite confirme le comportement de InterceptActivity. La commande implicite confirme le filtre d'intent du manifeste et le comportement du résolveur.
Les tests unitaires s'exécutent sur la JVM avec Robolectric, donc aucun appareil ni émulateur n'est requis. Ils couvrent PayloadProvider, y compris les vérifications de liste blanche de chemins et d'anti-traversée qui empêchent le fournisseur de servir autre chose que le fichier unique current.html.
./gradlew testDebugUnitTest
Les résultats des tests sont écrits dans app/build/reports/tests/testDebugUnitTest/index.html. La même tâche s'exécute en CI à chaque push et pull request vers main.
android.permission.INTERNET/current.html est servi par PayloadProviderMIT
| Scénario | Module | Ce qu'il aide à vérifier |
|---|
| Détournement de schéma d'URI personnalisé | Interceptor | Si une autre application peut enregistrer le même schéma personnalisé et recevoir des liens |
| Gestion des paramètres de deeplink | Sender | Si l'application évaluée accepte des paramètres de requête/chemin non sûrs |
| Exposition d'une Activity exportée | Sender | Si une Activity exportée peut être lancée directement par une autre application |
Exposition d'un pont WebView via content:// | Payload + Sender | Si une charge utile HTML locale peut atteindre un pont JavaScript WebView |
| Vérification syntaxique de la charge utile locale | Payload | Si votre charge utile HTML/JS s'exécute dans la WebView d'auto-test |
| Outil | Rôle | Différence avec apk-interceptor |
|---|
| jadx / MobSF / QARK / Semgrep | Trouver des points d'entrée vulnérables (statique) | apk-interceptor ne scanne ni ne décompile ; il confirme un résultat que vous avez déjà |
deep-C / NSdeepLink / adb am start | Énumérer et envoyer des deeplinks | apk-interceptor peut aussi envoyer, mais sa différence clé est de recevoir un schéma détourné et d'afficher l'URI exacte et les paramètres |
| drozer | Cadre d'attaque général sur l'appareil (agent + souvent root) | apk-interceptor est une APK unique et légère avec des garde-fous de sécurité délibérés, un périmètre plus restreint et une distribution plus facile à partager avec un client |
| Metasploit / Frida | Armer ou hooker (ex. RCE addJavascriptInterface) | apk-interceptor vérifie uniquement l'atteignabilité du pont avec une charge utile inoffensive ; il n'exfiltre jamais et n'exécute pas de commandes shell |