作者:raycp
原文來自安全客:https://www.anquanke.com/post/id/197639
漏洞描述
qemu-kvm
默認使用的是-net nic -net user
的參數,提供了一種用戶模式(user-mode)的網絡模擬。使用用戶模式的網絡的客戶機可以連通宿主機及外部的網絡。用戶模式網絡是完全由QEMU自身實現的,不依賴於其他的工具(bridge-utils、dnsmasq、iptables等),而且不需要root用戶權限。QEMU使用Slirp實現了一整套TCP/IP協議棧,並且使用這個協議棧實現了一套虛擬的NAT網絡。SLiRP模塊主要模擬了網絡應用層協議,其中包括IP協議(v4和v6)、DHCP協議、ARP協議等。
cve-2019-6778這個漏洞存在於QEMU的網絡模塊SLiRP中。該模塊中的tcp_emu()
函數對端口113(Identification protocol)的數據進行處理時,沒有進行有效的數據驗證,導致堆溢出。經過構造,可實現以QEMU進程權限執行任意代碼。
漏洞復現
首先是安裝環境,根據官方描述,漏洞版本是3.1.50
,但是我在git中沒有找到這個版本,於是使用的是3.1.0
,使用下面的命令編譯qemu。
git clone git://git.qemu-project.org/qemu.git
cd qemu
git checkout tags/v3.1.0
mkdir -p bin/debug/naive
cd bin/debug/naive
../../../configure --target-list=x86_64-softmmu --enable-debug --disable-werror
make
編譯出來qemu的路徑為./qemu/bin/debug/naive/x86_64-softmmu/qemu-system-x86_64
,查看版本:
$ ./qemu/bin/debug/naive/x86_64-softmmu/qemu-system-x86_64 -version
QEMU emulator version 3.1.0 (v3.1.0-dirty)
Copyright (c) 2003-2018 Fabrice Bellard and the QEMU Project developers
接下來就是編譯內核與文件系統,可以參考上一篇的cve-2015-5165
漏洞分析的文章。
因為漏洞需要在user模式下啟動虛擬機,因此使用以下的命令啟動qemu虛擬機:
$ cat launch.sh
#!/bin/sh
./qemu-system-x86_64 /
-kernel ./bzImage /
-append "console=ttyS0 root=/dev/sda rw" /
-hda ./rootfs.img /
-enable-kvm -m 2G -nographic /
-L ./pc-bios -smp 1 /
-net user,hostfwd=tcp::2222-:22 -net nic
漏洞需要在user模式下啟動虛擬機,啟動虛擬機后虛擬機的ip為10.0.2.15
,宿主機ip為10.0.2.2
。雖然在主機中ifconfig
看不到該ip,但確實是可以連通的。可以從qemu虛擬機中ping主機,無法從主機ping虛擬機。