
Introducción
Las versiones antiguas de Android contenían varias vulnerabilidades que otorgaban acceso root al dispositivo. Muchos programas maliciosos las explotaron activamente para elevar privilegios y arraigarse en el sistema. El famoso troyano Triada también utilizó este vector de ataque. Con el tiempo, las vulnerabilidades fueron corregidas y se añadieron restricciones en el firmware: en particular, en las nuevas versiones de Android no se pueden editar las particiones del sistema, incluso con derechos de superusuario. En cierto modo, esto benefició a los delincuentes: aunque los programas maliciosos que ingresaban al dispositivo desde el exterior tenían derechos limitados, los que venían preinstalados en las secciones del sistema, por el contrario, se volvieron imposibles de eliminar. Los delincuentes están aprovechando activamente esta peculiaridad e integrando software malicioso en el firmware de los dispositivos Android. Esto es precisamente lo que hacía una de las amenazas que descubrimos: el cargador Dwphon, que estaba integrado en las aplicaciones del sistema para actualizaciones OTA (over-the-air). En nuestra investigación de marzo de 2025, mostramos que el troyano Triada también se había adaptado a las dificultades para elevar privilegios en las nuevas versiones de Android: los atacantes incorporaron un nuevo cargador multinivel en el firmware de una serie de dispositivos, que provocó que el proceso Zygote se infectara y, por ende, que también se infectara cualquier aplicación iniciada en el sistema.
En resumen, estas son nuestras conclusiones:
- Hemos descubierto nuevas versiones del troyano Triada en dispositivos que ya llevaban un firmware infectado antes de salir a la venta. Se trata de falsificaciones de teléfonos inteligentes de marcas conocidas que, en el momento de la investigación, todavía estaban disponibles en varios mercados en línea.
- Una copia del troyano se introduce en cada aplicación que se inicia en el dispositivo infectado. Dado que el malware se basa en una arquitectura modular, los atacantes obtienen un control casi ilimitado sobre todo el sistema, incluida la capacidad de adaptar su funcionalidad a aplicaciones específicas.
- Las cargas útiles analizadas en la versión vigente de Triada, dependiendo de la aplicación en la que se ejecuten, alteran las direcciones de billeteras de criptomonedas durante las transferencias, sustituyen enlaces en los navegadores, envían los mensajes SMS que quieran e interceptan sus respuestas, además de que sustraen credenciales de servicios de mensajería y redes sociales.
La cadena completa de infección es la siguiente:
Las soluciones de Kaspersky detectan una nueva versión de Triada gracias al veredicto Backdoor.AndroidOS.Triada.z.
Marco de sistema con dependencia maliciosa.
Al comienzo de la investigación, nuestra atención se centró en las bibliotecas nativas en el firmware de diversos dispositivos, ubicadas en las siguientes rutas:
- /system/framework/arm/binder.so
- /system/framework/arm64/binder.so
Tal archivo no existe en la versión de referencia de Android. Más tarde descubrimos que la biblioteca sospechosa cargaba en Zygote (el proceso principal de cualquier aplicación de Android) un framework del sistema, compilado con un AOT infectado (boot-framework.oat) y ubicado en el mismo directorio.
La biblioteca binder.so registra el método nativo println_native para la clase android.util.Log, que las aplicaciones en el dispositivo usan para guardar mensajes en el registro Logcat. Al ser implementado, este método invoca a la función sospechosa _config_log_println.
La función _config_log_println, a su vez, invoca a otras dos funciones que despliegan en cada proceso tres módulos ubicados en la sección rodata de la biblioteca maliciosa. Una de las funciones se ejecuta en todos los casos, mientras que la segunda solo si la versión de Android en el dispositivo no supera la 9.
Consideremos con más detalle los módulos que se ejecutan.
1. Módulo auxiliar
Este módulo de la sección rodata de la biblioteca maliciosa se guarda en el directorio interno de datos de la aplicación bajo el nombre systemlibarm64_%N%.jar, donde N es un número aleatorio.
El módulo auxiliar registra un receptor que permite cargar archivos de código arbitrarios, aunque en los casos que describimos más adelante no hemos observado tal actividad. Anticipándonos, llamamos a este módulo “auxiliar”, ya que fue utilizado por otras cargas útiles para llevar a cabo sus funciones maliciosas. Así, para la clase com.android.core.info.config.JvmCore de este módulo, binder.so registra métodos nativos que permiten interceptar llamadas a métodos arbitrarios en el proceso donde opera el malware.
2. Puerta trasera mms-core.jar
Este módulo se descifra dos veces utilizando el método XOR con diferentes claves de la sección rodata de la biblioteca maliciosa, luego se guarda en el disco en la ruta /data/data/%PACKAGE%/mms-core.jar y se carga utilizando DexClassLoader. Después de la carga, se elimina el archivo de la carga útil.
mms-core.jar: la nueva versión de la puerta trasera que mencionamos en nuestros informes anteriores. Antes se cargaba en el proceso Zygote a través de la explotación y modificación de archivos del sistema, pero ahora el malware asegura su entrada en Zygote al cargarse mediante un marco de sistema infectado. Al igual que en versiones anteriores, este backdoor descarga y ejecuta otras cargas útiles.
3. ¿Criptostealer o dropper?
Al comenzar su trabajo, la biblioteca binder.so lee el archivo /proc/%PID%/cmdline, donde %PID% es el identificador del proceso en el sistema. De esta manera, el troyano determina el nombre del paquete de la aplicación que se está ejecutando.
Dependiendo del nombre del paquete, binder.so carga una de las dos cargas útiles desde la sección rodata: un cargador de criptostealer si la aplicación está relacionada con criptomonedas, o un dropper si no lo está. Ninguna de las cargas útiles está cifrada.
El criptostealer Triada
En las otras versiones de Triada que tuvimos la oportunidad de estudiar, el criptostealer se cargaba de forma directa en las aplicaciones de criptomonedas. Pero en las muestras más recientes, el módulo malicioso es un cargador que apunta a aplicaciones con los siguientes nombres de paquete:
1 2 3 4 5 6 |
com.binance.dev com.wrx.wazirx com.coinex.trade.play com.okinc.okex.gp pro.huobi com.kubi.kucoin |
El punto de entrada en el cargador malicioso es el método onCreate de la clase com.hwsen.abc.SDK. En las últimas versiones, este módulo solicita la configuración desde un repositorio en GitHub: utilizando un generador de números pseudoaleatorios, la muestra elige el número 0, 1 o 2, cada uno de los cuales corresponde a la dirección de determinado repositorio.
Todos los valores de los campos en la configuración están cifrados con el algoritmo AES-128 en modo ECB y codificados con Base64. He aquí un ejemplo de configuración descifrada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "addr": { "durl": "https://app-file.b-cdn[.]net/poctest/pc2215202501061400.zip", "durl2": "https://app-file.b-cdn[.]net/poctest/pc2215202501061400.zip", "durl3": "https://app-file.b-cdn[.]net/poctest/pc2215202501061400.zip", "ver": "17", "vname": "pc2215202501061400.zip", "online": "true", "rom": "true", "update": "true", "pkg": "com.android.system.watchdog.x.Main", "method": "onCreate", "param": "t" } } |
Si el campo online tiene el valor true, el cargador descarga la carga útil desde la URL indicada en el campo durl. Si ocurren errores utiliza durl2 y durl3 como enlaces de reserva. La carga útil se descifra mediante XOR con la clave dada y se guarda en la carpeta data del directorio interno de la aplicación, con el nombre especificado en el parámetro vname. Los campos pkg y method son el nombre de la clase y el método que se invocarán después de cargar el criptostealer mediante DexClassLoader.
La carga útil descargada intenta robar las criptomonedas de la víctima de diferentes maneras. Por ejemplo, a intervalos predefinidos, monitorea las actividades que se están ejecutando. El troyano necesita hacerlo para reemplazar las direcciones de las billeteras de criptomonedas de la víctima por las direcciones de los atacantes en los elementos de texto correspondientes cuando el usuario intenta retirar criptomonedas. Para ello, en la actividad actual, el malware recorre en profundidad todos los subelementos gráficos del fotograma activo y así identifica la cadena de bloques a la que se están transfiriendo los fondos. Luego, el troyano suplanta la dirección de la billetera de criptomonedas por la especificada en el código, y los controladores de clic de todos los botones en la aplicación con un controlador proxy que vuelve a reemplazar la dirección de la billetera de criptomonedas, garantizando así a los atacantes el robo de fondos. Además, es interesante que el criptostealer también reemplaza las imágenes por códigos QR con direcciones de billeteras controladas por los atacantes.
El troyano también monitorea el portapapeles y, si encuentra la dirección de una billetera de criptomonedas, la reemplaza con la dirección de los atacantes.
El dropper
Si la biblioteca binder.so se ejecuta en una aplicación no relacionada con criptomonedas, descarga otra carga útil en la que invoca al método onCreate de la clase com.system.framework.api.vp2130.services. Esta carga útil es un dropper que, dependiendo de la versión, puede extraer desde su propio contenido hasta tres módulos adicionales codificados en Base64.
- En el primer módulo se carga la clase com.android.packageinstaller.apiv21.ApiV21 en la aplicación del sistema que rige la instalación de archivos APK. Esta clase registra un receptor que permite a otros módulos instalar APK arbitrarios en el dispositivo, así como eliminar cualquier aplicación.
A partir de Android 13, las aplicaciones descargadas fuera de tiendas oficiales no pueden acceder a permisos peligrosos, como el uso de funciones de accesibilidad. Para pasar por alto las limitaciones de las aplicaciones descargadas, en las nuevas versiones de Android, el receptor las instala a través de una sesión de instalación.
- En el segundo módulo se carga la clase com.system.framework.audio.Audio para bloquear las conexiones de red. Dependiendo de la arquitectura del sistema, decodifica y carga una biblioteca nativa auxiliar, que mediante la biblioteca xhook intercepta las llamadas a las funciones getaddrinfo y android_getaddrinfofornet. Estas funciones implementan el protocolo de comunicación con el servicio dnsproxyd en Android, que realiza consultas DNS y opera bajo el modelo “cliente-servidor”. Si los atacantes enviaron un comando para bloquear un dominio específico, su nombre se reemplaza con un hook que remite a la IP 127.0.0.1, haciendo imposible el acceso al dominio original.
De este modo, un malware puede, por ejemplo, bloquear las solicitudes a los servicios antifraude si no utilizan una implementación propia de DNS.
- En el tercer módulo se carga la clase com.system.framework.api.init.services para descargar cargas útiles arbitrarias. Para ello, el malware envía a intervalos regulares solicitudes al servidor de comando con una gran cantidad de información sobre el dispositivo (dirección MAC, modelo, procesador, fabricante, IMEI, IMSI, etc.), así como el nombre y la versión de la aplicación en la que se ejecuta el troyano. Antes de enviarlos, cifra los datos con el algoritmo AES-128 en modo CBC y también los codifica utilizando Base64. El C2 devuelve como respuesta un JSON que contiene información sobre la carga útil, también cifrada con AES-128 en modo CBC. El servidor de comando envía la clave y el IV al dispositivo infectado en el mismo JSON, cifrándolos con el algoritmo RSA.
Para mayor comodidad, en adelante llamaremos a este módulo la “puerta trasera Triada”. Este módulo es de gran interés para la investigación, ya que ofrece amplias posibilidades al malware. Decidimos analizar en detalle los objetivos de los atacantes de Triada y nos llevamos una sorpresa: antes las muestras maliciosas se centraban en mostrar publicidad y activar suscripciones de pago, pero ahora las intenciones cambiaron radicalmente.
¿Que descarga Triada?
Para entender con propiedad cómo han cambiado las prioridades de los atacantes, decidimos intentar descargar cargas útiles para varias aplicaciones populares. Notamos que la biblioteca maliciosa binder.so, al iniciarse, transmite al dropper un indicador que se activa si el nombre de la aplicación figura en una lista incluida en el código de la biblioteca. Entre estas aplicaciones hay tanto aplicaciones del sistema como aplicaciones populares de las tiendas oficiales.
Esta lista sirvió como punto de partida de nuestra investigación. Enviamos solicitudes al servidor de comando del malware para todas las aplicaciones mencionadas, y algunas respondieron con enlaces para descargar las cargas útiles. Por ejemplo, este fue el mensaje que nos envió el troyano después de que solicitaramos la carga útil para la aplicación de mensajería Telegram.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
{ "a": 0, "b": "40E315FB00M8EP2G49008INIK7000002", "c": 1373225559, "d": [{ "a": 72, "b": "http://ompe2.7u6h8[.]xyz/tgzip/44a08dc22b45b9418ed427fd24c192c6.zip", "c": "com.tgenter.tmain.Engine", "d": "start", "e": 32, "f": "44a08dc22b45b9418ed427fd24c192c6", "g": "https://mp2y3.sm20j[.]xyz/tgzip/44a08dc22b45b9418ed427fd24c192c6.zip" }, { "a": 127, "b": "http://ompe2.7u6h8[.]xyz/tgzip/tgnetuser/online/37fd87f46e95f431b1977d8c5741d2d5.zip", "c": "com.androidx.tlttl.tg.CkUtils", "d": "init", "e": 7, "f": "37fd87f46e95f431b1977d8c5741d2d5", "g": "https://mp2y3.sm20j[.]xyz/tgzip/tgnetuser/online/37fd87f46e95f431b1977d8c5741d2d5.zip" } ], "e": 245, "g": ["com.instagram.android"], "h": "org.telegram.messenger.web,org.telegram.messenger,com.whatsapp.w4b,com.fmwhatsapp,com.gbwhatsapp,com.yowhatsapp,com.facebook.lite,com.facebook.orca,com.facebook.mlite,com.skype.raider,com.zhiliaoapp.musically,com.obwhatsapp,com.ob3whatsapp,com.ob2whatsapp,com.jtwhatsapp,com.linkedin.android,com.zhiliaoapp.musically.go,com.opera.browser.afin,com.heytap.browser,com.sec.android.app.sbrowser,org.mozilla.firefox,com.microsoft.emmx,com.microsoft.emmx.canary,com.opera.browser" } |
La información sobre las cargas útiles enviadas por el C2 llegaba en forma de una matriz de objetos, cada uno de los cuales contenía dos enlaces de descarga (principal y de reserva), el hash MD5 del archivo descargado, información sobre el punto de entrada del módulo y su identificador. Los módulos, después de ser descargados, se descifraban dos veces con diferentes claves utilizando XOR.
Además, la respuesta del servidor C2 contenía otros nombres de paquetes, que nos permitieron obtener cargas útiles adicionales.
Cabe señalar que, en el modelo de seguridad de Android, los usuarios no privilegiados no tienen acceso a ciertos datos de las aplicaciones en condiciones normales. Sin embargo, como ya lo hemos mencionado, el malware se carga mediante el proceso Zygote, lo que permite eludir las restricciones del sistema operativo, ya que cada carga útil funciona en el proceso de la aplicación que la requiere. De este modo, los módulos pueden acceder a cualquier dato de la aplicación, algo que los atacantes aprovechan de forma activa en las siguientes fases del ataque. Además, cada carga útil adicional del malware puede utilizar todos los permisos disponibles para la aplicación.
Al analizar los módulos, también notamos que los desarrolladores de Triada son muy hábiles: cada carga útil fue creada teniendo en cuenta las particularidades del desarrollo de la aplicación específica. Veamos qué módulos cargaba el troyano en las aplicaciones populares de Android.
Módulos para Telegram
En el momento de la investigación, el backdoor Triada descargaba dos módulos para la aplicación de mensajería Telegram. El primer módulo (b8a745bdc0e083ffc88a524c7f465140) ejecuta una tarea maliciosa al día en la aplicación. Creemos que antes de escribir el código de esta tarea, los atacantes estudiaron a fondo el funcionamiento interno de Telegram.
Primero, la tarea maliciosa intenta obtener los datos de la cuenta de la víctima. Para esto, el módulo lee una cadena con la clave “user” de los pares “clave-valor”, almacenados mediante SharedPreferences en archivo XML de configuración de la aplicación llamado userconfig. Esta cadena contiene datos serializados de usuario de Telegram, codificados en formato Base64, que se deserializan en el código del cliente de mensajería para interactuar con la API. Esto es lo que aprovecha el malware: Triada intenta de manera secuencial, utilizando varios métodos, leer datos del usuario mediante reflexión.
El malware envía la siguiente información del usuario al servidor de comando, si no lo ha hecho antes:
- Cadena serializada con los datos de la cuenta de la víctima.
- Número de teléfono de la víctima.
- Contenido del archivo tgnet.dat del directorio data de la aplicación.
Contiene datos para la autorización en Telegram, incluido el token, lo que permite a los atacantes obtener control total sobre la cuenta de la víctima.
- Cadena con id = 1 de la tabla params en la base de datos cache4.db.
Además, esta carga útil contiene código no utilizado, cuya función es mostrar anuncios.
El segundo módulo (fce117a9d7c8c73e5f56bda7437bdb28) se decodifica utilizando Base64 y ejecuta otra carga útil (8f0e5f86046faed1d06bca7d3e48c0b8). Esta, a su vez, registra su propio visor de nuevos mensajes en el mensajero, que verifica su contenido. Si el texto del mensaje satisface las expresiones regulares que el troyano recibe del C2, entonces se elimina del cliente. Además, este módulo intenta eliminar las notificaciones de Telegram sobre nuevas sesiones.
Además, el malware intenta iniciar una conversación con un bot que, en el momento de la investigación, ya no existía.
El módulo para Instagram
Cuando este módulo (3f887477091e67c6aaca15bce622f485) empieza a funcionar, solicita el identificador de publicidad del dispositivo a través de los servicios de Google Play, para usarlo como identificador de la víctima. Luego, una vez al día, ejecuta una tarea maliciosa que revisa uno por uno todos los archivos XML de SharedPreferences hasta encontrar el primer archivo cuyo nombre comience con UserCookiePrefsFile_. Estos archivos contienen cookies de sesiones activas en Instagram. Interceptarlos permite a los delincuentes tomar el control de la cuenta de la víctima. La tarea también reúne todos los archivos del directorio analytics, en la carpeta data, cuyos nombres terminan en “batch” .
Estos archivos, junto con la información sobre el dispositivo infectado, se envían codificados con Base64 al C2.
Módulo para navegadores
Este módulo (98ece45e75f93c5089411972f9655b97) se carga en los navegadores con los siguientes nombres de paquetes:
- com.android.chrome
- org.mozilla.firefox
- com.microsoft.emmx
- com.microsoft.emmx.canary
- com.heytap.browser
- com.opera.browser
- com.sec.android.app.sbrowser
- com.chrome.beta
Primero establece una conexión con el C2 a través de los sockets TCP, luego utiliza el algoritmo RSA para cifrar la concatenación de IV y la clave para AES-128 en modo CBC. El troyano utiliza AES para cifrar la información sobre el dispositivo infectado y luego la combina con la clave y el IV en un solo búfer grande, que envía a través de un socket TCP.
En respuesta, el C2 envía un búfer cifrado con los mismos parámetros que la solicitud del dispositivo infectado. La respuesta contiene una tarea para reemplazar de forma periódica los enlaces que se abran en el navegador. Este es un ejemplo de la tarea:
1 2 3 4 5 6 7 8 9 10 11 |
{ "a": 0, "b": 1, "c": 65, "d": { "a": 17, "b": "https://stas.a691[.]com/", "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], "d": 2880 } } |
La sustitución de enlaces se organiza de la siguiente manera. Primero, el módulo verifica la versión y el nombre del navegador en el que se ejecuta, para registrar los hooks en los métodos internos del navegador que se encargan de abrir enlaces.
Al principio señalamos que, en las primeras etapas, el troyano descarga un módulo auxiliar que implementa la funcionalidad de interceptar métodos arbitrarios. El módulo para navegadores lo utiliza de forma activa, interfiriendo así en el proceso de apertura de páginas en varios navegadores.
Además, el malware utiliza la reflexión para reemplazar la instancia de la clase Instrumentation para la aplicación. En la clase proxy se suplanta el método execStartActivity, que inicia las actividades de la aplicación.
Las actividades de la aplicación en Android se inician mediante la difusión de un objeto de intención (Intent) con una acción específica. Si una aplicación tiene una actividad que declara en su filtro de intenciones la capacidad de manejar dicha acción, Android la iniciará. Cuando cualquier aplicación abre un enlace en el navegador, crea y envía una instancia de la clase Intent con la acción android.intent.action.VIEW, donde coloca el URI que desea abrir. Triada suplanta el URI en la instancia de clase que recibe.
En las muestras que investigamos, el servidor de comando enviaba enlaces a recursos publicitarios, sin embargo, creemos que los autores del malware pueden utilizar esta funcionalidad con otros fines, como para enviar phishing.
Módulos para WhatsApp
Para WhatsApp, el servidor de comando del troyano entregaba dos módulos. Uno de ellos (d5bc1298e436424086cb52508fb104b1) ejecuta una tarea maliciosa cada cinco minutos en el cliente de WhatsApp. Esta tarea accede a varias claves necesarias para el funcionamiento del cliente, así como datos sobre la sesión activa.
Estos datos, junto con la información del dispositivo de la víctima, se envían al servidor C2, proporcionando así a los atacantes acceso completo a la cuenta de la víctima en la aplicación de mensajería.
Otro módulo (dc731e55a552caed84d04627e96906d5), primero intercepta las funciones del cliente de WhatsApp que son responsables de enviar y recibir mensajes. Mientras tanto, los atacantes solucionaron la ofuscación de los nombres de las clases en el código de la aplicación de mensajería de una manera interesante: los nombres de la clase y el método de intercepción para diferentes versiones de WhatsApp se encuentran en el código del módulo. Lo más probable es que los atacantes tuvieran que analizar manualmente el mecanismo de funcionamiento de cada versión para crear esta lista. También cabe señalar que, si en el código del módulo faltan los nombres de las clases para la versión del cliente, el malware puede solicitar la configuración de intercepción desde el servidor de comando de los atacantes.
Si una intercepción tiene éxito, el módulo sigue funcionando: envía datos sobre el dispositivo infectado al servidor C2 y recibe una respuesta que contiene la dirección IP del socket TCP. A través de este socket se transmiten comandos que permiten al malware realizar las siguientes acciones:
- enviar mensajes arbitrarios en la aplicación;
- eliminar de forma local los mensajes enviados, para borrar sus rastros;
- cerrar la conexión.
Módulo para LINE
Este módulo (1d582e2517905b853ec9ebfe77759d15) se ejecuta dentro de la aplicación de mensajería LINE. Primero, el malware recopila información sobre el dispositivo infectado y la envía al servidor C2. Luego, cada 30 segundos, comienza a recopilar datos internos de la aplicación, en particular los valores de los campos PROFILE_AUTH_KEY y PROFILE_MID de la tabla settings en la base de datos naver_line. El módulo malicioso también obtiene la cadena User-Agent e información adicional para emular solicitudes HTTP en nombre del cliente de mensajería. Además, el malware extrae de la base de datos naver_line el número de teléfono del usuario y su región, y también utiliza la reflexión para obtener el token de acceso de la aplicación, lo que permite tomar control de la cuenta de la víctima.
El módulo envía los datos recibidos al servidor de comando.
Módulo para Skype
Este módulo (b87706f7fcb21f3a4dfdd2865b2fa733), inicia una tarea maliciosa cada dos minutos para tratar de enviar información sobre el dispositivo infectado al C2. Tan pronto como el C2 acepta la solicitud, la tarea se detiene y el troyano comienza a leer los archivos internos de Skype cada hora. Primero, el módulo intenta extraer un token para acceder a la cuenta de Skype desde el llavero (o almacén de credenciales) del framework React Native.
Si el malware no logra obtener el token de esta manera, lo busca en las cookies de WebView.
Este token luego se envía al servidor de comando del troyano, lo que pone en peligro la cuenta de la víctima.
En las versiones de Triada que conocemos, no hay cargas útiles para Microsoft Teams y Skype Empresarial. Sin embargo, creemos que después de que se suspenda el soporte para Skype, los atacantes podrían ampliar la funcionalidad del troyano y añadir nuevos módulos maliciosos.
Módulo para TikTok
Este módulo (993eb2f8bf8b5c01b30e3044c3bc10a3) envía información sobre el dispositivo infectado al servidor de los atacantes una vez al día. Además, el malware recopila una variedad de datos de la cuenta de la víctima: por ejemplo, lee los archivos de cookies en caché de TikTok desde el directorio interno, que podrían haber sido utilizados por WebView dentro de la aplicación. En las cookies, los atacantes buscan el msToken, necesario para trabajar con la API de TikTok. El módulo también extrae otra información del cliente: el identificador de usuario de TikTok secUID, el User-Agent para las solicitudes a la API, etc. Creemos que estos datos son necesarios para que los delincuentes logren burlar las restricciones del API de TikTok y emulen un dispositivo real al realizar solicitudes al API. Cada cinco minutos, el módulo malicioso intenta enviar toda la información recopilada al servidor de los atacantes.
Módulos para Facebook
Uno de los módulos descargables (b187551675a234c3584db4aab2cc83a9) ejecuta una tarea maliciosa a intervalos de un minuto, que busca el nombre del paquete de la aplicación principal en la siguiente lista:
- com.facebook.lite
- com.facebook.mlite
- com.facebook.orca
Si el nombre del paquete de la aplicación coincide con uno de los mencionados, el malware roba las cookies necesarias para la autorización en Facebook.
Otro módulo (554f0de0bddf30589482315fe336ea72) envía datos sobre el dispositivo infectado al C2. En respuesta, el servidor de los atacantes envía un enlace para abrirlo en WebView, así como un código JavaScript para ejecutarlo en la página que se abre. En ella, algunos elementos pueden ser enviados por el malware al servidor de comando, lo que en teoría puede ser utilizado por los atacantes para robar datos de la cuenta de la víctima.
Módulos SMS
Estas cargas útiles se integran en aplicaciones de mensajería SMS. Uno de ellos (195e0f334beb34c471352179d422c42f), cuando empieza a funcionar, registra su proxy-receptor para SMS y MMS entrantes, así como su propio visor de mensajes. Después, el malware recibe reglas del servidor C2, que guarda en una base de datos separada y se basa en ellas para filtrar el contenido de cada mensaje recibido.
La flexibilidad de estas reglas permite al malware responder a algunos SMS, extrayendo códigos de los mensajes entrantes mediante expresiones regulares. Creemos que los autores del troyano utilizan esta funcionalidad sobre todo para gestionar suscripciones de pago. Además, el módulo puede enviar SMS arbitrarios si el el C2 les envía el comando correspondiente.
El módulo incluye fragmentos de código que no se usan, pero cuyo análisis es interesante, ya que también definen reglas de filtrado de mensajes. Cada regla contiene un valor de cadena que define su tipo: un hash MD5 de algunos datos. En el código del módulo hay métodos matchWhatsapp y matchRegister, que utilizan el mismo tipo de regla. El análisis del método matchWhatsapp mostró que antes esta carga útil podía ocultar las huellas del trabajo de otros módulos y eliminar los SMS con códigos de verificación para acceder a la cuenta de WhatsApp de la víctima. Que se aplique el mismo tipo de regla nos hace pensar que el módulo malicioso también utiliza el método matchRegister también para ocultar sus actividades; es posible que los atacantes hayan registrado cuentas a escondidas con su ayuda. Es probable que este método ya no se utilice, porque ahora el malware admite la obtención de reglas desde el servidor de comando.
Es probable que el segundo módulo (2ac5414f627f8df2e902fc34a73faf44) sea auxiliar del primero. Porque que al enviar un SMS, Android verifica al destinatario. Si el mensaje se envía a un número corto (SMS Premium), el usuario deberá confirmar el envío. Esto se hace para que el propietario del dispositivo no pierda dinero si se enfrenta a un troyanos SMS. La clase SMSDispatcher en el framework de Android verifica si una aplicación específica tiene permiso para enviar SMS Premium. Para ello, llama al método getPremiumSmsPermission de la clase SmsUsageMonitor, que almacena las directivas de envío de SMS Premium para cada aplicación utilizando el mecanismo SharedPreferences con la clave premium-sms-policy. Las directivas son un número entero con los siguientes valores posibles:
- 1: antes de enviar un SMS Premium, se requiere la confirmación del usuario.
- 2: el envío de SMS Premium está prohibido para la aplicación.
- 3: el envío de SMS Premium está permitido, no se requiere confirmación del usuario.
El módulo malicioso establece el valor de la política para las aplicaciones de intercambio de SMS en 3, eliminando así los obstáculos para el funcionamiento del módulo anterior. Cabe señalar que esta funcionalidad no está documentada por los desarrolladores de Android, lo que destaca una vez más la pericia técnica de los autores del malware.
Proxy inverso
Este módulo (3dc21967e6fab9518275960933c90d04), según nuestros datos, se integra en la aplicación de servicios de Google Play. Cuando empieza a funcionar, envía información sobre el dispositivo infectado al servidor de comando. En respuesta, el C2 envía la dirección IP y el puerto desde el cual el malware “escucha” los comandos utilizando una versión modificada de la biblioteca EasySocket. Los comandos son números enteros y pueden tomar tres valores:
- 1: establecer una conexión TCP con una dirección IP arbitraria en el puerto especificado y asignarle el id. proporcionado en el comando;
- 2: cerrar la conexión TCP que tenga el id. especificado;
- 4: enviar datos a través de la conexión TCP con el id. especificado.
De este modo, la tarea principal de este módulo es convertir el dispositivo infectado en un proxy inverso, es decir, dar a los atacantes acceso a Internet en nombre de la víctima.
Intercepción de llamadas
Este módulo (a4f16015204db28f5654bb64775d75ad) se carga en la aplicación de llamadas por telefonía móvil. Registra un receptor malicioso que, al recibir ciertos objetos de intención (Intent), puede ejecutar código JavaScript arbitrario mediante WebView.
El malware proporciona a los códigos JavaScript una interfaz para llamar a algunas funciones de Java. Una de las funciones recibe el número de teléfono de la víctima y envía un objeto de intención que lo contiene.
El número del equipo se transmite en el campo “type” del objeto de intención (intent). Sin embargo, el módulo no tiene un procesador de números; asumimos que está implementado en otra carga útil que no pudimos obtener durante la investigación.
También consideramos que este módulo sigue en etapa de desarrollo. Por ejemplo, de manera similar al módulo para navegadores, reemplaza la clase “Instrumentation” para suplantar el número que se abre mediante el objeto de intención android.intent.action.VIEW. Sin embargo, no hay un código para suplantar el número en el módulo.
Creemos que la funcionalidad de sustitución de números o bien está implementada en otra versión de este módulo, o será añadida en un futuro cercano.
Clipper
Este módulo (04e485833e53aceb259198d1fcba7eaf), según nuestros datos, se integra en la aplicación de Google Play. Al inicio del trabajo, solicita del servidor de comando una lista de billeteras de criptomonedas de los atacantes, separada por comas. Si no puede obtener las direcciones, el troyano utiliza las direcciones contenidas en su propio código. A continuación, el módulo verifica el contenido del portapapeles cada dos segundos y, si detecta una dirección de billetera de criptomonedas, la cambia por una que está bajo control de los delincuentes. Además, el malware registra un controlador de eventos para cambios en el portapapeles, donde también verifica y suplanta el contenido.
Módulo adicional
En el informe anterior, describimos los módulos maliciosos que descarga el primer backdoor Triada. Decidimos verificar si la lista de sus cargas útiles ha cambiado. Desafortunadamente, en el momento de la investigación, el servidor de comando del backdoor no enviaba enlaces para descargar módulos adicionales. Sin embargo, notamos que para los puntos de entrada de los módulos se utiliza un formato especial de nombres idéntico, del cual hablaremos en detalle más adelante. Y esto debido a que logramos encontrar otro malware Triada en nuestra telemetría. Este módulo se llama BrsCookie_1004 (952cc6accc50b75a08bb429fb838bff7) y está diseñado para interceptar cookies de Instagram en los navegadores.
Características de la campaña
Durante el análisis de este troyano, encontramos varios detalles de interés. Por ejemplo, su similitud con las primeras versiones de Triada (308e35fb48d98d9e466e4dfd1ba6ee73): en ellas se implementa la misma lógica de carga de módulos adicionales, como en el backdoor mms-core.jar, que el framework infectado desplegaba.
Además, en el código de los módulos se encuentran regularmente líneas que comienzan con PPP.
Las funciones de la biblioteca maliciosa binder.so establecen propiedades del sistema similares a las propiedades en versiones anteriores de Triada. Estas y otras similitudes nos permiten afirmar que la muestra estudiada es una nueva versión de Triada.
Durante el análisis de los módulos, encontramos comentarios en chino, lo que nos lleva a concluir que los desarrolladores son hablantes nativos de chino. Además, nos llamó la atención uno de los servidores C2 al que se conectaban los módulos de Triada: g.sxim[.]me. Este dominio también se utilizó como C2 de uno de los módulos del backdoor Vo1d, lo que indica su posible conexión con Triada.
Vector de propagación
En todos los casos de infección que vimos, el firmware de los dispositivos presentaba una huella de compilación que se diferenciaba de las huellas de los firmware oficiales por la última letra. La búsqueda de casos similares nos llevó a foros donde los usuarios se quejaban de que habían comprado dispositivos falsificados en tiendas en línea. Es muy probable que una de las etapas de la cadena de suministro se haya visto afectada, y los vendedores en las tiendas en línea podrían no haber sospechado que estaban distribuyendo dispositivos falsificados e infectados con Triada.
Traducción:
Tal vez a alguien le sea útil: la historia de una falsificación de <> de la tienda <>
Por favor, dejen este mensaje por que quizá le ayude a algún desafortunado como yo a revivir su teléfono por su cuenta
Antes:
Después:
Las víctimas
Según los datos de telemetría de KSN, nuestras soluciones de seguridad detectaron más de 4500 dispositivos infectados en todo el mundo. El mayor número de dispositivos infectados se registró en Rusia, Reino Unido, Países Bajos, Alemania y Brasil. Al mismo tiempo, el número real de dispositivos infectados podría ser mucho mayor, considerando el vector de propagación no estándar descrito en este artículo. En el siguiente gráfico se muestra el TOP 10 de países por el número de usuarios atacados, del 13 de marzo al 15 de abril de 2025.
Top 10 de países por número de usuarios atacados por Triada, del 13 de marzo al 15 de abril de 2025 (descargar)
Por separado, decidimos calcular cuántas criptomonedas robaron los autores de Triada. Para ello, enviamos una solicitud a los servidores de comando del troyano y recibimos en respuesta las direcciones de las billeteras de reemplazo. La búsqueda en fuentes abiertas mostró que los delincuentes han recibido en sus billeteras más de 264 mil dólares en diversas criptomonedas desde el 13 de junio de 2024. El siguiente gráfico muestra el saldo de algunos monederos utilizadas por los atacantes.
Gráfico de rentabilidad de los monederos TRON de los delincuentes (descargar)
Conclusión
La nueva versión del troyano Triada es un backdoor multinivel que otorga a los atacantes un control ilimitado sobre el dispositivo de la víctima. La arquitectura modular del malware ofrece a sus autores diversas posibilidades para llevar a cabo actividades maliciosas, entre ellas la entrega selectiva de nuevos módulos y la infección masiva de determinadas aplicaciones. Si su teléfono ha sido infectado con Triada, le recomendamos seguir los siguientes pasos para minimizar las consecuencias de las actividades maliciosas:
- Instale un firmware limpio en el dispositivo.
- Antes de instalar el nuevo firmware, no recomendamos utilizar las aplicaciones de mensajería, billeteras de criptomonedas y clientes de redes sociales que estén instalados en el dispositivo.
- Para detectar a tiempo la presencia de tales amenazas en el dispositivo, utilice una solución de seguridad.
Indicadores de compromiso
Marcos de sistema infectados
f468a29f836d2bba7a2b1a638c5bebf0
72cbbc58776ddc44abaa557325440bfb
fb937b1b15fd56c9d8e5bb6b90e0e24a
Bibliotecas nativas infectadas
89c3475be8dba92f4ee7de0d981603c1
Módulos
Aplicación objetivo | MD5 |
Telegram | fce117a9d7c8c73e5f56bda7437bdb28 |
b8a745bdc0e083ffc88a524c7f465140 | |
8f0e5f86046faed1d06bca7d3e48c0b8 | |
dc731e55a552caed84d04627e96906d5 | |
d5bc1298e436424086cb52508fb104b1 | |
3f887477091e67c6aaca15bce622f485 | |
Navegadores | 98ece45e75f93c5089411972f9655b97 |
TikTok | 993eb2f8bf8b5c01b30e3044c3bc10a3 |
b187551675a234c3584db4aab2cc83a9 | |
554f0de0bddf30589482315fe336ea72 | |
11aa55cd3556afa80412e512acfbd01d | |
Skype | b87706f7fcb21f3a4dfdd2865b2fa733 |
LINE | 1d582e2517905b853ec9ebfe77759d15 |
Google Play | 2e98c16d949022e42956aaa9af908187 |
04e485833e53aceb259198d1fcba7eaf | |
Aplicación para SMS | 195e0f334beb34c471352179d422c42f |
2ac5414f627f8df2e902fc34a73faf44 | |
Servicios de Google Play | 3dc21967e6fab9518275960933c90d04 |
Aplicación para llamadas | a4f16015204db28f5654bb64775d75ad |
Servidores C2 de módulos
lnwxfq[.]qz94[.]com
8.218.194[.]192
g.sxim[.]me
68u91[.]66foh90o[.]com
jmll4[.]66foh90o[.]com
w0g25[.]66foh90o[.]com
tqq6g[.]66foh90o[.]com
zqsvl[.]uhabq9[.]com
hm1es[.]uhabq9[.]com
0r23b[.]uhabq9[.]com
vg1ne[.]uhabq9[.]com
is5jg[.]3zweuj[.]com
qrchq[.]vrhoeas[.]com
xjl5a[.]unkdj[.]xyz
lvqtcqd[.]pngkcal[.]com
xc06a[.]0pk05[.]com
120.79.89[.]98
xcbm4[.]0pk05[.]com
lptkw[.]s4xx6[.]com
ad1x7[.]mea5ms[.]com
v58pq[.]mpvflv[.]com
bincdi[.]birxpk[.]com
773i8h[.]k6zix6[.]com
ya27fw[.]k6zix6[.]com
Servidores CDN para la entrega de módulos maliciosos.
mp2y3[.]sm20j[.]xyz
ompe2[.]7u6h8[.]xyz
app-file.b-cdn[.]net
Configuraciones en GitHub
hxxps://raw.githubusercontent[.]com/adrdotocet/ott/main/api.json
hxxps://raw.githubusercontent[.]com/adrdotocet2/ott/main/api.json
hxxps://raw.githubusercontent[.]com/adrdotocet3/ott/main/api.json
Propiedades del sistema de Triada
os.config.ppgl.ext.hws.cd
os.config.ppgl.btcore.devicekey
os.config.ppgl.version
os.config.opp.build.model
os.config.opp.build.status
os.config.ppgl.status
os.config.ppgl.status.rom
os.config.ppgl.build.vresion
os.config.hk.status
os.config.ppgl.cd
os.config.ppgl.dir
os.config.ppgl.dexok
os.config.ppgl.btcore.sericode
os.config.verify.status
os.config.alice.build.channel
os.config.alice.build.time
os.config.alice.service.status
os.android.version.alice.sure
Nuevo episodio: Triada contraataca