CVE-2020-25637
*** 描述 ***
在 libvirt API 中,存在一个双重释放内存的问题,影响版本为 6.8.0 之前的版本,该 API 负责请求正在运行的 QEMU 域的网络接口信息。这个漏洞影响了 polkit 访问控制驱动程序。具体来说,以读写方式连接到套接字且具有有限 ACL 权限的客户端可以利用此漏洞使 libvirt 守护进程崩溃,从而导致拒绝服务,或可能提升系统上的权限。该漏洞的最大威胁涉及数据的机密性、完整性以及系统的可用性。
该漏洞最重要的威胁涉及:
漏洞评分:
RedHat 评为中等风险,平均分 6.4
NVD 评为中等风险,平均分 6.7
*** 利用此漏洞所需的不同工具和重要前提 ***
首先需要验证操作系统的兼容性,只需运行以下命令:
grep -E -c "vmx|svm" /proc/cpuinfo
如果命令返回 ok,则可以继续安装:
sudo apt-get -y install qemu-kvm libvirt-bin virt-top outils-libguestfs virtinst bridge-utils
2) 安装 vagrant:
要安装 vagrant,只需运行以下命令:
sudo apt -y install vagrant
安装 Vagrant 和 KVM 后,您应该可以安装一个 libvirt 插件,以便能够使用 Vagrant 开始管理 KVM 虚拟机。
vagrant plugin install vagrant-libvirt
您可以确认插件已安装
vagrant plugin list
3) Vagrant 盒子(box vagrant):
可以直接使用 Vagrant 提供的现成模板,在本例中我们将使用 ubuntu 20.04 镜像。
要将我们的镜像添加到 Vagrant 盒子中,只需运行以下命令:
vagrant box add generic / ubuntu1804 --provider = libvirt
查看本地已有的盒子列表:
vagrant box list
4) 调试
两种调试方式:
GDB,如果您的操作系统没有此工具,请运行以下命令:
sudo apt-get install gdb
Valgrind,如果您的操作系统没有此工具,请运行以下命令:
sudo apt-get install valgrind
*** 代码执行 ***
通过 Vagrant 启动虚拟机:
vagrant up
首先安装库:
sudo apt-get install -y libvirt-dev
编译:
gcc -g -Wall info1.c -o info1 -lvirt
执行代码:
./info1 qemu:///system vagrant-vms_ubuntu-01
带调试执行:
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt ./info1 qemu:///system vagrant-vms_ubuntu-01
*** 触发漏洞 ***
在触发漏洞之前,了解 libvirt 中问题函数的工作方式至关重要。
假设攻击者可以通过 libvirt 的 qemuAgentGetInterfaces() 函数导致使用已释放的内存区域,具体在变量 ifname 的内存区域,从而发起拒绝服务攻击,甚至可能执行代码。
期待的时刻到了。
一旦 Vagrant 文件启动,就需要在由 Qemu/KVM 启动的虚拟机中运行 info1.c 代码。也就是说,在 Vagrant 创建的虚拟机中执行该代码。
*** 漏洞修复 ***
只需将 libvirt 中 qemuAgentGetInterfaces() 函数的变量 ifname 设为 null,也就是说,每个接口的 ifname 变量都必须被释放。
*** 演示 ***
您可以在 PowerPoint 文件中找到问题的简单演示(双重释放)。
*** 重要说明 ***
由于漏洞的复杂性、硬件限制以及时间不足,该项目未完全完成。