Spook.js, uma história de ninar assustadora

Como o Spook.js, primeiro ataque prático por Spectre, funciona.

Em comparação, um ataque de phishing comum funciona assim: você clica em um link, acessa uma página maliciosa, insere alguns detalhes e um invasor os rouba. Já nesse novo golpe o que acontece é: você clica em um link e um invasor rouba seus dados. Isso mesmo, hoje estamos falando sobre páginas maliciosas que exploram um recurso fundamental da CPU para roubar dados sem exigir que a vítima insira nada. E a vulnerabilidade em questão é muito difícil, senão impossível, de consertar.

Em 2018, pesquisadores provaram que o cenário era teoricamente possível, revelando as duas primeiras variantes da vulnerabilidade Spectre. Três anos depois, em setembro de 2021, o mundo viu o primeiro ataque na vida real usando o Spectre v1. Conhecido como Spook.js, o conceito de ataque é complicado, mas vamos tentar simplificar.

Histórico do Spectre v1

Notícias dos dois primeiros ataques desta família – Spectre e Meltdown – surgiram em 2018. Os ataques exploraram o mecanismo de previsão de ramificações, que foi projetado para acelerar a execução de comandos, encontrado em todas as CPUs modernas.

Logotipo da vulnerabilidade Spectre

Logotipo da vulnerabilidade Spectre

 

Quando um usuário insere uma senha para fazer login em um site, se a senha estiver correta, um conjunto de instruções é executado. Caso contrário, outro conjunto é acionado. No entanto – e é aqui que a previsão de desvio entra em ação – antes de receber a resposta, a CPU começa a executar o conjunto de instruções que acha que provavelmente precisará.

Em nosso exemplo, se a senha foi inserida corretamente cem vezes antes, a CPU assumirá que desta vez não será diferente. Se adivinhar corretamente, o usuário obtém um aumento de desempenho. Caso contrário, a CPU descarta as instruções executadas especulativamente e executa o outro conjunto.

Em um ataque na vulnerabilidade Spectre, é feita uma tentativa de ler uma área de dados à qual o programa não tem acesso. No primeiro estágio do ataque, várias chamadas são feitas para áreas de dados de acesso aberto, por meio das quais o sistema de previsão de ramificação é “treinado” para executar também a operação de leitura proibida. Usando a previsão de ramificação, a CPU realiza a operação com antecedência porque é usada para o programa solicitar a leitura de dados que realmente tem permissão para ler. Mas uma verificação revela que o programa está proibido de acessar os dados, então os cálculos executados especulativamente são descartados. Até agora, tudo bem – mas os dados lidos pela CPU são armazenados por algum tempo no cache, a própria memória da CPU.

Em seguida, vem a parte mais interessante: sem nenhuma maneira de ler os dados confidenciais do cache da CPU diretamente, o processo malicioso implanta um ataque de canal lateral para roubá-lo. Isso envolve medir a velocidade de acesso a certas informações. Se for relativamente pequeno, isso significa que os dados estão localizados no cache. Se for grande, é carregado da RAM normal. Uma sequência definida de tentativas de leitura resulta em um vazamento das informações secretas.
O resultado é uma falha fundamental da CPU, cuja única correção é desabilitar completamente a previsão de ramificação, afetando seriamente o desempenho. Dito isso, os ataques Spectre têm muitas limitações:

● O invasor deve ser capaz de executar o código do programa no computador de destino ou dispositivo móvel;
● O ataque requer um programa de destino específico codificado de forma a criar as condições para um ataque bem-sucedido;
● Mesmo se o ataque for bem-sucedido, a extração de dados é extremamente lenta – dezenas ou centenas de bytes por segundo – e os erros de leitura estão longe de ser impossíveis;
• Em geral, roubar os dados secretos pretendidos, como senhas, chaves de criptografia e assim por diante, requer uma combinação de condições.

Spook.js – aplicação da vida real do Spectre v1

Podemos concluir que o Spectre não é tão perigoso. Afinal, se um invasor pode executar código em um computador de destino, seria muito mais simples explorar uma das muitas vulnerabilidades no sistema operacional ou programas instalados para escalar privilégios e roubar dados.

Isso é verdade, mas as páginas da Web modernas também contêm grandes quantidades de código de programa que são executados no computador do usuário, no navegador. É assim que os ataques Spook.js exploram a vulnerabilidade do Specter v1: uma página infectada é carregada, o navegador executa o código e o cibercriminoso rouba dados confidenciais.

Os autores do relatório demonstraram alguns ataques práticos. Primeiro, eles roubaram uma senha de usuário do Tumblr. Em segundo, dados do Lastpass. Terceiro, interceptaram uma imagem carregada pelo usuário de um armazenamento privado em um servidor do Google.

Um recurso do navegador Google Chrome tornou tudo possível. Desde o lançamento de informações sobre Spectre, os desenvolvedores do Chrome tomaram medidas para evitar ataques potenciais, forçando os sites a carregar de forma isolada. Como cada site cria seu próprio processo, o código malicioso em uma página não pode ser usado para roubar dados de outro recurso. Mas há uma exceção: várias páginas do mesmo site ou domínio são agrupadas em um processo de navegador comum. Se o código malicioso (escrito em JavaScript, daí o .js no nome do ataque) for executado em um deles, os dados em outras páginas podem ser roubados.

