SWAPGS - uma nova vulnerabilidade no mecanismo de execução especulativa da CPU

Pesquisadores da Bitdefender identificado nova vulnerabilidade (CVE-2019-1125) no mecanismo especulativo de execução de instruções das CPUs modernas, denominado SWAPGS, que corresponde ao nome da instrução do processador que está causando o problema. Vulnerabilidade permite permitir que um invasor sem privilégios determine o conteúdo das áreas de memória do kernel ou das máquinas virtuais em execução. Problema confirmado por em processadores Intel (x86_64) e parcialmente afeta Processadores AMD para os quais o principal vetor de ataque não aparece. Os métodos implementados anteriormente para neutralizar as vulnerabilidades Spectre e Meltdown não protegem contra o ataque SWAPGS ao usar processadores Intel, mas correções já foram propostas para Linux, ChromeOS, Android e Windows.

A vulnerabilidade pertence à classe Spectre v1 e se baseia na ideia de restaurar dados do cache do processador remanescentes após a execução especulativa de instruções. Para melhorar o desempenho, as unidades de previsão de ramificação das CPUs modernas utilizam a execução preemptiva de algumas instruções com maior probabilidade de serem executadas, mas sem esperar pelo cálculo de todos os fatores que determinam sua execução (por exemplo, quando as condições de ramificação ou os parâmetros de acesso não foram ainda não foi calculado). Se a previsão não for confirmada, o processador descarta o resultado da execução especulativa, mas os dados processados ​​​​durante ela permanecem no cache do processador e podem ser restaurados usando métodos para determinar o conteúdo do cache através de canais laterais, analisando a mudança no acesso tempo para dados armazenados em cache e não armazenados em cache.

A peculiaridade do novo ataque é a utilização de um vazamento que ocorre durante a execução especulativa da instrução SWAPGS, que é utilizada em sistemas operacionais para substituir o valor do registrador GS quando o controle passa do espaço do usuário para o kernel do SO (o GS o valor usado no espaço do usuário é substituído pelo valor usado durante as operações no kernel). No kernel Linux, o GS armazena um ponteiro per_cpu usado para acessar os dados do kernel, e o espaço do usuário armazena ponteiros para TLS (Thread Local Storage).

Para evitar chamar a instrução SWAPGS duas vezes ao acessar o kernel novamente a partir do espaço do kernel ou ao executar código que não requer uma alteração no registro GS, uma verificação e uma ramificação condicional são executadas antes da instrução. O mecanismo de execução especulativa procede proativamente à execução do código com a instrução SWAPGS sem esperar pelo resultado da verificação e, se a ramificação selecionada não for confirmada, descarta o resultado. Assim, pode surgir uma situação quando um ramo que não envolve execução SWAPGS é selecionado especulativamente, mas durante a execução especulativa o valor do registrador GS será alterado pela instrução SWAPGS e utilizado em operações de memória dependentes que acabam no cache da CPU.

Os pesquisadores propuseram dois cenários de ataque para os quais foram preparados protótipos de exploração. O primeiro cenário é baseado na situação em que a instrução SWAPGS não é executada especulativamente, embora seja realmente utilizada na execução, e o segundo é o oposto, quando a instrução SWAPGS é executada especulativamente, embora não deva realmente ser executada. Para cada cenário, existem duas opções de exploração: o invasor pode determinar o valor em um endereço específico na área do kernel e o invasor pode procurar um valor específico em endereços aleatórios no kernel. A realização de um ataque leva muito tempo e a exploração pode levar várias horas para concluir o vazamento.

Há um problema no kernel do Linux eliminado alterando a lógica de chamada da instrução SWAPGS (bloqueio de execução especulativa), semelhante à correção de outras vulnerabilidades da classe Spectre v1. Espera-se que a proteção adicional tenha impacto mínimo no desempenho de cargas de trabalho típicas. A latência ocorre durante a fase de comutação entre o usuário e o espaço do kernel, o que pode resultar em baixo desempenho quando, por exemplo, há chamadas pesadas ao sistema a partir do aplicativo ou geração frequente de NMIs e interrupções.

A correção requer a instalação de uma atualização do kernel no sistema host e nos ambientes convidados, seguida pela reinicialização do sistema. Para desabilitar a proteção no Linux, pode-se utilizar a opção "nospectre_v1", que também desabilita medidas de bloqueio da vulnerabilidade SWAPGS. A correção está disponível como correção para o kernel Linux, que já está incluído nas versões 4.19.65, 5.2.7, 4.14.137, 4.9.188 e 4.4.188. Atualizações para distribuições Linux ainda não foram lançadas (Debian, RHEL, Fedora, Arch Linux, SUSE / openSUSE, Ubuntu). No Windows, o problema foi resolvido silenciosamente em Atualização de julho. Empresa Google preparado correção para o kernel 4.19 fornecido com o ChromeOS e Android.

Segundo pesquisadores da Bitdefender, a Intel foi informada do problema em agosto do ano passado. Foi decidido corrigir o problema programaticamente, para o qual desenvolvedores da Microsoft, Google e do kernel Linux estiveram envolvidos no desenvolvimento coordenado de uma correção. Processadores Intel mais antigos, anteriores ao Ivy Bridge, são muito mais difíceis de atacar devido à falta de suporte para a instrução WRGSBASE usada na exploração. Os sistemas ARM, POWER, SPARC, MIPS e RISC-V não são afetados pelo problema porque não suportam a instrução SWAPGS.

O problema afeta principalmente proprietários de processadores Intel -
Nos sistemas AMD, apenas o segundo cenário de ataque conseguiu ser reproduzido, que se limita ao processamento especulativo do valor base do registrador GS, que pode ser usado para procurar valores específicos em áreas de memória aleatórias. Para bloquear esta opção de ataque suficiente métodos existentes de proteção contra Spectre v1.

Fonte: opennet.ru

Adicionar um comentário