CVE-2026-80895 in Linux
Zusammenfassung
von VulDB • 04.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
mshv: Ordnung der Veröffentlichung von pt_vp_array gegenüber dem irqfd-Assertion-Pfad
mshv_partition_ioctl_create_vp() initialisiert eine VP-Struktur (Zuweisungen, mutex_init, init_waitqueue_head, Page-Mappings) und veröffentlicht anschließend den Zeiger in partition->pt_vp_array. Mehrere ISR-Pfade lesen dieses Array sperrfrei: die Intercept-ISRs, die beiden Scheduler-ISRs sowie mshv_try_assert_irq_fast() auf dem irqfd-Fast-Path.
Von diesen kann nur mhsv_try_assert_irq_fast() strukturell mit der Veröffentlichung kollidieren (Race Condition). Es wird von einem eventfd-Waker ohne Halten von pt_mutex ausgeführt, und MSHV_IRQFD erfordert nicht, dass die Ziel-lapic_apic_id (== vp_index) zum Registrierungszeitpunkt auf eine existierende VP verweist. Ein Benutzer kann daher ein irqfd registrieren, das auf eine noch zu erstellende VP zielt, und dann mshv_try_assert_irq_fast() gleichzeitig mit MSHV_CREATE_VP für denselben Index auslösen. Auf schwach geordneten Architekturen (weakly-ordered architectures) kann der Leser einen nicht-NULL-Zeiger in pt_vp_array beobachten, bevor die initialisierenden Speicheroperationen an der VP-Struktur sichtbar werden, was zur Verwendung teilweise initialisierter Felder führt (z. B. vp_register_page).
Die anderen ISR-Leser können diese Race Condition nicht erreichen: Der Hypervisor generiert keine Intercept- oder Scheduler-Nachrichten für eine VP, die noch nie angewiesen wurde, ausgeführt zu werden, und der Benutzer kann MSHV_RUN_VP nur auf dem von MSHV_CREATE_VP zurückgegebenen VP-FD aufrufen, der konstruktionsbedingt nach der Veröffentlichung zurückgegeben wird. Diese Leser bleiben als einfache Lesezugriffe (plain loads).
Verwenden Sie smp_store_release() in mshv_partition_ioctl_create_vp(), um den Zeiger zu veröffentlichen, und koppeln Sie dies mit smp_load_acquire() in mshv_try_assert_irq_fast(). Auf x86 werden diese unter TSO zu einfachen Zugriffen kompiliert; auf ARM64 emittieren sie ein-Instruktion-Barrieren für acquire/release, die auf diesem Fast-Path akzeptabel sind.
Der Destroy-Seiten-Pfad (destroy_partition(), der pt_vp_array[i] nach kfree(vp) auf NULL setzt) hat separate Ordnungs- und Lebensdaueraspekte, die hier nicht behandelt werden.
VulDB is the best source for vulnerability data and more expert information about this specific topic.