
Dupla Liberação
CVE-2020-25637
*** Descrição ***
Ocorreu um problema de dupla liberação de memória na API libvirt, em versões anteriores à versão 6.8.0, responsável por solicitar informações sobre as interfaces de rede de um domínio QEMU em execução. Esta falha afeta o driver de controle de acesso polkit. Mais especificamente, clientes que se conectam ao socket em modo leitura-escrita com permissões ACL limitadas poderiam usar esta falha para travar o daemon libvirt, resultando em uma negação de serviço, ou potencialmente elevar seus privilégios no sistema. A maior ameaça desta vulnerabilidade diz respeito à confidencialidade e integridade dos dados, bem como à disponibilidade do sistema.
A ameaça mais significativa desta vulnerabilidade é:
As pontuações da falha:
Uma falha moderada pela RedHat com média de 6.4
Uma falha moderada pela NVD com média de 6.7
*** Diferentes ferramentas e pré-requisitos importantes para explorar esta falha ***
Antes de tudo, é necessário verificar a compatibilidade do nosso sistema operacional. Basta executar este comando:
grep -E -c "vmx|svm" /proc/cpuinfo
Se o comando responder ok, você pode prosseguir com a instalação:
sudo apt-get -y install qemu-kvm libvirt-bin virt-top outils-libguestfs virtinst bridge-utils
2) Instalação do vagrant :
Para instalar o vagrant, basta executar este comando:
sudo apt -y install vagrant
Uma vez instalados o Vagrant e o KVM, você deve estar pronto para instalar um plugin libvirt para começar a gerenciar máquinas virtuais KVM usando o Vagrant.
vagrant plugin install vagrant-libvirt
Você pode confirmar que o plugin foi instalado com:
vagrant plugin list
3) Box vagrant (vagrant box) :
É possível usar um modelo pronto diretamente pelo vagrant. No nosso caso, usaremos uma imagem Ubuntu 20.04.
Para adicionar nossa imagem à box vagrant, basta executar este comando:
vagrant box add generic / ubuntu1804 --provider = libvirt
Para consultar a lista de boxes presentes localmente:
vagrant box list
4) Depuração
Duas possibilidades de depuração:
GDB, se a ferramenta não estiver disponível no seu sistema operacional, execute este comando:
sudo apt-get install gdb
Valgrind, se a ferramenta não estiver disponível no seu sistema operacional, execute este comando:
sudo apt-get install valgrind
*** Execução do código ***
Iniciar uma VM via vagrant:
vagrant up
Antes de tudo, instale a biblioteca:
sudo apt-get install -y libvirt-dev
Compilação:
gcc -g -Wall info1.c -o info1 -lvirt
Execução do código:
./info1 qemu:///system vagrant-vms_ubuntu-01
Execução com depuração:
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt ./info1 qemu:///system vagrant-vms_ubuntu-01
*** Ativar a falha ***
Antes de ativar a falha, é essencial entender o funcionamento da função problemática no libvirt.
Suponha que um atacante possa provocar o uso de uma área de memória liberada através de qemuAgentGetInterfaces() do libvirt, precisamente na área de memória da variável ifname, para causar uma negação de serviço e, possivelmente, executar código.
O momento esperado chegou.
Assim que o arquivo vagrant for iniciado, é necessário executar o código info1.c dentro de uma máquina virtual ela mesma iniciada pelo Qemu/KVM. Ou seja, fazer VMs dentro de uma VM, ou seja, executar o código na VM criada pelo vagrant.
*** Correção desta falha ***
Basta passar a variável ifname para null na função qemuAgentGetInterfaces() do libvirt. Ou seja, a variável ifname deve ser liberada para cada interface.
*** Demonstração ***
Você encontrará uma demonstração simples do problema (double free) no arquivo PowerPoint.
*** Importante ***
O projeto não foi concluído até o final devido à complexidade da falha, ao hardware e à falta de tempo.