
Doppia Liberazione
CVE-2020-25637
*** Descrizione ***
Un problema di doppia deallocazione di memoria si è verificato nell'API libvirt, nelle versioni precedenti alla versione 6.8.0, incaricata di richiedere informazioni sulle interfacce di rete di un dominio QEMU in esecuzione. Questa falla interessa il driver di controllo accessi polkit. Più precisamente, i client che si connettono al socket in lettura-scrittura con autorizzazioni ACL limitate potrebbero utilizzare questa falla per causare un crash del demone libvirt, portando a un denial of service, o potenzialmente aumentare i propri privilegi sul sistema. La minaccia maggiore di questa vulnerabilità riguarda la riservatezza e l'integrità dei dati, nonché la disponibilità del sistema.
La minaccia più importante di questa vulnerabilità riguarda:
I punteggi della falla:
una falla moderata da RedHat con un punteggio medio di 6.4
una falla moderata da NVD con un punteggio medio di 6.7
*** Diversi strumenti e prerequisiti importanti da impostare per sfruttare questa falla ***
Prima di tutto è necessario verificare la compatibilità del nostro sistema operativo; basta eseguire questo comando:
grep -E -c "vmx|svm" /proc/cpuinfo
Se il comando risponde ok, puoi procedere con l'installazione:
sudo apt-get -y install qemu-kvm libvirt-bin virt-top outils-libguestfs virtinst bridge-utils
2) Installazione vagrant :
Per installare vagrant basta eseguire questo comando:
sudo apt -y install vagrant
Una volta installati Vagrant e KVM, dovresti essere pronto per installare un plugin libvirt per poter iniziare a gestire le macchine virtuali KVM utilizzando Vagrant.
vagrant plugin install vagrant-libvirt
Puoi confermare che il plugin è stato installato:
vagrant plugin list
3) Box vagrant (vagrant box) :
È possibile utilizzare un modello già pronto direttamente da Vagrant; in questo caso useremo un'immagine Ubuntu 20.04.
Per aggiungere la nostra immagine alla box vagrant basta eseguire questo comando:
vagrant box add generic / ubuntu1804 --provider = libvirt
Per visualizzare l'elenco delle box presenti localmente:
vagrant box list
4) Debug
Due possibilità di debug
GDB, se lo strumento non è disponibile nel tuo sistema operativo esegui questo comando:
sudo apt-get install gdb
Valgrind, se lo strumento non è disponibile nel tuo sistema operativo esegui questo comando:
sudo apt-get install valgrind
*** Esecuzione del codice ***
Avvia una vm tramite vagrant:
vagrant up
Prima di tutto installa la libreria:
sudo apt-get install -y libvirt-dev
Compilazione:
gcc -g -Wall info1.c -o info1 -lvirt
Esecuzione del codice:
./info1 qemu:///system vagrant-vms_ubuntu-01
Esecuzione con debug:
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt ./info1 qemu:///system vagrant-vms_ubuntu-01
*** Attivare la falla ***
Prima di attivare la falla è fondamentale conoscere il funzionamento della funzione che causa il problema in libvirt.
Supponiamo che un attaccante possa provocare l'utilizzo di una zona di memoria già liberata tramite qemuAgentGetInterfaces () di libvirt, precisamente nella zona di memoria della variabile ifname, al fine di causare un denial of service e, eventualmente, eseguire codice.
Il momento tanto atteso è arrivato.
Una volta avviato il file vagrant, è necessario eseguire il codice info1.c all'interno di una macchina virtuale a sua volta avviata da Qemu/KVM. Quindi, creare VM all'interno di una VM, ossia eseguire il codice nella VM creata da Vagrant.
*** Correzione di questa falla ***
Basta impostare la variabile ifname a null nella funzione qemuAgentGetInterfaces () di libvirt, cioè la variabile ifname deve essere liberata per ogni interfaccia.
*** Dimostrazione ***
Troverai una semplice dimostrazione del problema (double free) nel file PowerPoint.
*** Importante ***
Il progetto non è stato portato a termine per motivi di complessità della falla, di hardware e di mancanza di tempo.