Ataques Spectre: explorando a execução especulativa
Título original: Spectre Attacks: Exploiting Speculative Execution
Publicado2019 IEEE Symposium on Security and Privacy (SP)
Saiu em uma revista, congresso ou livro, que normalmente avaliam o trabalho antes de aceitar. Mesmo assim, um único estudo nunca é a palavra final.
Resumo
Este paper não tem resumo disponível.
Análise de pesquisa
Escrita pelo Kurz, não pelos autores do paper. O resumo acima é dos próprios autores.
- Última revisão
- Versão
- 1.0
Visão geral
Processadores modernos não esperam uma leitura lenta de memória para decidir para onde um desvio vai. Eles adivinham, executam adiante e descartam o trabalho se o palpite estava errado. Como o estado arquitetural (registradores e memória) é restaurado, supunha-se que isso fosse invisível para a segurança. O artigo, de Paul Kocher e coautores (dez no preprint, doze na versão publicada, que acrescenta Jann Horn e Anders Fogh), mostra que a suposição está errada: o trabalho adivinhado pode tocar em dados que não deveria, e o que ele deixa no cache pode ser medido depois.
O artigo foi publicado no IEEE Symposium on Security and Privacy em 2019. Os autores o divulgaram como preprint no arXiv em janeiro de 2018, junto com o ataque relacionado Meltdown, e esta análise segue esse texto público. Isso importa porque o isolamento entre processos, entre uma aba do navegador e o resto do navegador e entre contêineres se apoia na ideia de que a CPU executa fielmente as verificações de segurança de um programa.
Vale conhecer antes: o que é um cache e por que uma leitura em cache é mais rápida, como funcionam a predição de desvios e a execução fora de ordem e o que é um canal lateral.
Contribuição
- Uma nova classe de ataques, chamada Spectre, em que o atacante faz um programa vítima executar de forma especulativa instruções que não rodariam numa execução correta (o artigo as chama de instruções transitórias) e vazar um segredo por um canal lateral.
- Duas variantes concretas. Uma explora desvios condicionais, treinando o preditor e depois fornecendo um índice fora dos limites (contorno de verificação de limites, CVE-2017-5753). A outra explora desvios indiretos, envenenando o branch target buffer para que um "gadget" escolhido na vítima execute de forma especulativa (CVE-2017-5715).
- Provas de conceito funcionais em código nativo e em JavaScript rodando num navegador, que cruzam uma fronteira de processo e uma de sandbox.
- Uma discussão de outras variantes e de opções de mitigação, e um apelo por um contrato claro entre hardware e software sobre o que um processador pode vazar.
Metodologia
O ataque tem três passos. O atacante encontra na vítima um código que possa servir de lado emissor de um canal encoberto, faz o processador executá-lo de forma especulativa e depois lê o resultado pelo cache com medições de tempo do tipo Flush+Reload ou Evict+Reload.
Na variante de desvio condicional, o atacante primeiro chama o código com entradas válidas para que o preditor espere que a verificação de limites passe, e depois o chama com um índice fora do intervalo enquanto o tamanho do array não está no cache. O processador erra o palpite e lê array2[array1[x] * 256], o que traz para o cache uma linha cujo endereço depende do byte secreto. Repetindo com índices diferentes, lê-se a memória byte a byte. Na variante indireta, o atacante treina o branch target buffer a partir do próprio espaço de endereços, já que só importa o endereço virtual do destino e a correspondência com o endereço do desvio pode ser parcial.
Os experimentos são demonstrações em máquinas reais. Os autores testaram Intel Ivy Bridge (i7-3630QM), Haswell (i7-4650U) e Skylake (um Xeon no Google Cloud), AMD Ryzen e alguns processadores ARM da Samsung e da Qualcomm em celulares, em Linux e Windows de 32 e 64 bits.
Resultados
Estes são os resultados relatados pelos autores.
- A vulnerabilidade foi observada em todos os processadores x86 testados e em alguns ARM, de modo que o problema está na ideia de especulação e não em um fabricante.
- Em código nativo, os autores leram todo o espaço de endereços de um programa vítima, inclusive seus segredos. O código sem otimização do apêndice lê cerca de 10 KB/s em um i7 Surface Pro 3.
- Um programa JavaScript rodando no Chrome leu memória privada do processo que o executa. Como o navegador reduz a precisão do seu temporizador, os autores construíram um relógio de alta resolução com uma thread Web Worker que decrementa um valor compartilhado.
- O mistreinamento entre hyper-threads do mesmo núcleo Intel funcionou, o Skylake mostrou mistreinamento baseado no histórico de desvios e alguns testes de desvio indireto funcionaram no Skylake mas não no Haswell. A indexação do branch target buffer precisou de apenas 20 bits do endereço do desvio nos testes.
- O Meltdown, descrito como relacionado, é diferente: não usa predição de desvios, depende de um problema de privilégio específico da Intel para ler a memória do kernel, e o patch KAISER que o impede não impede o Spectre.
- As mitigações discutidas pelos autores são parciais: instruções de serialização como
lfence(cujas garantias não estavam definidas na época), barreiras inseridas pelo compilador com custo alto, desativar o hyper-threading e limpar o estado do preditor, mudanças de microcódigo. Eles chamam todas elas de medidas paliativas.
Análise crítica
O artigo é claro e reproduzível no seu núcleo, e seu principal valor é mostrar uma categoria inteira nova de falha. Leia-o com estes pontos em mente.
- É um conjunto de provas de conceito, e não uma medição de quanto software real é explorável. Os autores dizem que a exploração depende da CPU da vítima, das escolhas do compilador e do acesso do atacante.
- O risco é concentrado. O atacante normalmente precisa executar código na mesma CPU da vítima. Os autores consideram concebíveis ataques pela rede, mas tratam código na mesma máquina como o principal perigo. O vazamento é de sigilo, não de integridade.
- A seção de mitigação é provisória. Ela termina com "medidas paliativas até que haja mais pesquisa", e a discussão do que processadores futuros poderiam fazer é especulação. Em nossa leitura, a resposta posterior da indústria (novas instruções, compiladores e sistemas operacionais alterados, novo hardware) confirma a direção, mas está fora deste artigo.
- Há trabalho sobreposto. O próprio artigo registra que se sobrepõe em parte a um trabalho independente do Project Zero do Google.
- O texto que analisamos é o preprint. Detalhes da versão publicada nos anais podem diferir.
Pesquisas futuras
- Contratos precisos entre hardware e software que digam qual estado um processador pode vazar, para que se possa demonstrar que um software é seguro.
- Defesas de compilador e de sistema operacional medidas pelo custo de desempenho, já que o artigo avisa que barreiras abrangentes prejudicam o desempenho.
- Ferramentas para encontrar código vulnerável, por exemplo com fuzzing e análise estática, como os autores sugerem.
- Projetos de processador que não deixem o trabalho especulativo alterar estado compartilhado, e outros canais além do cache (contenção de barramento, atividade da ALU, o próprio preditor).
Discussão · 0
Entre para participar da discussãoNenhum post ainda. Seja o primeiro a iniciar a discussão.