O BlueSky Ransomware é um malware moderno que usa técnicas avançadas para evitar as defesas de segurança. Ele se destina principalmente a hosts Windows e utiliza o modelo multithreading do Windows para criptografia rápida. Ele surgiu pela primeira vez no final de junho de 2022 e foi observado que se espalhou por meio de e-mails de phishing, sites de phishing e downloads trojanizados.
Essa análise aprofundada do BlueSky Ransomware abrange os seguintes aspectos técnicos:
Procedimento para escalonamento de privilégios
Persistência
Mecanismo de criptografia
Técnicas de evasão
Fase inicial
Os módulos necessários para o ransomware são carregados dinamicamente e os endereços de funções interessantes são armazenados em uma matriz para uso posterior.
Os endereços da seguinte lista de APIs foram resolvidos:
APIs armazenadasntdll.rtlallocateheapkernel32.createfile wkernel32.setfilepointerkernel32.closehandlekernel32.lstcmpwadvapi32.cryptgenrandomntdll.freeheapkernel32.findclosekernel32.get fileSizeExkernel32.setfileAttributeswkernel32.openprocessshl wapi.path combine wkernel32.encontre o primeiro arquivo exwkernel32.leia o arquivo kernel32.getqueuedcompletionstatuskernel32.mova o arquivo com o kernel progressivo 32.terminateprocesshlwapi.path remova a extensão wkernel32.findnextfile wkernel32.write file kernel32.postqueuedcompletionstatuskernel32.lstrCATWKernel32. Espere por um único objeto
Depois de carregar as bibliotecas necessárias, o ransomware continua executando as seguintes tarefas:
Verifica se o processo em execução é de 32 bits via Kernel32. É o processo WOW64
Descriptografa cadeias de caracteres
Ajuste o privilégio do processo para SE_DEBUG através da Ntdll.rtlAdjust Privilege
Recupera o seguinte:
GUID da máquina de SOFTWARE\\ Microsoft\\ Cryptography
ID digital do produto e Data de instalação do SOFTWARE\\ Microsoft\\ Windows NT\\ CurrentVersion
Oculta o thread principal do depurador chamando Ntdll.zw Definir tópico de informações passando ThreadHideFromDebugger (0x11) como ThreadInformationClass
O ransomware atualiza o status como “Concluído” após a fase inicial e os dados do usuário são bloqueados.
Bloqueio dos dados do usuário após a fase inicial
Geração Mutex
O ransomware cria um mutex global ao chamar Kernel 32. Crie o MuteXA API.
Criação de mutex
Decodificação de strings
O ransomware decodifica todas as strings em tempo de execução. Abaixo estão listadas várias extensões evitadas durante o bloqueio, extensões de dados do usuário bloqueadas e nomes de diretórios para enumeração de arquivos.
Extensões na lista negra
O ransomware impede o bloqueio dos arquivos com as seguintes extensões na lista negra.
O ransomware usa esses nomes de diretório para fins de enumeração de arquivos.
Nomes de diretório“$recycle.bin” “boot” “windows” “perflogs” “appdata” “arquivos de programa” “windows.old” “todos os usuários”” usuários” “programdata” “$windows. ~ws” “informações de volume do sistema” “$windows. ~bt” “arquivos de programa (x86)”
Pré-criptografia
Algoritmo criptográfico
O contexto criptográfico é um tipo de dados autenticados adicionais que consiste em pares arbitrários não secretos de nome e valor. Durante a fase de inicialização, o ransomware adquire o contexto criptográfico do AdvAPI32.CryptAdquire Context API. O provedor criptográfico usado pelo malware é o “Microsoft Enhanced Cryptographic Provider v1.0” e o esquema de criptografia selecionado é o RSA.
Adquirindo contexto criptográfico
Dados de recuperação
Antes da execução da função de criptografia, o ransomware grava os dados necessários para a recuperação dos arquivos bloqueados no registro. Os seguintes dados são gravados:
BOLHA DE RECUPERAÇÃO
Chave pública X25519
Gravação de dados necessários para a recuperação de arquivos bloqueados
Visualização atualizada do registro
Nota de resgate
Se a gravação dos dados de descriptografia falhar, o ransomware não executará a rotina responsável pela criptografia dos dados do usuário. Após uma operação de registro bem-sucedida, o ransomware gera uma nota de resgate como tarefa inicial na função que executa o bloqueio.
Geração de notas de resgate
As etapas a seguir são executadas:
Um ID de recuperação aleatório e exclusivo para a vítima é gerado e armazenado no buffer de pilha.
O ransomware Bluesky cria uma nota de resgate nos formatos “.txt” e “.html”.
Dois blocos de 1000 (4096) bytes de memória de pilha são alocados para armazenar as notas finais de resgate.
Dois buffers temporários (txt_ransom_note_buffer e html_ransom_note_buffer) são alocados para armazenar notas codificadas recuperadas do binário.
Um especificador de string de formato de local é usado como espaço reservado para a ID de recuperação gerada na etapa inicial.
A função”Sub_2866E0” é responsável por formatar a nota substituindo “%s” pelo valor da ID de recuperação, que tem 242 caracteres.
O resultado é então armazenado na memória, para ser usado posteriormente pela função responsável por gravar a nota no sistema de arquivos.
Nota decodificada no buffer
Término do processo
Depois de criar a nota de resgate, o ransomware enumera os processos em execução no sistema comprometido. O Informações do sistema de consulta Ntdll.zw A API é chamada passando a classe SystemInformation (0x5) para obter a lista de processos do sistema. A lista é usada pelo ransomware para eliminar seletivamente os processos.
Enumeração dos processos em execução no sistema comprometido
Tarefa de encerramento do
As etapas a seguir são executadas para encerrar os processos em execução:
O ransomware começa a analisar a estrutura do processo para recuperar o nome da imagem e usa shlwapi.pathRemove Extensions W API para remover a extensão (.exe) do nome.
Depois que o nome do processo sem extensão é recuperado, o ransomware chama Sub_2869B0 para calcular o tamanho do nome do processo.
Em seguida, uma chamada é feita para Sub_2868C0 para converter os caracteres em minúsculas para uniformidade.
Finalmente, uma codificação de bytes personalizada é usada para converter a string em um valor hexadecimal.
O valor hexadecimal gerado é verificado em relação a uma matriz de valores codificados dos processos a serem encerrados.
Nomes de processos que o agente da ameaça deseja encerrar
Na fase inicial, o identificador para “Shell_Traywnd”, que é obtido usando Usuário 32. Encontre o Windows A, é passado para o Obtenha o ID do processo de thread do Windows API para obter o ID do processo de explorer.exe. (explorer.exe é responsável por criar “Shell_Traywnd”). O ID do processo é armazenado na memória.
Se houver uma correspondência, o ID do processo de destino, obtido na fase inicial, é passado para Sub_2910F0.
O malware verifica se o ID do processo é do seu próprio processo ou do explorer.exe. Após a verificação, um identificador para processar é recuperado via Kernel 3.2. Processo aberto API.
Somente processos “não críticos” são encerrados para evitar a verificação de bugs (tela azul da morte). Se o identificador de processo passado não for crítico, ele será encerrado via Kernel3.2. Encerrar processo.
A função sub_2910F0
O ransomware chama Processo de informações de consulta ntdll.nt passando processBreakOnTermination (0x1d) como a InformationClass para identificar processos críticos.
Chamada para a classe NtQueryInformationProcess
Lixeira vazia
Após o término do processo, o ransomware esvazia a lixeira ligando Shell32. Esvazie a lixeira.
Esvaziando a lixeira
Criptografia
Modelo de segmentação: portas de conclusão de E/S do Windows em poucas palavras
O ransomware Bluesky executa a criptografia utilizando portas de conclusão de E/S. As portas de conclusão de E/S fornecem um modelo de segmentação eficiente para processar várias solicitações de entrada-saída (E/S) assíncronas em um sistema multiprocessador.
Modelo de rosqueamento usando as portas IO
O thread principal cria a porta de conclusão de E/S via Criar porta de conclusão de IO. A porta criada pode ser associada a vários identificadores de arquivo. Quando a operação de E/S assíncrona em um dos identificadores de arquivos é concluída, um pacote de conclusão de E/S é enfileirado na ordem FIFO na porta associada.
O thread de trabalho executa uma chamada para Status de conclusão pós-fila para enfileirar os dados associados. No caso do ransomware, os dados serão o caminho absoluto dos arquivos do usuário que aguardam na fila para serem criptografados.
Outro thread de trabalho executa Obter status de conclusão na fila para desenfileirar o conteúdo da fila principal. Normalmente, no ransomware, esse tópico é responsável por realizar a criptografia e a geração de notas de resgate.
A seção a seguir contém uma descrição detalhada de cada uma das funções mencionadas acima.
Criar porta de conclusão de IO
A chamada para createIOCompletionPort envolve as seguintes etapas:
O thread principal recupera a contagem de processadores da estrutura PEB (Process Environment Block).
Uma chamada para Criar porta de conclusão de IO é feito passando a contagem do processador como valor do parâmetro numberOfConcurrentThreads.
Vários segmentos de trabalho são criados chamando Kernel32. Criar tópico.
Para cada thread, uma máscara de afinidade (uma máscara de bits indicando em qual processador um thread deve ser executado) é definida chamando Kernel32.setThreadAffinity Mask.
O thread principal executa a enumeração e as chamadas básicas da unidade Status de conclusão pós-fila.
Chamando CreatioCompletionPort
Recuperando a contagem de processadores do PEB
Função PostQueuedCompletionStatus
As seguintes APIs são usadas para enumeração de drives no sistema:
Kernel32.getLogicalDriveStrings SW
Kernel 32. Obtenha o tipo de unidade W
A enumeração adicional de arquivos é realizada criando um thread de trabalho para Status de conclusão pós-fila.
Criação de um thread de trabalho para PostQueuedCompletionStatus
O tópico principal chama mpr.wnet para abrir o Enumw para enumerar recursos de rede e criar um thread de trabalho igual ao anterior que executa a chamada postQueuedCompletionStatus.
Chamando a função mpr.NetOpenEnumw
Tópico de trabalho: PostQueuedCompletionStatus
O thread de trabalho que executa o PostQueuedCompletionStatus
O tópico recém-criado para PostQueuedCompletionStatus leva ao seguinte:
Os arquivos são enumerados via Kernel32. Encontre o primeiro arquivo EXW e Kernel32. Encontre o próximo arquivo.
Se for um diretório, a função de thread é chamada recursivamente para realizar a enumeração do arquivo.
Se for um arquivo de usuário, o caminho absoluto será enfileirado para a fila de conclusão via Status de conclusão pós-fila ligar.
Esse thread de trabalho é responsável por reunir os arquivos para criptografia.
Tópico de trabalho: getQueuedCompletionStatus
Esse thread de trabalho é responsável por fazer o bloqueio real dos arquivos do usuário. O ransomware esconde esse tópico do depurador via Ntdll.zw Definir tópico de informações passando ThreadHideFromDebugger como a classe ThreadInformation.
Chamando a função Ntdll.ZWSetInformationThread
O thread decodifica a extensão de arquivo “.bluesky” e prossegue com a criptografia. O Kernel 32. Obtenha o status de conclusão em fila é chamado em um loop infinito para recuperar o caminho absoluto dos dados do usuário.
Extensão de arquivo de decodificação “.bluesky”
O sub_288780 A função é responsável por criptografar os dados. O thread verifica se o item desenfileirado é um diretório ou um arquivo.
Se for um arquivo, ele criptografará os dados usando as seguintes APIs:
Kernel32.Criar arquivo W
Kernel32.defina o ponteiro do arquivo
Kernel32. Leia o arquivo
Kernel32. Escrever arquivo
Se o item for um diretório, então Sub_28EDA0 é executado para despejar a nota de resgate. As cadeias de caracteres do nome do arquivo são decodificadas dinamicamente.
Cadeias de caracteres de nome de arquivo sendo decodificadas
Execução de Sub_28EDA0
O conteúdo da nota gerado pelo ransomware é gravado no disco chamando:
Kernel32.Criar arquivo W
Kernel32. Escrever arquivo
Nota de resgate sendo escrita no disco
Pós-criptografia
Depois que os dados do usuário são bloqueados com sucesso, o ransomware executa as seguintes operações: