Pesquisa de Ameaças

O fantasma persiste: será que todos nós queremos trocar segurança por velocidade?

Martin Hron, 26 Junho 2018

Saiba porque as correções são especialmente importantes em um mundo pós-Meltdown e Spectre.

Para todos no setor de segurança cibernética, 2018 começou em 3 de janeiro, o dia em que um trio de bugs de CPU foi anunciado. Que trio? Você provavelmente se lembra do Meltdown e Spectre, mas, do nosso ponto de vista, o segundo é realmente dois em um. Embora o Meltdown e Spectre tenham recebido bastante cobertura nos meios de comunicação e blogs de segurança em todo o mundo (sim, isso inclui a gente também), ainda há algo mais a dizer e fazer sobre eles.

Primeiro, para ser claro e como lembrete: Meltdown é um bug que afetou principalmente CPUs da Intel (com poucas exceções). Por outro lado, Spectre é uma falha de design que está presente em quase todas as CPUs por aí. Infelizmente, ficou claro que ainda há muitas consequências por vir.

O que sabemos: oito bugs parecidos com o Spectre foram anunciados, todos chamados de Spectre-NG (“next generation”, próxima geração). Quatro desses bugs são considerados “críticos”. Os primeiros dois desse conjunto foram divulgados em 21 de maio e chamados de variantes 3a e 4, com números CVE-2018-3640 e CVE-2018-3639. Essas variantes foram encontradas pela Microsoft e pelo grupo Project Zero Google.

Cronograma das vulnerabilidade Spectre/Meltdown divulgadas (até o momento):

02/01/2018

  • Variante 1: Bounds Check Bypass – CVE-2017-5753: permite que o invasor acesse a memória especulativamente, além dos limites permitidos e depois recupere os dados do cache.
  • Variante 2: Branch Target Injection – CVE-2017-5715: permite memória especulativa para executar o código que não deveria ser executado sob circunstâncias normais.
  • Variante 3: Rogue Data Cache Load – CVE-2017-5754: Conhecido também como Meltdown, permite acessar qualquer local de memória arbitrário e ler os dados.

22/05/2018

  • Variante 3a: Rogue System Register Read – CVE-2018-3640: Permite que o invasor leia registros especiais privilegiados (acessíveis apenas no kernel) através da execução especulativa de instruções não privilegiadas e depois recuperar valores usando ataque de canal lateral. 
  • Variante 4: Speculative Store Bypass – CVE-2018-3639:  Permite que o invasor leia especulativamente conteúdo antigo/expirado na memória, pois a instrução de carregar é executada especulativamente fora de ordem.  Isso pode permitir que um invasor acesse os dados usando um ataque de canal lateral.

Falhas de design com CPUs modernas

Então, qual é o problema fundamental com o design de CPUs modernas? Ao longo do tempo, criamos CPUs que são essencialmente oráculos. CPUs que podem prever o futuro ou, pelo menos, prever o que acontecerá em seguida. Como assim? Primeiro, é importante compreender como uma CPU se comunica com a memória. As CPUs atuais são tão rápidas que solicitar memória para dados as torna lentas. Por isso, para que a CPU seja mais rápida, ela exige algo chamado de cache: um pedaço de memória pequeno e rápido que mantém prontamente acessíveis os dados frequentemente usados.

Sempre que uma CPU acessa dados em sua memória principal, ela consulta o cache. Se os dados estiverem lá, ótimo, caso contrário, uma cópia dos dados necessários é movido da memória principal para o cache e depois para a CPU. Na próxima vez que a CPU quiser os mesmos dados, eles já estarão no cache.

Como as CPUs modernas podem processar instruções em paralelo, elas tendem a economizar tempo. Imagine que uma CPU atinja algum ponto em um programa quando ela deve decidir para qual dos dois lados ir com base no conteúdo (valor) de algum local (endereço) na memória. Esse valor não está no cache, por isso, precisa ser buscado na memória.

