SMS Trojans y Toll Fraud: Monetización Silenciosa en Android
Análisis técnico de SMS trojans y toll fraud en Android: cómo familias como Joker, Harly y GriftHorse suscriben a víctimas a servicios premium de forma silenciosa, evaden Google Play Protect y generan millones en fraude de facturación móvil.
El fraude invisible en tu factura
Mientras el ransomware móvil busca pagos directos y el spyware roba información, los SMS trojans operan con una filosofía diferente: monetización silenciosa. En lugar de pedir rescate o exfiltrar datos, suscriben al dispositivo a servicios de pago premium que cobran entre 3 y 15 euros semanales directamente en la factura telefónica.
El usuario no ve notificaciones, no recibe confirmaciones y no sospecha nada hasta que revisa su factura al final del mes. Para entonces, el atacante ya ha cobrado a través de una cadena de afiliados que dificulta el rastreo. Este modelo ha generado cientos de millones de dólares en fraude acumulado y sigue siendo una de las categorías de malware móvil más persistentes en Google Play Store.
Mecanismos de monetización
Los SMS trojans y el toll fraud explotan dos sistemas de facturación móvil diseñados originalmente para servicios legítimos.
SMS premium
El mecanismo clásico. El malware envía mensajes SMS a números de tarificación especial (números cortos premium). Cada SMS enviado genera un cargo que oscila entre 1 y 10 euros, facturado directamente por el operador de telecomunicaciones. El atacante tiene un acuerdo de revenue share con el proveedor del servicio premium.
Flujo del fraude:
- El malware obtiene permiso de envío de SMS (solicitado durante la instalación o vía Accessibility Service).
- Envía un SMS al número premium en segundo plano.
- Intercepta o elimina la notificación de confirmación del operador.
- Borra el SMS enviado del historial de mensajes.
- El cargo aparece en la factura del usuario.
Este mecanismo ha perdido efectividad en versiones recientes de Android. Desde Android 4.2, el sistema muestra un diálogo de confirmación cuando una app intenta enviar SMS a números premium. Desde Android 11, los permisos de SMS están más restringidos.
WAP billing (facturación WAP)
El mecanismo moderno y más difícil de detectar. WAP billing permite suscribirse a servicios premium haciendo clic en un botón de una página web móvil. El operador identifica al usuario por su IP (cuando navega por datos móviles, no por WiFi) y aplica el cargo directamente.
Flujo del fraude:
- El malware desactiva WiFi del dispositivo (requiere datos móviles para que el operador pueda identificar la línea).
- Navega a una URL de suscripción WAP en un WebView invisible (sin interfaz de usuario).
- Hace clic automáticamente en el botón de suscripción.
- Intercepta el SMS de confirmación OTP (One-Time Password) que envía el operador.
- Introduce el OTP automáticamente en el formulario.
- Borra el SMS de confirmación.
- El usuario queda suscrito a un servicio que cobra semanalmente.
La ventaja para el atacante es que WAP billing no requiere permiso de envío de SMS (solo lectura de notificaciones o SMS entrantes). Esto hace que las apps parezcan menos sospechosas en el momento de la instalación.
La familia Joker (Bread)
Joker es la familia de toll fraud más prolífica y persistente en la historia de Android. Documentada por primera vez por CSIS Security Group en 2019, Google la rastrea internamente como "Bread" y ha eliminado más de 1.700 apps infectadas con variantes de Joker de Google Play Store.
Evolución técnica
Joker ha pasado por varias generaciones de técnicas de evasión, adaptándose cada vez que Google endurece sus controles:
Generación 1 (2017-2018): SMS premium directo. Las primeras variantes simplemente enviaban SMS a números premium. Fáciles de detectar por análisis estático buscando permisos SEND_SMS y números premium hardcodeados.
Generación 2 (2019): WAP billing con carga dinámica. El payload malicioso se descargaba desde un servidor C2 después de la instalación. La app en Google Play era limpia. El código descargado ejecutaba el fraude WAP billing.
Generación 3 (2020-2021): ofuscación avanzada y fragmentación. El código malicioso se dividía en múltiples clases con nombres que imitaban librerías legítimas (com.google.firebase.xxx, com.android.support.xxx). Se usaban técnicas de reflection para invocar métodos dinámicamente, evitando patrones detectables en análisis estático.
Generación 4 (2022+): Flutter y frameworks multiplataforma. Variantes empaquetadas en apps Flutter, donde el código Dart compilado dificulta el análisis. Algunas variantes usan versioning: las primeras actualizaciones en Play Store son limpias; el código malicioso se introduce en la versión 1.2 o 1.3, después de acumular instalaciones y reseñas positivas.
Capacidades técnicas
Permisos solicitados:
- READ_SMS / RECEIVE_SMS → interceptar OTP de confirmación
- NOTIFICATION_LISTENER_SERVICE → leer OTP desde notificaciones (sin permiso SMS)
- INTERNET → comunicación C2 y carga de payload
- RECEIVE_BOOT_COMPLETED → persistencia tras reinicio
- ACCESS_NETWORK_STATE → verificar conexión de datos móviles
- CHANGE_WIFI_STATE → desactivar WiFi para forzar datos móviles
Cadena de ataque típica de Joker
| Paso | Acción | Técnica |
|---|---|---|
| 1 | App instalada desde Play Store | App aparentemente legítima (editor de fotos, teclado, escáner) |
| 2 | Descarga payload desde C2 | DEX dinámico o código nativo descargado post-instalación |
| 3 | Desactiva WiFi | Fuerza conexión por datos móviles |
| 4 | Navega a URL de suscripción | WebView invisible en background |
| 5 | Acepta suscripción | JavaScript inyectado simula clic en botón |
| 6 | Intercepta OTP | Lee SMS o notificación de confirmación |
| 7 | Confirma suscripción | Introduce OTP automáticamente |
| 8 | Elimina evidencia | Borra SMS y notificaciones |
La familia Harly
Harly fue documentada por Kaspersky en 2022 y representa una evolución del modelo Joker con diferencias técnicas significativas.
A diferencia de Joker, que descarga su payload malicioso después de la instalación, Harly incluye todo el código malicioso embebido en el APK desde el principio. El payload está cifrado y almacenado en los assets o resources del APK, lo que dificulta su detección por análisis estático pero evita la dependencia de un servidor C2.
Diferencias clave con Joker
| Aspecto | Joker | Harly |
|---|---|---|
| Payload | Descargado post-instalación | Embebido y cifrado en el APK |
| Dependencia C2 | Alta (necesita servidor activo) | Baja (autónomo) |
| Detección por análisis estático | Difícil (código limpio en Play Store) | Posible (payload ofuscado pero presente) |
| Resiliencia | Baja si C2 es eliminado | Alta (funciona offline) |
| Volumen de variantes | Miles | Cientos |
Harly imitaba apps con millones de descargas. Kaspersky identificó variantes disfrazadas de linternas, mini-juegos, apps de mensajería y fondos de pantalla, con más de 4,8 millones de descargas acumuladas.
Técnica de suscripción
Harly usaba un WebView invisible para navegar a páginas de suscripción WAP. A diferencia de Joker, que inyectaba JavaScript, Harly automatizaba la interacción con la página usando evaluateJavascript() para rellenar formularios y simular clics. Para la confirmación OTP, interceptaba la llamada telefónica de verificación (algunos servicios usan llamada en lugar de SMS) o el SMS entrante.
GriftHorse: toll fraud a escala global
GriftHorse, descubierto por Zimperium en septiembre de 2021, infectó más de 10 millones de dispositivos en 70 países. Su infraestructura técnica era más sofisticada que Joker o Harly.
Características:
- Geolocalización: detectaba el país del usuario y suscribía a servicios premium locales del operador correspondiente.
- 200+ apps en Play Store: distribuidas simultáneamente, cubriendo categorías diversas (herramientas, entretenimiento, personalización, lifestyle).
- Facturación mensual: los servicios suscritos cobraban entre 30 y 40 EUR mensuales, acumulando cargos significativos antes de que el usuario lo detectara.
- Servidores C2 dinámicos: la URL de suscripción se obtenía del servidor C2, permitiendo rotar servicios premium y adaptar el fraude por región.
El impacto financiero estimado superó los cientos de millones de dólares globalmente antes de su desmantelamiento.
Distribución vía Google Play Store
La paradoja de los SMS trojans es que su vector de distribución principal es la tienda oficial de Google. Esto es posible por varias razones estructurales.
Por qué pasan los filtros
Volumen: Google Play recibe miles de apps nuevas diariamente. El análisis automatizado (Bouncer, Play Protect) no puede ejecutar análisis profundo de cada una.
Apps legítimas como cobertura: los trojans se empaquetan en apps funcionales. Un editor de fotos que realmente edita fotos, pero en segundo plano ejecuta toll fraud. Los usuarios dejan reseñas positivas por la funcionalidad visible.
Carga diferida: el código malicioso se descarga después de la instalación (Joker Gen 2+) o se activa después de un período de latencia (días o semanas post-instalación).
Cuentas de desarrollador desechables: crear una cuenta de desarrollador en Google Play cuesta 25 USD. Los atacantes crean cuentas nuevas para cada lote de apps maliciosas.
Actualizaciones maliciosas: la primera versión publicada es limpia. El código malicioso se introduce en una actualización posterior, después de que la app ha pasado revisiones y acumulado instalaciones.
Categorías de apps más afectadas
| Categoría | Ejemplos frecuentes | Por qué funciona |
|---|---|---|
| Herramientas | Linternas, escáneres QR, limpiadores | Usuarios buscan soluciones rápidas, baja fidelidad |
| Personalización | Fondos de pantalla, temas, teclados | Alta demanda, muchas opciones similares |
| Comunicación | Apps de SMS, mensajería alternativa | Justifican permisos de SMS legítimamente |
| Fotografía | Editores de fotos, filtros, collage | Alta competencia, usuarios prueban muchas |
| Entretenimiento | Mini-juegos, horóscopos, tests | Instalación impulsiva |
Evasión de Google Play Protect
Google Play Protect escanea apps antes y después de la instalación. Las familias de toll fraud han desarrollado técnicas específicas para evadirlo.
Técnicas de evasión documentadas
Detección de emulador: verifican si el dispositivo es un emulador de análisis (comprobando Build.BRAND, Build.DEVICE, Build.MODEL, sensores disponibles, propiedades del sistema). Si detectan un entorno de análisis, el comportamiento malicioso no se activa.
Retraso temporal: el código malicioso no se ejecuta hasta horas o días después de la instalación. Los análisis automatizados tienen ventanas de ejecución limitadas (típicamente minutos).
Verificación de red: solo ejecutan el fraude cuando detectan conexión por datos móviles (no WiFi), lo que también evita análisis en entornos de sandbox que usan WiFi.
Fragmentación de código: el código malicioso se distribuye en múltiples clases, archivos de configuración y assets cifrados. Ningún archivo individual contiene la lógica completa del fraude.
Reflection y carga dinámica: en lugar de llamar métodos directamente (detectables por análisis estático), se usan Class.forName(), Method.invoke() y DexClassLoader para cargar y ejecutar código en tiempo de ejecución.
Detección
Indicadores en el dispositivo
- Consumo de datos móviles anómalo: el malware desactiva WiFi y usa datos móviles para las suscripciones WAP.
- Batería: los WebViews invisibles y la actividad en background consumen batería adicional.
- Permisos excesivos: una app de linterna que solicita permisos de SMS y notificaciones.
- Apps desconocidas con Notification Listener activo: Configuración > Notificaciones > Acceso a notificaciones.
Indicadores en la factura
- Cargos por "servicios de valor añadido" o "contenido premium" no reconocidos.
- Suscripciones a servicios con nombres genéricos (quiz, horóscopo, noticias premium).
- Cargos recurrentes semanales o mensuales de importes pequeños (3 a 15 EUR).
Análisis de APK
Para analistas que investigan muestras sospechosas:
# Extraer y buscar URLs de suscripción WAP
apktool d app.apk -o app_decompiled
grep -r "subscribe" app_decompiled/
grep -r "wap" app_decompiled/
grep -r "premium" app_decompiled/
# Buscar permisos sospechosos en el manifiesto
grep "SEND_SMS\|RECEIVE_SMS\|READ_SMS\|NOTIFICATION" app_decompiled/AndroidManifest.xml
# Buscar carga dinámica de código
grep -r "DexClassLoader\|PathClassLoader\|loadClass\|Class.forName" app_decompiled/
Impacto financiero
El toll fraud es el tipo de malware móvil con mayor impacto económico directo, superando incluso al ransomware móvil.
| Familia | Dispositivos afectados | Impacto estimado |
|---|---|---|
| Joker/Bread | Decenas de millones | Cientos de millones USD (acumulado desde 2017) |
| GriftHorse | 10+ millones | Cientos de millones USD |
| Harly | 4,8+ millones | Decenas de millones USD |
| Dark Herring | 105+ millones | Cientos de millones USD |
Las cifras son estimaciones basadas en instalaciones conocidas y cargos promedio. El impacto real es probablemente superior porque muchos usuarios nunca detectan los cargos.
Por qué es tan lucrativo
El modelo de negocio del toll fraud tiene ventajas que lo hacen especialmente atractivo para los atacantes:
- Baja detección: los cargos son pequeños y aparecen como servicios legítimos en la factura.
- Cobro garantizado: a diferencia del ransomware (donde la víctima puede no pagar), el cargo se aplica automáticamente.
- Escalabilidad: una vez creada la infraestructura, el coste marginal de cada víctima adicional es casi cero.
- Jurisdicción compleja: la cadena de facturación involucra operadores de telecomunicaciones, agregadores de pagos y proveedores de servicios premium en múltiples países.
Recursos
- Google: Bread (Joker) threat analysis (análisis oficial de Google)
- Kaspersky: Harly trojan analysis (análisis técnico detallado)
- Zimperium: GriftHorse campaign (descubrimiento y análisis)
- MITRE ATT&CK Mobile: Toll Fraud (T1448)
- Google Play Protect (documentación del sistema de protección)
- GSMA: WAP Billing Best Practices (estándares de la industria para facturación móvil)
Preguntas frecuentes
Libros recomendados
Artículos relacionados
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.