
Asistente de evaluación de Android deeplink, Intent y WebView bridge para hacking ético
Asistente de evaluación de Deeplinks, Intents y puentes WebView para Android
apk-interceptor es un APK de prueba portátil para Android, destinado a evaluaciones de seguridad de aplicaciones autorizadas. Ayuda a los ingenieros de seguridad a verificar cómo una aplicación Android maneja puntos de entrada externos como esquemas URI personalizados, deeplinks, Activities exportadas y puentes JavaScript de WebView.
La herramienta está intencionadamente limitada:
android.permission.INTERNETcontent://Durante las evaluaciones de seguridad de aplicaciones Android, muchos hallazgos del análisis estático aún necesitan una pequeña prueba de concepto en el dispositivo antes de poder confirmarse: registrar un esquema URI personalizado, enviar un Intent explícito, servir un payload local content:// o comprobar si JavaScript puede alcanzar un puente WebView.
Crear una nueva aplicación de prueba desechable para cada caso es repetitivo y propenso a errores. Pequeñas diferencias en las entradas del manifiesto, autoridades, concesiones de URI, nombres de paquete o construcción de Intents pueden ralentizar la verificación y dificultar la reproducibilidad de los resultados.
apk-interceptor fue creado para hacer repetible ese paso de confirmación. En lugar de escribir un nuevo APK PoC para cada evaluación, compilas esta herramienta con el esquema autorizado o el ID de aplicación que necesitas, ejecutas la prueba en el dispositivo y mantienes el flujo de trabajo limitado por diseño: sin permiso INTERNET, sin transmisión de datos externa, sin ejecución de shell y sin dependencia de root.
apk-interceptor es útil para estas tareas de evaluación:
Recorridos detallados de vulnerabilidades:
content://La aplicación mantiene un registro de evaluación en memoria para los Intents enviados, deeplinks recibidos, devoluciones de llamada del puente, resultados de JavaScript y errores. Los registros desaparecen cuando el proceso de la aplicación es eliminado. Como los registros no se persisten, captura evidencia con capturas de pantalla o grabación de pantalla mientras trabajas.
apk-interceptor es una herramienta de confirmación, no un framework de descubrimiento o explotación. Asume que ya sabes qué probar (esquema, clase Activity, nombre del puente) a partir del análisis estático, y te ofrece una forma segura y en el dispositivo de verificar la alcanzabilidad y capturar evidencia. Está diseñada para instalarse en un dispositivo de evaluación e incluso compartirse con un cliente, por lo que no incluye permiso INTERNET, ejecución de shell, exfiltración de datos ni requisito de root.
Dónde se sitúa junto a las herramientas habituales de Android:
Las dos áreas donde apk-interceptor tiene la ventaja más clara sobre las alternativas:
adb/análisis estático no puede mostrar.content://: un proveedor no exportado de un solo archivo cuyo payload se entrega solo a través de un permiso de lectura de Intent temporal, más un WebView de autoevaluación local para validar primero la sintaxis del payload.apk-interceptor trata enviar e interceptar de manera diferente, y esto es lo más importante que debes entender antes de usarlo:
| Acción | Módulo | ¿Se necesita un esquema personalizado en tiempo de compilación? |
|---|---|---|
| Enviar un Intent o deeplink a otra aplicación | Sender | No, escribe cualquier URI, paquete o Activity en tiempo de ejecución |
| Interceptar (recibir) un deeplink para un esquema personalizado | Interceptor | Sí, el esquema se fija en el APK durante la compilación |
Para enviar un deeplink manipulado a la aplicación evaluada, no necesitas recompilar: usa el modo Implicit Deeplink de la pestaña Sender y escribe cualquier URI.
Para interceptar un deeplink, es decir, hacer que Android enrute un esquema personalizado a apk-interceptor para que puedas observar un posible secuestro de esquema, debes compilar el APK con ese esquema mediante --scheme. El esquema se fija en tiempo de compilación a propósito (una barrera de diseño); apk-interceptor nunca registra esquemas arbitrarios en tiempo de ejecución. Si cambias el esquema que estás evaluando, recompila y reinstala.
adb para instalación en el dispositivo y pruebas opcionales desde línea de comandosCompila el APK con el esquema URI personalizado que estás autorizado a evaluar:
./build-interceptor.sh --scheme <esquema_personalizado_autorizado>
adb install ./out/apk-interceptor-<esquema_personalizado_autorizado>-debug.apk
Indicadores de compilación opcionales:
./build-interceptor.sh \
--scheme <esquema_personalizado_autorizado> \
--app-id <id.de.aplicacion.personalizada> \
--output ./out
--app-id establece el ID de la aplicación instalada (la identidad del paquete en el dispositivo y la autoridad content://<applicationId>.payload) en tiempo de compilación. El valor predeterminado es com.sterrasec.apkinterceptor. Sobrescríbelo con --app-id cuando necesites varias compilaciones instalables por separado para diferentes evaluaciones. El equivalente en Windows es build-interceptor.bat.
El esquema predeterminado intercept-poc-example es un marcador de posición inofensivo. El script de compilación se niega a producir un APK de evaluación con ese esquema predeterminado.
En el primer inicio para cada versión de la aplicación, apk-interceptor muestra un diálogo de uso autorizado. Después de tocar Entiendo, la misma versión no vuelve a mostrar el diálogo. La pestaña Sender aún muestra una advertencia persistente porque puede enviar Intents a otras aplicaciones.
| Sender | Payload | Interceptor |
|---|---|---|
![]() | ![]() | ![]() |
Usa esta pestaña para verificar la interceptación de esquemas URI personalizados.
Qué muestra:
Flujo de trabajo básico:
Acerca de Send Test Deeplink: siempre envía <scheme>://test?<tus parámetros> con un host test fijo, por lo que está destinado a confirmar que apk-interceptor recibe y registra el esquema, no para conducir las rutas de deeplink específicas de la aplicación evaluada. Para enviar un deeplink manipulado que coincida con el host o la ruta requeridos por la aplicación evaluada, usa el modo Implicit Deeplink de la pestaña Sender.
Ejemplo con adb:
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb\&message=hello%20world'
Usa \& al enviar múltiples parámetros de consulta a través de adb shell; de lo contrario, el shell del dispositivo podría tratar & como un separador de comandos.
Resultado esperado:
RECEIVEDUsa esta pestaña para enviar Intents controlados durante una prueba autorizada.
Modos:
Intent(ACTION_VIEW, Uri.parse(uri))Campos y controles:
Flujo de trabajo de deeplink implícito:
Flujo de trabajo de Activity explícito:
Notas:
content:// es útil al probar si una Activity objetivo pasa datos de Intent no confiables a un WebView.data del Intent, lo que sobrescribiría la URI que escribes en el modo Implicit Deeplink, por lo que la opción está oculta allí.PayloadProvider no está exportado. La aplicación evaluada puede leer el payload content:// adjunto solo porque el Intent le concede acceso de lectura temporal mediante FLAG_GRANT_READ_URI_PERMISSION. Mantén esa bandera activada y entrega la URI a través del Intent. Una URI content:// abierta de cualquier otra manera no será legible por otra aplicación.Usa esta pestaña para crear un payload HTML local y validar la sintaxis del puente JavaScript en el WebView de autoevaluación de apk-interceptor.
Qué contiene:
content:// generadaFormato de la URI del payload generado:
content://<applicationId>.payload/current.html
El proveedor sirve solo este archivo fijo:
filesDir/payloads/current.html
Flujo de trabajo de autoevaluación del payload:
localBridge.BRIDGE_RESULT, console.log y evaluateJavascript result en el registro.Ejemplo de JavaScript de autoevaluación:
console.log("payload loaded");
window.localBridge.logResult(window.localBridge.getInfo());
El puente de autoevaluación expone:
window.<bridgeName>.logResult("message");
window.<bridgeName>.getInfo();
Limitación importante:
El WebView de autoevaluación confirma que tu payload local y la sintaxis de llamada al puente funcionan dentro de apk-interceptor. No puede observar si el WebView de otra aplicación ejecutó tu payload o llamó a su propio puente. Para la aplicación evaluada, verifica a través de su interfaz de usuario, registros, hooks de prueba o Chrome DevTools si la aplicación es depurable.
Riesgo:
Una aplicación Android registra un esquema URI personalizado en lugar de un App Link verificado. Cualquier otra aplicación puede registrar el mismo esquema, por lo que Android puede mostrar un selector de aplicaciones o enrutar enlaces a una aplicación diferente.
Usa apk-interceptor para comprobar:
Pasos:
Evidencia a capturar:
Riesgo:
La aplicación evaluada confía en los parámetros del deeplink para navegación, carga de URL, características, selección de cuenta o renderizado sin suficiente validación.
Usa apk-interceptor para comprobar:
Pasos:
Ejemplo de marcador de posición:
my-authorized-scheme://open?next=https%3A%2F%2Fauthorized-test.example%2Flanding
No uses dominios o cuentas reales de terceros a menos que estén explícitamente en el alcance.
Riesgo:
Una Activity exportada realiza acciones sensibles o muestra datos sensibles sin verificar el llamante, el estado del usuario o la autorización requerida.
Usa apk-interceptor para comprobar:
Pasos:
content://.Evidencia a capturar:
content://Riesgo:
La aplicación evaluada carga datos content:// no confiables del Intent en un WebView que también expone un puente JavaScript mediante addJavascriptInterface.
Usa apk-interceptor para comprobar:
content://Pasos:
Limitación importante:
apk-interceptor no puede recibir resultados de otra aplicación a menos que esa aplicación los devuelva o muestre explícitamente. La herramienta está diseñada para entregar un payload local y validar sintaxis, no para exfiltrar datos.
Verifica que el APK no solicite acceso a la red:
aapt dump permissions ./out/apk-interceptor-<scheme>-debug.apk
Esperado: sin android.permission.INTERNET.
Dispara un deeplink explícitamente a apk-interceptor:
adb shell am start -W \
-n com.sterrasec.apkinterceptor/.InterceptActivity \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
Dispara un deeplink a través del resolvedor de Android:
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
El comando explícito confirma el comportamiento de InterceptActivity. El comando implícito confirma el intent-filter del manifiesto y el comportamiento del resolvedor.
Las pruebas unitarias se ejecutan en la JVM con Robolectric, por lo que no se requiere dispositivo ni emulador. Cubren PayloadProvider, incluyendo las comprobaciones de lista blanca de rutas y traversing que evitan que el proveedor sirva cualquier otro archivo que no sea el único current.html.
./gradlew testDebugUnitTest
Los resultados de las pruebas se escriben en app/build/reports/tests/testDebugUnitTest/index.html. La misma tarea se ejecuta en CI en cada push y pull request a main.
android.permission.INTERNETPayloadProvider sirve /current.htmlMIT
| Escenario | Módulo | Qué Ayuda a Verificar |
|---|
| Secuestro de esquema URI personalizado | Interceptor | Si otra aplicación puede registrar el mismo esquema personalizado y recibir enlaces |
| Manejo de parámetros de Deeplink | Sender | Si la aplicación evaluada acepta parámetros de consulta/ruta no seguros |
| Exposición de Activity exportada | Sender | Si una Activity exportada puede ser lanzada directamente por otra aplicación |
Exposición de puente WebView vía content:// | Payload + Sender | Si un payload HTML local puede alcanzar un puente JavaScript de WebView |
| Verificación de sintaxis de payload local | Payload | Si tu payload HTML/JS se ejecuta en el WebView de autoevaluación |
| Herramienta | Rol | En qué se diferencia apk-interceptor |
|---|
| jadx / MobSF / QARK / Semgrep | Encontrar puntos de entrada vulnerables (estático) | apk-interceptor no escanea ni decompila; confirma un hallazgo que ya tienes |
deep-C / NSdeepLink / adb am start | Enumerar y enviar deeplinks | apk-interceptor también puede enviar, pero su diferenciador es recibir un esquema secuestrado y mostrar la URI exacta y los parámetros |
| drozer | Framework de ataque general en el dispositivo (agente + a menudo root) | apk-interceptor es un único APK ligero con barreras de seguridad deliberadas, un alcance más reducido y una distribución más segura para el cliente |
| Metasploit / Frida | Armar o enganchar (ej. RCE de addJavascriptInterface) | apk-interceptor solo verifica la alcanzabilidad del puente con un payload inofensivo; nunca exfiltra ni ejecuta comandos de shell |