CIÊNCIA & TECNOLOGIA
Dicas para análise de códigos maliciosos desenvolvidos em JavaScript
Separamos algumas dicas que podem ser bastante úteis na hora de analisar códigos maliciosos desenvolvidos na linguagem JavaScript
O JavaScript, também conhecido como “JS”, é uma linguagem de programação interpretada, orientada a objetos do tipo scripting (sequência de comandos). O JS é bastante usado legitimamente no desenvolvimento de várias aplicativos, como apps para web e celulares, jogos, entre outros. Como esta linguagem pode ser interpretada por diferentes navegadores de internet, os atacantes se aproveitam disso para realizar ações criminosas; por exemplo, atacar sites legítimos com o objetivo de injetar seu próprio código malicioso a fim de que ele seja executado pelo navegador da vítima no momento do acesso ao site comprometido.
Por outro lado, esta linguagem também pode ser usada para a criação de extensões maliciosas direcionadas a diversos navegadores de internet. Estas extensões podem ser capazes de realizar várias ações. Por exemplo:
- Roubar informações sensíveis, como dados de login;
- Detectar e substituir uma carteira de criptomoedas por uma controlada por atacantes.
Após esta breve introdução sobre a linguagem JavaScript e seus possíveis usos por cibercriminosos, separamos algumas dicas que podem ser bastante úteis na hora de analisar um código malicioso desenvolvido nesta linguagem.
Também vale a pena lembrar que ao realizar a análise de um código malicioso, o ideal é que este processo seja totalmente feito dentro de uma máquina virtual ou em um ambiente isolado para evitar uma possível infecção no computador físico.
Dicas
Declaração de funções
Ao analisar um código malicioso, seja em JavaScript ou em outra linguagem, é sempre importante conhecer os conceitos básicos de sua sintaxe. Estes conceitos podem nos ajudar durante a fase de análise, como veremos a seguir.
No exemplo a seguir, vamos ver uma das formas mais básicas de criar uma função em JavaScript:
Mas essa não é a única maneira, o JavaScript também permite a criação de funções que serão invocadas imediatamente, ou seja, assim que o script for executado. Um exemplo disso pode ser visto abaixo:
Embora as duas funções apresentadas acima façam o mesmo para fins práticos, é importante detectar essas diferenças dentro de um código malicioso para determinar quais funções devem ser analisadas primeiro.
No entanto, pode ser que algumas funções que são executadas automaticamente façam parte de uma técnica de ofuscação implementada no código malicioso, mas que na verdade não executam uma ação maliciosa. Assim, embora seja importante analisar estas funções, diferenciar o conteúdo e a prioridade de execução de cada uma delas pode nos ajudar a determinar a que devemos ter mais atenção ao analisar um código malicioso.
Detectar o ponto de entrada
Ser capaz de determinar o ponto de entrada ou o ponto onde o código malicioso começa a ser executado é muito importante, pois nos permite compreender o início da atividade maliciosa do código. Isto é vantajoso em linguagens de script, como o JavaScript, porque elas tendem a ter funções declaradas em diferentes seções do script e pode acontecer que nem todas essas funções sejam invocadas ou executadas.
Portanto, detectar e iniciar a análise no ponto de entrada nos dá a vantagem de nos concentrarmos no que é realmente importante no código malicioso e, em muitos casos, nos permite descartar código “lixo” ou código que não realiza nenhuma atividade maliciosa e é frequentemente usado como uma camada de ofuscação para confundir o analista.
A imagem a seguir mostra um exemplo de um ponto de entrada de um código malicioso que explicaremos a seguir.
Através da imagem acima podemos ver diferentes coisas, tais como declarações de funções, funções auto invocadas, ou funções que são atribuídas em variáveis e depois executadas. Mas também vemos o uso da API do navegador Google Chrome, chrome.runtine. Esta API é utilizada (neste caso) para a criação de um evento Listener que estará esperando por uma mensagem que, uma vez recebida, executa a função clear que está dentro deste código malicioso. Portanto, se levarmos em conta as palavras-chave que não podem ser ofuscadas e virmos que este evento está chamando uma função pertencente a este código malicioso, podemos dizer com confiança que encontramos o ponto de entrada deste código malicioso.
Por fim, podemos dizer que aquelas funções que não são chamadas ou invocadas pelo evento Listener, nem pela função clear, podem ser ignoradas, pois é muito provável que façam parte de diferentes técnicas de ofuscação que são irrelevantes ao analisar o comportamento principal deste código malicioso.
Ofuscação de código
A ofuscação de código é um processo pelo qual várias técnicas ou métodos são usados para transformar o código existente de uma forma que torna muito difícil a compreensão ou análise.
Nas seguintes capturas de tela podemos ver, como exemplo, um código sem ofuscação e depois o mesmo código com alguma camada de ofuscação no topo.
Dependendo do grau de sofisticação dos cibercriminosos, eles podem optar por criar seus próprios ofuscadores ou, em muitos casos, usar ofuscadores encontrados em repositórios públicos na internet. No segundo caso apresentado, é importante mencionar que estes ofuscadores foram criados com a ideia de ajudar a proteger a propriedade intelectual dos desenvolvedores de software legítimo para que não fossem utilizados para atividades maliciosas.
Portanto, ao se deparar com um código malicioso que tenha uma ou mais capacidades de ofuscação, o ideal é, antes de qualquer coisa, procurar por desofuscadores em repositórios públicos para ver se seu código malicioso emprega alguma técnica de ofuscação conhecida. Desta forma, evitamos gastar tempo desofuscando manualmente o código.
Opções de desofuscadores para código JavaScript:
• javascript-deobfuscator
• de4js
• Javascript-deobfuscator
• deobfuscator
• JStillery
• jsdetox
• beautifier.io
Execução controlada pelo navegador
Como os navegadores podem interpretar e executar código JavaScript, eles podem ser úteis para realizar uma execução parcial ou total de um código malicioso desenvolvido nesta linguagem. Desta forma, pode ocorrer uma combinação de análise estática e dinâmica em um código malicioso, a fim de se obter uma melhor compreensão sobre o mesmo.
Para executar um código JavaScript em um navegador, como o Mozilla Firefox, devemos primeiro ativar as ferramentas de desenvolvimento usando o botão F12 (isso pode variar dependendo do navegador usado), depois ir para a seção Console e inserir o código que queremos executar.
Na seguinte captura de tela, podemos ver um exemplo de como executar um código JavaScript usando o navegador Mozilla Firefox.
Conclusão
Estes são alguns dos métodos ou dicas que podem nos ajudar na hora de realizar a análise de um código malicioso desenvolvido em JavaScript. É importante notar que, dependendo do tipo de código malicioso que será analisado, algumas dessas técnicas podem não ser aplicáveis.