Falha no KVM permite execução de código fora do sistema convidado em processadores AMD

Pesquisadores da equipe do Google Project Zero identificaram uma vulnerabilidade (CVE-2021-29657) no hipervisor KVM. Este é um hipervisor de código aberto baseado em Linux que suporta virtualização acelerada por hardware em x86, ARM, PowerPC e S/390) que permite evitar o isolamento do sistema convidado e executar seu código no ambiente host. Assim, uma falha no KVM permite execução de código fora do sistema convidado em processadores AMD.

Os pesquisadores mencionam que para a correta implementação desta funcionalidade, o hipervisor deve interceptar todas as instruções SVM executadas nos sistemas convidados, emular seu comportamento e sincronizar o estado com o hardware, o que é uma tarefa bastante complicada.

No post é mencionado que o problema se manifesta do kernel Linux 5.10-rc1 a v5.12-rc6, ou seja, ele cobre apenas os kernels 5.10 e 5.11 (a maioria dos ramos estáveis das distribuições não foram afetados pelo problema). O problema está presente no mecanismo nested_svm_vmrun, implementado usando a extensão AMD SVM (Secure Virtual Machine) e permitindo a inicialização aninhada de sistemas convidados.

Nesta postagem do blog, descrevo uma vulnerabilidade no código KVM específico da AMD e discuto como esse bug pode se transformar em um escape completo da máquina virtual. Até onde eu sei, este é o primeiro artigo público de um breakout KVM guest-to-host que não depende de bugs nos componentes do espaço do usuário como o QEMU.

O bug discutido foi designado CVE-2021-29657, afeta as versões do kernel v5.10-rc1 a v5.12-rc6 e foi corrigido no final de março de 2021. Como o bug só se tornou explorável na v5.10 e foi descoberto cerca de 5 meses depois, a maioria das implantações de KVM do mundo real não deve ser afetada. Ainda acho que o problema é um estudo de caso interessante no trabalho necessário para construir um escape convidado-para-host estável contra KVM e espero que este artigo possa demonstrar que os comprometimentos do hipervisor não são apenas problemas teóricos.

Falha no KVM permite execução de código fora do sistema convidado em processadores AMD

Imagem: AMD / YouTube

Depois de analisar a implementação do KVM proposta, os pesquisadores encontraram um erro lógico que permite que o conteúdo do MSR (Model Specific Register) do host seja influenciado pelo sistema convidado , que pode ser usado para executar código no nível do host.

Em particular, a execução de uma operação VMRUN de um segundo convidado de nível aninhado (L2 iniciado de outro convidado) leva a uma segunda chamada para nested_svm_vmrun e corrompe a estrutura svm-> nested.hsave, que é sobreposta com dados de vmcb do sistema convidado L2 .

Como resultado, surge uma situação em que no nível do convidado L2 é possível liberar memória na estrutura svm-> nested.msrpm, que armazena o bit MSR, mesmo que ele continue a ser usado, e acessar o MSR do host meio ambiente.

Isso significa, por exemplo, que a memória de um convidado pode ser inspecionada despejando a memória alocada de seu processo de espaço do usuário ou que os limites de recursos de tempo e memória da CPU podem ser facilmente impostos. 

Além disso, o KVM pode descarregar a maior parte do trabalho relacionado à emulação de dispositivo para o componente de espaço do usuário.

O problema está presente no código usado em sistemas com processadores AMD (módulo kvm-amd.ko) e não aparece em processadores Intel.

 Além de alguns dispositivos sensíveis ao desempenho que lidam com o tratamento de interrupções, todo o código complexo de baixo nível para fornecer acesso a disco virtual, rede ou GPU pode ser implantado no espaço do usuário.  

Os pesquisadores, além de descrever o problema, também prepararam um protótipo funcional de um exploit que permite a execução de um shell root de um ambiente convidado em um ambiente host em um sistema com processador AMD Epyc 7351P e kernel Linux 5.10.

Observa-se que esta é a primeira vulnerabilidade de convidado para host no próprio hipervisor KVM, não relacionada a erros em componentes do espaço do usuário, como QEMU. A correção foi aceita no kernel no final de março.

Por fim, se você estiver interessado em aprender mais sobre a nota, pode verificar os detalhes no link a seguir.

Via DesdeLinux

Share This Article
Follow:
Jornalista com pós graduações em Economia, Jornalismo Digital e Radiodifusão. Nas horas não muito vagas, professor, fotógrafo, apaixonado por rádio e natureza.
Sair da versão mobile