- O autor conseguiu recuperar os dados de uma empresa infectada pelo ransomware Akira sem pagar resgate
- O código-fonte usado no processo de recuperação está disponível no GitHub
- O ransomware Akira possui várias variantes e esta variante está ativa desde o fim de 2023
- Nas versões anteriores (antes de meados de 2023), havia um bug que permitiu à Avast desenvolver um descriptografador, mas, após isso ser divulgado, os atacantes atualizaram a criptografia
- Os hashes das amostras do ransomware podem ser verificados no GitHub
Resumo de como recuperar arquivos do ransomware Akira (variante Linux/ESXI 2024)
Abordagem da solução
Análise inicial
- O ransomware usa o horário atual em nanossegundos como seed
- Como o horário de modificação de arquivos no Linux tem resolução de nanossegundos, foi identificada a possibilidade de recuperar a seed
- Foi tentada uma abordagem de força bruta com base no timestamp dos arquivos modificados
Processo de criptografia complexo
- O ransomware usa 4 valores de seed (tempo em nanossegundos)
- A geração de chave aplica o hash SHA-256 1500 vezes em sequência
- O sistema de arquivos VMware VMFS armazena o horário de modificação apenas com resolução de segundos
- Por causa da criptografia multithread, é difícil reconstruir o timing exato
Engenharia reversa
- O código foi escrito em C++, o que dificultou a análise, mas ele não era ofuscado
- Pelas mensagens de erro, foi confirmado o uso da biblioteca Nettle
- O gerador aleatório é baseado no algoritmo Yarrow256 e usa o seguinte código
void generate_random(char *buffer, int size)
{
uint64_t t = get_current_time_nanosecond();
char seed[32];
snprintf(seed, sizeof(seed), "%lld", t);
struct yarrow256_ctx ctx;
yarrow256_init(&ctx, 0, NULL);
yarrow256_seed(&ctx, strlen(seed), seed);
yarrow256_random(&ctx, size, buffer);
}
- Ao gerar a chave, ocorrem 4 chamadas de
generate_random()
- chacha8_key (32 bytes)
- chacha8_nonce (16 bytes)
- kcipher2_key (16 bytes) × 2
Avaliação da viabilidade de força bruta
Estratégia principal
- Gerar dois timestamps (t3, t4), convertê-los em seeds e então gerar números aleatórios
- Usar esses números aleatórios como chave e IV do KCipher2, criptografar e comparar o resultado com o arquivo criptografado
Análise de desempenho
- Converter 100 milhões de timestamps leva 3 horas (na CPU)
- Com GPU, a velocidade de conversão cai para menos de 6 minutos
- Para um intervalo de 1 segundo, há cerca de 500 trilhões de pares possíveis
- Após otimizações para GPU, uma RTX 3090 consegue processar 1,5 bilhão de operações de criptografia por segundo
Tipos de arquivo VMWare e estratégia de recuperação
FLAT-VMDK
- Os primeiros 8 bytes do VMDK podem ser recuperados a partir do bootloader
- É necessário verificar as informações do sistema operacional no arquivo VMX e instalar o mesmo sistema operacional
SESPARSE
- O padrão do cabeçalho do arquivo foi identificado no código-fonte do QEMU
- O cabeçalho começa com
0x00000000cafebabe
Outros arquivos
- É possível verificar timestamps iniciais em arquivos NVRAM, arquivos VMX, arquivos de log etc.
Recuperação de timestamps
Logs do ESXi
- Os logs do ESXi registram o tempo de execução com precisão de milissegundos
- Se não houver logs em milissegundos, é possível estimar a partir de horários em segundos
Horário de modificação do sistema de arquivos
- No ESXi, como a resolução é de segundos, é difícil estimar o horário exato
Criptografia multithread
- A criptografia dos arquivos é processada em paralelo de acordo com o número de núcleos de CPU
- O horário de modificação do arquivo tende a ficar próximo do momento em que a criptografia foi concluída
Implementação da ferramenta de força bruta
Algoritmo KCipher2
- Foi usada uma versão modificada do KCipher2, não a versão padrão (incluindo tratamento de endian)
- Foram feitas otimizações para GPU com CUDA
Melhorias de desempenho
- Uso de memória compartilhada para melhorar o desempenho
- Remoção de cópia de memória para aumentar a velocidade
- Implementação de processamento paralelo de arquivos → cerca de 1,5 bilhão por segundo
RTX 3090 vs RTX 4090
- A RTX 4090 é cerca de 2,3 vezes mais rápida → leva 7 dias
- RTX 3090 → cerca de 16 dias
Etapas da recuperação
1. Extração de timestamps
- Verificar o horário de modificação com o comando
stat
- Extrair o horário de início da execução a partir dos logs do ESXi
2. Extração dos dados criptografados
- Extrair blocos criptografados de VMDK, SESPARSE etc.
3. Medição da velocidade do servidor
- Usar a ferramenta
timing-patch do GitHub
4. Divisão do trabalho
- Criar e dividir o arquivo de configuração
- Configurar para permitir execução paralela na GPU
5. Aluguel de GPU e execução
- Runpod → custo de cerca de US$ 116 por 7 dias
- Vast.ai → mais barato, mas a velocidade pode variar conforme o estado da máquina
6. Execução da força bruta do KCipher2
./akira-bruteforce run2 config.json
7. Execução da força bruta do Chacha8
- Necessária no caso de arquivos grandes
8. Execução da descriptografia
./decrypt filename.vmdk <t1> <t2> <t3> <t4>
Resultados de desempenho
- RTX 3090 → 1,5 bilhão de operações por segundo
- RTX 4090 → 3,5 bilhões de operações por segundo
- Com 16 RTX 4090 → recuperação possível em menos de 10 horas
Possibilidade de recuperação e limitações
- A probabilidade de sucesso na recuperação do ransomware é inferior a 0,1%
- A recuperação é possível quando certas condições específicas são atendidas
- O método de criptografia pode mudar dependendo da variante do ransomware
Conclusão
- Recuperar dados de ransomware é extremamente difícil, mas pode ser possível em condições específicas
- A força bruta baseada em GPU é a ferramenta central
- O autor publicou o código de recuperação como open source, mas não consegue oferecer suporte adicional
Observações adicionais
- Consulte o arquivo
README.md no GitHub
- O código foi escrito para a situação específica de um cliente → não é uma ferramenta genérica
- Gerar o arquivo de configuração, ajustar o timing etc. exige conhecimento de nível administrador de sistemas
1 comentários
Comentários no Hacker News
Alguém mencionou a "vida útil limitada" do ransomware. Por causa disso, apagou um comentário dizendo que isso não afetaria outras vítimas, mas publicou uma resposta sobre o assunto
Houve uma pergunta sobre por que usar timestamps
O texto foi agradável de ler e trouxe o nível certo de detalhes para satisfazer a curiosidade sobre o processo
Se os aplicativos fossem isolados em sandbox por padrão, o problema de ransomware seria menor
"Estimei no CPU do meu mini PC uma taxa de 100.000 timestamps por segundo calculados em bytes aleatórios (usando todos os núcleos)"
Fiquei curioso sobre por que os primeiros 65k são criptografados com KCipher2 e o restante com outra coisa. Parece estranho
"Espero que, depois de publicar isso, os atacantes mudem a criptografia de novo"
"Toda vez que escrevo sobre ransomware no meu blog indonésio, muita gente pede ajuda com ransomware"