Ataque Spectre.js no Tumblr

Como um blog coletivo, o Tumblr pode hospedar código malicioso, pelo menos em teoria. Dessa forma, com uma página maliciosa aberta em uma guia, se um usuário tentar fazer login em sua conta no serviço em outra guia, o navegador salva e preenche automaticamente o nome de usuário e a senha – que o código malicioso pode então roubar.

Ao explorar a vulnerabilidade do Spectre, um ataque pode interagir tangencialmente com alguma outra guia do mesmo site e roubar dados por meios indiretos. Um ataque bem-sucedido usando essa abordagem quase não deixa rastros.

Ataque de Specter.js em LastPass

O ataque ao gerenciador de senhas LastPass foi diferente, pois o código para roubar dados usando o Specter v1 foi embutido em uma extensão maliciosa para o Google Chrome. A extensão LastPass também estava em execução no navegador. Em alguns casos, as extensões também são executadas em um processo de navegador comum, tornando possível o roubo de dados.

Ataque Specter.js no Google Cloud Storage

Outro exemplo usa ataques ao armazenamento em nuvem do Google: uma guia do navegador contém uma página maliciosa hospedada em sites.google.com; outra permite que os usuários façam upload de imagens para seu armazenamento privado no serviço G Suite. Nesse cenário, um invasor pode usar código malicioso para obter acesso às imagens.

Imagem original (à esquerda) e aquela roubada do armazenamento em nuvem do Google usando um ataque Spook.js.

Imagem original (à esquerda) e aquela roubada do armazenamento em nuvem do Google usando um ataque Spook.js.

Limitações do método

Os pesquisadores mostraram como o ataque pode ser realizado em diferentes CPUs, incluindo vários processadores modernos da Intel e até mesmo o novo Apple M1 baseado em ARM. Em todos os casos, o ataque foi realizado no Google Chrome. Em princípio, vários recursos exclusivos do navegador tornam o Spook.js possível. Outros navegadores baseados em Chromium, como o Microsoft Edge, também são vulneráveis a esse ataque.

No entanto, existem certas limitações. A primeira é a baixa velocidade de roubo de dados (400–600 bytes por segundo, dependendo da CPU), razão pela qual o arquivo de destino na última demonstração é muito pequeno. A segunda é o grande número de erros ao roubar dados do cache da CPU. Até 4% dos dados estão errados; daí os artefatos na cópia roubada da imagem.

O ataque não funciona em processadores AMD ou no Mozilla Firefox, cujo JavaScript funciona de forma diferente. Os pesquisadores não estão descartando a possibilidade de um ataque bem-sucedido aos chips AMD e ao navegador Firefox, mas verificar isso exigirá mais estudos.

Por fim, um ataque requer o upload de um código malicioso para uma página com o mesmo nome de domínio, como no caso de blogs ou hospedagem coletiva. Aplicar esse método, digamos, ao site de um banco provavelmente não funcionará.

Não há motivo para pânico

O estudo do Spook.js é importante porque os pesquisadores, pela primeira vez, conseguiram demonstrar um cenário bastante realista para a exploração de uma das vulnerabilidades do Spectre. No entanto, as chances de um ataque no mundo real são baixas. Primeiro, os desenvolvedores do Google Chrome, com base nessa pesquisa, reforçaram o mecanismo para isolar sites carregados uns dos outros. Em segundo lugar, os cibercriminosos têm muitas maneiras mais fáceis de roubar dados do usuário, do malware tradicional à engenharia social, e isso exige um conhecimento sério do funcionamento de baixo nível das CPUs atuais.

Como um trabalho científico, o Spook.js é definido para alterar o cenário do software por meio da introdução de novas recomendações para segurança de sites (por exemplo, os autores propõem mover as páginas de autorização para um nome de domínio separado). Estudos subsequentes podem encontrar maneiras de tornar os ataques um pouco mais fáceis, mas muito provavelmente eles levarão a mais rodadas de aprimoramentos de segurança. Mesmo que as vulnerabilidades do tipo Spectre possam ser exploradas em massa, os meios de proteção serão os mesmos de qualquer malware. Os fornecedores de segurança simplesmente adicionarão os novos tipos de ataques à lista daqueles a serem monitorados e bloqueados antes da execução.

Também é possível que um dia os pesquisadores encontrem um recurso de vulnerabilidades no Spectrque exige uma grande reformulação de todo o ecossistema de TI moderno. Isso, no entanto, permanece improvável. Não vamos esquecer que levou três anos para passar de uma vulnerabilidade teórica para o primeiro ataque prático (e mesmo assim, é um ataque com muitas limitações).

O Spectre também pode ser usado para ataques direcionados nos quais o benefício potencial dos dados roubados excede os custos da operação. Mesmo que esse cenário seja relevante para sua organização, você pode facilmente tornar os ataques mais difíceis usando diferentes navegadores para diferentes conteúdos. Por exemplo, não abra páginas e serviços web com informações confidenciais no mesmo navegador em que obtém seu entretenimento online. O ideal é lidar com dados sensíveis em um ambiente isolado, em uma máquina virtual ou simplesmente em um dispositivo separado.

Dicas