Malwares e a detecção de máquinas virtuais

Com o objetivo de dificultar análise dinâmica e depuração, diversos malwares utilizam técnicas para tentar evitar sua execução em sandbox. Essas técnicas são comumente chamadas de sandbox evasion.

As técnicas de evasão de sandbox podem ser classificadas de acordo com as seguintes categorias:

  • Interação humana. Esta categoria engloba técnicas que esperam ações específicas a serem realizadas pelo usuário. Essas ações podem ser qualquer coisa que sirva como teste de Turing. Por exemplo: movimentação e/ou clique do mouse, rolagem de página.

  • Configuração. nesta categoria estão os códigos que se aproveitam das limitações inerentes às sandboxes, como por exemplo, o tempo de execução. Um cenário contundente compreende fazer o código dormir por um tempo suficientemente longo para inviabilizar a sua execução em uma sandbox.

  • Ambiente. Nesta categoria, estão as técnicas que buscam por indícios de ambientes virtuais amplamente utilizados, como VirtualBox e VMWare. Esses indícios podem ser drivers de hardware específicos de VMs, chaves no registro, arquivos, dll, processos e etc.

No projeto open souce pafish, tem alguns bons exemplos da implementação de técnicas simples anti debugger/VM/sandbox. No trecho de código abaixo, extraído desse projeto, podemos observar uma técnica que tenta identificar o ambiente virtual a partir da existência de determinada sub-chave no registro.

Essa é uma técnica simples — e talvez por isso — seja bastante observada em alguns malwares. Assim como nesse exemplo, normalmente o que se observa durante as análises, é o acesso direto a sub-chave desejada utilizando a função RegOpenKeyEx da API do Windows®.

O monitoramento dessas chamadas à API do sistema é um ponto essencial no processo de análise dinâmica de malwares e normalmente é feito em sistemas de análise automatizadas, através de hooks. No Cuckoo Sandbox esse hook é feito através da injeção da DLL cuckoomon, que por sua vez, é responsável por interceptar e registrar as chamadas à API do sistema. Qualquer sistema de análise automática que se preze, deve realizar esse monitoramento e tentar detectar padrões de técnicas já conhecidas.

Certo dia me deparo com um malware que utilizava uma variação dessa técnica. Ele procurava por entradas no registro relacionadas com softwares de virtualização (VirtualBox e VMWare), entretanto ele utilizava a função RegOpenKeyEx apenas para abrir a chave "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", que contém a lista dos softwares disponíveis para desinstalação. E a partir dessa lista, utilizava a função RegEnumKeyEx para procurar por indícios de virtualização, como a existência de qualquer sub-chave com a palavra "virtualbox".

Através desta abordagem, esse artefato poderia detectar se estava sendo executado em uma máquina virtual e ainda passar despercebido a olhos desatentos. Como já dito anteriormente o mais comum para essa técnica é o acesso direto às sub-chaves que denunciem a instalação da máquina virtual, utilizando a função RegOpenKeyEx.

Para fins didáticos implementei essa técnica no pafish, o código fonte pode ser observado aqui.

Ainda como fruto dessa análise foi possível produzir um patch para o cuckoomon, com o objetivo de evitar detecção a partir desta técnica.

 
--- cuckoomon-orig/hook_reg.c	2014-06-11 20:17:15.000000000 -0300
+++ cuckoomon/hook_reg.c	2015-02-02 15:40:52.000000000 -0300
@@ -160,8 +160,25 @@
     __inout_opt  LPDWORD lpcClass,
     __out_opt    PFILETIME lpftLastWriteTime
 ) {
-    LONG ret = Old_RegEnumKeyExA(hKey, dwIndex, lpName, lpcName, lpReserved,
+    LONG ret;
+    char *blacklist[] = {"VirtualBox","vbox", "virtualbox","VBOX","oracle","VMware",NULL};
+
+    ret = Old_RegEnumKeyExA(hKey, dwIndex, lpName, lpcName, lpReserved,
         lpClass, lpcClass, lpftLastWriteTime);
+    
+    if (ret != ERROR_SUCCESS) {
+        return ret;
+    }
+   
+    for (int i=0; blacklist[i] ; i++){
+        
+        if (strstr(lpName, blacklist[i]) != NULL) {
+            ret = Old_RegEnumKeyExA(hKey, ++dwIndex, lpName, lpcName, lpReserved,lpClass, lpcClass, lpftLastWriteTime); 
+        }
+
+    }
+
     LOQ("plss", "Handle", hKey, "Index", dwIndex, "Name", lpName,
         "Class", lpClass);
     return ret;

Dentre os argumentos passados para a função RegEnumKeyExA vamos olhar com atenção os seguintes:

  • hKey - handle para a chave do registro aberta.
  • dwIndex - O índice da sub-chave que será recuperada.
  • lpName - Um ponteiro para um buffer que recebe o nome da sub-chave recuperada.

Esse patch consiste numa blacklist com alguns nomes que podem denunciar a existência de um ambiente virtual. Desta forma, para cada chamada à função RegEnumKeyExA é realizada uma checagem a fim de verificar se a sub-chave que está recuperada (lpName) está na nossa lista. Em caso positivo, a função RegEnumKeyExA original é chamada novamente, desta vez passando o índice subsequente (++dwIndex). Ou seja, as chamadas à função RegEnumKeyExA irão "pular" as sub-chaves que contiverem strings que também estejam na nossa blacklist.

Aplicar patches para "hardenizar" o cuckoomon, e consequentemente evitar a detecção de ambientes virtuais, é uma prática quase que diária para quem usa essa ferramenta como parte do processo de análise dinâmica, já que novas técnica de detecção de ambiente virtual — e variações das já existentes — surgem quase que diariamente. Ou seja, isso foi apenas mais do mesmo, a corrida entre a detecção e o anonimato.

Comentários
Aceita-se formatação à la TWiki. HTML e scripts são filtrados. Máximo 15KiB.

 
Enviando... por favor aguarde...
Comentário enviado com suceso -- obrigado.
Ele aparecerá quando os moderadores o aprovarem.
Houve uma falha no envio do formulário!
Deixei uma nota para os admins verificarem o problema.
Perdoe-nos o transtorno. Por favor tente novamente mais tarde.
Marcelo Pessoa | 2015-03-08 15:45:07 | permalink | topo

Beleza de post, Heyder!

Você fez o pull request desses códigos (do pafish e do cuckoomon) para os repositórios originais, ou tá tudo num fork teu mesmo??

Quando é que vem um post sobre Pin(Tool)?