Descripciones de malware

Nuevo episodio: Triada contraataca

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:

Cadena de infección del troyano Triada

Cadena de infección del troyano Triada

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.

Dependencia maliciosa en boot-framework.oat

Dependencia maliciosa en boot-framework.oat

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.

Llamada a una función sospechosa

Llamada a una función sospechosa

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.

Lanzamiento de dos funciones maliciosas

Lanzamiento de dos funciones maliciosas

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.

Carga del módulo auxiliar

Carga del módulo auxiliar

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.

Carga de la puerta trasera

Carga de la puerta trasera

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.

Verificación del nombre del paquete

Verificación del nombre del paquete

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:

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.

Carga de la configuración

Carga de la configuración

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:

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.

Sustitución de elementos de texto e imágenes

Sustitución de elementos de texto e imágenes

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.

Sustitución del contenido del portapapeles

Sustitución del contenido del portapapeles

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.
El receptor malicioso

El receptor malicioso

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.
Intercepción de funciones para interactuar con dnsproxyd.

Intercepción de funciones para interactuar con dnsproxyd.

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.
Decodificación, carga y ejecución de la carga útil

Decodificación, carga y ejecución de la carga útil

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.

Algunas aplicaciones de binder.so

Algunas aplicaciones de binder.so

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.

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.

Triada descifra la carga útil

Triada descifra la carga útil

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.

El código de la tarea maliciosa

El código de la tarea maliciosa

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.

Deserialización de los datos de la cuenta de la víctima.

Deserialización de los datos de la cuenta de la víctima.

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.

Filtrado de mensajes basado en su contenido

Filtrado de mensajes basado en su contenido

Además, el malware intenta iniciar una conversación con un bot que, en el momento de la investigación, ya no existía.

Inicio de una conversación con un bot desconocido

Inicio de una conversación con un bot desconocido

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” .

El malware lee los archivos internos

El malware lee los archivos internos

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.

Fragmento de código para interactuar con el C2

Fragmento de código para interactuar con el C2

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:

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.

Lanzamiento de funcionalidades según el navegador

Lanzamiento de funcionalidades según el navegador

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.

Uso de un módulo auxiliar

Uso de un módulo auxiliar

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.

Llamada maliciosa en la clase proxy Instrumentation

Llamada maliciosa en la clase proxy Instrumentation

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.

Sustitución del enlace en una instancia de la clase Intent.

Sustitución del enlace en una instancia de la clase Intent.

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.

El troyano lee las credenciales de cliente de WhatsApp

El troyano lee las credenciales de cliente de WhatsApp

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.
Fragmento del procesador de comandos

Fragmento del procesador de comandos

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.

Obtención de un token de acceso

Obtención de un token de acceso

El módulo envía los datos recibidos al servidor de comando.

Recopilación y envío de los datos recibidos.

Recopilación y envío de los datos recibidos.

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.

Triada extrae un token del llavero (almacén de credenciales)

Triada extrae un token del llavero (almacén de credenciales)

Si el malware no logra obtener el token de esta manera, lo busca en las cookies de WebView.

Extracción del token a partir de las cookies

Extracción del token a partir de las cookies

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.

Robo de datos de una cuenta de TikTok

Robo de datos de una cuenta de TikTok

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.

Robo de credenciales de Facebook

Robo de credenciales de 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.

Verificación del contenido del mensaje

Verificación del contenido del mensaje

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.

Regla para interceptar SMS de WhatsApp

Regla para interceptar SMS de WhatsApp

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.

Método para reemplazar políticas de envío de SMS Premium.

Método para reemplazar políticas de envío de SMS Premium.

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.
Procesamiento de los datos obtenidos

Procesamiento de los datos obtenidos

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.

Ejecución de código arbitrario mediante un receptor malicioso.

Ejecución de código arbitrario mediante un receptor malicioso.

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.

Intent con el número de teléfono

Intent con el número de teléfono

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.

Clase proxy "Instrumentation"

Clase proxy “Instrumentation”

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.

Sustitución del contenido del portapapeles

Sustitución del contenido del portapapeles

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.

Robo de cookies

Robo de cookies

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.

Carga de módulos en versiones antiguas de Triada

Carga de módulos en versiones antiguas de Triada

Carga de módulos en mms-core.jar

Carga de módulos en mms-core.jar

Además, en el código de los módulos se encuentran regularmente líneas que comienzan con PPP.

Creación de una entrada de registro en la versión antigua de Triada.

Creación de una entrada de registro en la versión antigua de Triada.

Carga del módulo en binder.so en la nueva versión de Triada.

Carga del módulo en binder.so en la nueva versión de Triada.

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.

Queja de un usuario que compró un dispositivo falsificado

Queja de un usuario que compró un dispositivo falsificado

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
WhatsApp dc731e55a552caed84d04627e96906d5
d5bc1298e436424086cb52508fb104b1
Instagram 3f887477091e67c6aaca15bce622f485
Navegadores 98ece45e75f93c5089411972f9655b97
TikTok 993eb2f8bf8b5c01b30e3044c3bc10a3
Facebook 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

Su dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

Informes

BlindEagle vuela alto en LATAM

Kaspersky proporciona información sobre la actividad y los TTPs del APT BlindEagle. Grupo que apunta a organizaciones e individuos en Colombia, Ecuador, Chile, Panamá y otros países de América Latina.

MosaicRegressor: acechando en las sombras de UEFI

Encontramos una imagen de firmware de la UEFI infectada con un implante malicioso, es el objeto de esta investigación. Hasta donde sabemos, este es el segundo caso conocido en que se ha detectado un firmware malicioso de la UEFI usado por un actor de amenazas.

Suscríbete a nuestros correos electrónicos semanales

Las investigaciones más recientes en tu bandeja de entrada