Um grupo de pesquisadores de universidades americanas, australianas e israelenses propôs uma nova técnica de ataque por canal lateral para explorar vulnerabilidades da classe Spectre em navegadores baseados no motor Chromium. O ataque, que recebeu o codinome Spook.js, permite contornar o mecanismo de isolamento de sites através da execução de código JavaScript e ler o conteúdo de todo o espaço de endereço do processo atual, ou seja, acessar os dados de páginas abertas em outras abas, mas processadas em um único processo.
Como o Chrome executa sites diferentes em processos separados, a possibilidade de realizar ataques práticos é limitada a serviços que permitem que diferentes usuários hospedem suas páginas. O método permite que, a partir de uma página onde o atacante pode incorporar seu código JavaScript, sejam identificadas outras páginas abertas pelo usuário do mesmo site e extraídas informações confidenciais, como credenciais ou dados bancários inseridos automaticamente pela função de preenchimento de formulários do navegador. Como demonstração, foi mostrado como é possível atacar um blog alheio no serviço Tumblr, caso seu proprietário abra em outra aba o blog do criminoso hospedado no mesmo serviço.

Outra aplicação do método é o ataque a extensões de navegador, permitindo que, ao instalar uma extensão controlada pelos atacantes, dados de outras extensões sejam extraídos. Como exemplo, foi demonstrado que, ao instalar uma extensão maliciosa, é possível extrair informações confidenciais do gerenciador de senhas LastPass.

Pesquisadores publicaram um protótipo de exploit que funciona no Chrome 89 em sistemas com CPU Intel i7-6700K e i7-7600U. Na criação do exploit, foram utilizados protótipos de código JavaScript publicados anteriormente pela Google para realizar ataques da classe Spectre. Notou-se que os pesquisadores conseguiram desenvolver exploits funcionais para sistemas baseados em processadores Intel e Apple M1, que permitem a leitura da memória a uma taxa de 500 bytes por segundo e com precisão de 96%. Suspeita-se que o método também seja aplicável a processadores AMD, mas um exploit totalmente funcional não pôde ser elaborado.
O ataque é aplicável a qualquer navegador baseado no motor Chromium, incluindo Google Chrome, Microsoft Edge e Brave. Os pesquisadores também acreditam que o método pode ser adaptado para funcionar com o Firefox, mas como o motor do Firefox é bastante diferente do Chrome, o trabalho para criar um exploit semelhante foi deixado para o futuro.
Para se proteger contra ataques relacionados à execução especulativa de instruções por meio do navegador, o Chrome implementou a segmentação do espaço de endereço — a sandboxização permite que o JavaScript trabalhe apenas com ponteiros de 32 bits e isola a memória dos manipuladores em montes de 4 GB não sobrepostos. Para organizar o acesso a todo o espaço de endereço do processo e contornar a limitação de 32 bits, os pesquisadores usaram a técnica de Confusão de Tipo, que força o motor JavaScript a processar um objeto com um tipo incorreto, permitindo formar um ponteiro de 64 bits com base em uma combinação de dois valores de 32 bits.
A essência do ataque é que, ao processar um objeto malicioso especificamente formatado no motor JavaScript, são criadas condições que levam à execução especulativa de instruções que acessam um array. O objeto é ajustado de forma que os campos controlados pelos atacantes sejam alocados em uma área onde um ponteiro de 64 bits é utilizado. Como o tipo do objeto malicioso não corresponde ao tipo do array sendo processado, em condições normais, tais ações são bloqueadas no Chrome pelo mecanismo de desotimização de código usado para acessar arrays. Para contornar esse problema, o código para o ataque de Confusão de Tipo é extraído para um bloco condicional "if", que não é ativado em condições normais, mas é executado em modo especulativo, quando a previsão do processador sobre a ramificação subsequente está incorreta.
No final, o processador faz uma consulta especulativa ao ponteiro de 64 bits formado e reverte o estado após determinar uma previsão falha, mas os rastros de execução permanecem no cache geral e podem ser recuperados por meio de métodos que detectam o conteúdo do cache através de canais auxiliares, analisando a mudança no tempo de acesso a dados armazenados em cache e não armazenados. Para analisar o conteúdo do cache sob condições de imprecisão do timer disponível em JavaScript, é utilizado um método proposto pelo Google que engana a estratégia de eliminação de dados do cache Tree-PLRU aplicada nos processadores, permitindo, através do aumento do número de ciclos, uma diferença significativamente maior no tempo entre a presença e a ausência de um valor no cache.
Fonte: opennet.ru