Enquanto isso, a CPU se torna impaciente e começa a especular, “e se o valor que estou esperando me fizer ir para esse caminho? Porque geralmente eu pego esse caminho... Eu passei por ele muitas vezes antes”.

Então, ele executa especulativamente um ramo de código. Parte desse código carrega dados de outro lugar da memória (vamos chamá-lo de lugar secreto), onde o valor secreto é armazenado. Enquanto isso, o valor real finalmente chega da memória principal. Agora, digamos que a CPU reconhece que deve ir para o outro caminho. Ela descarta todos os resultados que tinha da execução especulativa e continua no caminho correto.

Agora, imagine que o valor importante é uma verificação de segurança que diz à CPU não tocar no lugar secreto. Mas, ela já fez isso. Isso é importante? Tem alguma coisa de mais? Afinal de contas, isso foi feito apenas especulativamente e todos os resultados foram jogados fora, certo? Não muito. Lembra-se do cache? O valor secreto ainda está lá. Usando uma técnica especial (que não vou detalhar), o valor, de fato, pode ser facilmente recuperado.

Então essa é a essência do problema. À medida que competimos para criar CPUs mais rápidas, trocamos segurança por velocidade e especulação. Infelizmente, isso não pode ser corrigido tão facilmente. Não, pelo menos, sem sacrificar o desempenho. E por que as CPUs antigas não são afetadas? A resposta é simples: elas não especulam, não pressupõem.

Qual a gravidade desses problemas para o usuário regular e eu deveria me preocupar?

Embora essas vulnerabilidades sejam comprovadas e sérias (um código “prova de conceito” existe para todas elas), não há nenhuma prova de que algum malware tenha as explorado com sucesso. Para explorarem com sucesso em um caso real, o invasor precisa conhecer a “anatomia” do processo e sistema alvo. Assim, é pouco provável que essas vulnerabilidades sejam exploradas em massa.

Você pode estar perguntando:  eu deveria corrigir meu sistema ou não me preocupar com isso? As correções deixarão meu computador mais lento?

A resposta é sim, algumas mitigações podem reduzir o desempenho em 30%. E também sim, você deveria fazer a correção. No entanto, saiba que para fazê-la corretamente, é necessário, às vezes, implantar correções no Sistema Operacional (SO) e CPU. Normalmente, a correção do SO é automática e, assim, simples. Ao ser solicitado a corrigir, diga SIM. Porém, como esses problemas estão no hardware e arquitetura da própria CPU, você deveria corrigir sua CPU, Você normalmente precisa atualizar sua BIOS que então fornecerá a correção chamada de “microcódigo de CPU” em sua CPU sempre que seu computador iniciar. Isso é necessário por motivos de segurança, pois qualquer “correção” em uma CPU não é permanente e assim deve ser feita sempre que a CPU iniciar.

Por falar em degradação de desempenho, ela varia muito. Não espere mais de 30% de impacto no desempenho e, na maioria dos casos, ele será menor. Esse impacto no desempenho vem do fato de que, para “mitigar” o problema do Meltdown e para proteger a memória privilegiada do sistema operacional (kernel) para que não vaze seu conteúdo em um modo não privilegiado, medidas especiais precisam ser tomadas por fornecedores de sistema operacional para isolar ainda mais esses dois espaços de memória. Como resultado, cada troca entre modo privilegiado (kernel) / não privilegiado (usuário), resulta em uma penalidade no desempenho. Mas isso depende da frequência com que isso acontece, que por sua vez depende do tipo de aplicativo em execução. Se tiver uma CPU moderna (Skylake, Kabylake ou mais recente), o custo de desempenho fica em um dígito. Em CPUs mais antigas, o impacto pode ser mais perceptível.

Então, o que fazer?

  • Mantenha a calma e faça as correções. 
  • Acompanhe a situação do Spectre e finalmente...
  • Mantenha a calma e faça as correções.