
Doppelte Freigabe
CVE-2020-25637
*** Beschreibung ***
Ein Problem mit doppelter Speicherfreigabe (double free) ist in der libvirt-API in Versionen vor 6.8.0 aufgetreten, die für die Abfrage von Informationen über die Netzwerkschnittstellen einer laufenden QEMU-Domäne zuständig ist. Diese Sicherheitslücke betrifft den Zugriffskontrolltreiber polkit. Insbesondere könnten Clients, die sich mit Lese-/Schreibberechtigung mit eingeschränkten ACL-Berechtigungen mit dem Socket verbinden, diese Schwachstelle ausnutzen, um den libvirt-Daemon zum Absturz zu bringen, was zu einem Denial-of-Service führt oder möglicherweise ihre Privilegien auf dem System erhöht. Die größte Bedrohung durch diese Schwachstelle betrifft die Vertraulichkeit und Integrität der Daten sowie die Verfügbarkeit des Systems.
Die größte Bedrohung durch diese Schwachstelle betrifft:
Die Bewertungen der Schwachstelle:
moderate Schwachstelle von RedHat mit einem Durchschnittswert von 6.4
moderate Schwachstelle von NVD mit einem Durchschnittswert von 6.7
*** Verschiedene Tools und wichtige Voraussetzungen zur Ausnutzung dieser Schwachstelle ***
Zunächst ist es notwendig, die Kompatibilität unseres Betriebssystems zu überprüfen. Dazu führen Sie diesen Befehl aus:
grep -E -c "vmx|svm" /proc/cpuinfo
Wenn der Befehl ok zurückgibt, können Sie mit der Installation fortfahren:
sudo apt-get -y install qemu-kvm libvirt-bin virt-top outils-libguestfs virtinst bridge-utils
2) Installation von Vagrant:
Um Vagrant zu installieren, führen Sie diesen Befehl aus:
sudo apt -y install vagrant
Sobald Sie Vagrant und KVM installiert haben, sollten Sie bereit sein, ein libvirt-Plugin zu installieren, um mit der Verwaltung von KVM-VMs mit Vagrant beginnen zu können.
vagrant plugin install vagrant-libvirt
Sie können bestätigen, dass das Plugin installiert wurde
vagrant plugin list
3) Vagrant-Box:
Es ist möglich, ein direkt von Vagrant bereitgestelltes Template zu verwenden. In unserem Fall verwenden wir ein Ubuntu 20.04-Image.
Um unser Image zur Vagrant-Box hinzuzufügen, führen Sie diesen Befehl aus:
vagrant box add generic / ubuntu1804 --provider = libvirt
Um die Liste der lokal vorhandenen Boxen anzuzeigen:
vagrant box list
4) Debugging
Zwei Debugging-Möglichkeiten
GDB: Falls das Tool in Ihrem Betriebssystem nicht verfügbar ist, führen Sie diesen Befehl aus:
sudo apt-get install gdb
Valgrind: Falls das Tool in Ihrem Betriebssystem nicht verfügbar ist, führen Sie diesen Befehl aus:
sudo apt-get install valgrind
*** Code-Ausführung ***
Starten einer VM mit Vagrant:
vagrant up
Zunächst die Bibliothek installieren:
sudo apt-get install -y libvirt-dev
Kompilierung:
gcc -g -Wall info1.c -o info1 -lvirt
Code-Ausführung:
./info1 qemu:///system vagrant-vms_ubuntu-01
Ausführung mit Debugging:
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt ./info1 qemu:///system vagrant-vms_ubuntu-01
*** Die Schwachstelle aktivieren ***
Bevor Sie die Schwachstelle aktivieren, ist es wichtig, die Funktionsweise der problematischen Funktion in libvirt zu verstehen.
Angenommen, ein Angreifer kann die Nutzung eines freigegebenen Speicherbereichs über qemuAgentGetInterfaces () von libvirt auslösen, insbesondere im Speicherbereich der Variable ifname, um einen Denial-of-Service zu verursachen und möglicherweise Code auszuführen.
Der erwartete Moment ist gekommen
Sobald die Vagrant-Datei gestartet ist, muss der Code info1.c in einer virtuellen Maschine ausgeführt werden, die selbst von Qemu/KVM gestartet wird. Also VMs in einer VM, d.h. den Code in der von Vagrant erstellten VM ausführen.
*** Behebung dieser Schwachstelle ***
Es reicht aus, die Variable ifname in der Funktion qemuAgentGetInterfaces() von libvirt auf null zu setzen, d.h. die Variable ifname muss für jede Schnittstelle freigegeben werden.
*** Demonstration ***
Sie finden eine einfache Demonstration des Problems (Double Free) in der PowerPoint-Datei.
*** Wichtig ***
Das Projekt wurde aufgrund der Komplexität der Schwachstelle und der Hardware sowie des Zeitmangels nicht abgeschlossen.