// 1 CRITICAL · 4 ZERO-DAY · 8 CVE · 4 EXPLOIT · 1 ADVISORY NELLE ULTIME 24H
Integer overflow in QEMU virtio-gpu permette escalation locale da guest a host con CVSS 8.8. La patch upstream corregge la regressione introdotta per il supporto Win32.
CVE-2026-3886: QEMU virtio-gpu, escape guest-to-host

Una vulnerabilità nel driver virtio-gpu di QEMU consente a un attaccante con accesso minimale a una macchina virtuale di escalare i privilegi fino all'esecuzione di codice arbitrario sull'host fisico. Il coordinamento tra Trend Micro Zero Day Initiative e il team upstream di QEMU ha portato alla pubblicazione dell'advisory ZDI-26-332 e all'assegnazione del CVE-2026-3886 il 9 giugno 2026. Il punteggio CVSS 8.8 con scope changed segnala che il perimetro di impatto supera i confini della singola componente compromessa.

Punti chiave
  • La funzione calc_image_hostmem() nel driver virtio-gpu di QEMU contiene un integer overflow che consente escalation di privilegi locali da guest a host.
  • Il CVE-2026-3886 è classificato con CVSS 8.8 dal vettore AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H, secondo l'advisory ZDI-26-332.
  • La regressione deriva dal commit 9462ff4695aa, aggiunto per allocare risorse 2D condivisibili su Windows: ha rimosso un controllo implicito di pixman senza sostituirlo con validazione esplicita.
  • La patch di Marc-André Lureau (Red Hat) promuove il calcolo dello stride a uint64_t e introduce un controllo di overflow esplicito con ritorno booleano.
"The specific flaw exists within the virtio-gpu driver. The issue results from the lack of proper validation of user-supplied data, which can result in an integer overflow before allocating a buffer." — Advisory ZDI-26-332, Zero Day Initiative

Il meccanismo: da ottimizzazione Win32 a buco di sicurezza

L'analisi del codice, documentata nella patch upstream su patchew.org, ricostruisce una catena precisa. La funzione calc_image_hostmem() calcola la memoria necessaria per un'immagine moltiplicando larghezza e byte-per-pixel in una variabile intera a 32 bit. Quando il risultato supera il valore massimo rappresentabile, l'overflow produce una dimensione apparentemente piccola, che viene poi passata alle routine di allocazione.

Prima del commit 9462ff4695aa, la funzione qemu_pixman_image_new_shareable() veniva invocata con bits=NULL. In questa configurazione, la libreria pixman eseguiva internamente un controllo sull'overflow dello stride. Il commit modificò il driver per supportare risorse grafiche condivisibili nell'ambiente Win32, permettendo che bits fosse fornito dall'utente. Secondo il messaggio della patch firmato da Marc-André Lureau: "Since commit 9462ff4695aa, the 'bits' argument can be provided and the check is no longer applied."

L'eliminazione del controllo implicito non fu accompagnata da una validazione esplicita in calc_image_hostmem(). Il calcolo ((width * bpp + 0x1f) >> 5) * sizeof(uint32_t) rimase confinato in un tipo intero a 32 bit, rendendo l'overflow arithmeticamente possibile.

La correzione: promozione a uint64_t e controllo esplicito

La patch modificata da Red Hat e integrata upstream ridefinisce calc_image_hostmem() con tipo di ritorno bool invece di uint32_t. Il parametro di output hostmem diventa opzionale, e il calcolo dello stride viene eseguito in uint64_t: "uint64_t stride = (((uint64_t)width * bpp + 0x1f) >> 5) * sizeof(uint32_t);". Un confronto esplicito verifica che stride non ecceda INT_MAX prima di procedere. La funzione restituisce false in caso di condizioni anomale, interrompendo la catena di allocazione.

La modifica si estende su 25 righe aggiunte e 11 rimosse nel file hw/display/virtio-gpu.c, mantenendo la compatibilità con il percorso di codice per Win32 ma chiudendo la finestra di manipolazione. La firma "Reported-by: Zero Day Initiative" nel changelog del repository QEMU conferma la provenienza della segnalazione.

Profilo di rischio e perimetro d'attacco

L'advisory ZDI-26-332 qualifica la vulnerabilità come locale e richiede che l'attaccante disponga già della capacità di eseguire codice con privilegi limitati sulla macchina virtuale target. Non si tratta di un accesso remoto o di una compromissione zero-click. Tuttavia, il vettore CVSS include S:C (scope changed), indicando che l'impatto della violazione supera i confini della singola VM compromessa e si estende all'ambiente ospitante.

Per operatori di cloud pubblico e infrastrutture multi-tenant, questa caratteristica è critica. Una VM malevola o compromessa in un cluster KVM/QEMU condivide lo spazio di indirizzamento del processo host attraverso il meccanismo di virtualizzazione hardware. L'esecuzione di codice arbitrario nel contesto dell'host, come documentato nell'advisory ZDI, annulla la barriera di isolamento fondamentale del modello cloud.

Il periodo tra la segnalazione originale a ZDI (15 ottobre 2025) e la pubblicazione coordinata (9 giugno 2026) indica una finestra di gestione volutamente estesa, tipica del coordinated disclosure per componenti infrastrutturali ampiamente distribuiti. La patch era disponibile upstream prima della divulgazione pubblica.

Cosa fare adesso

  • Verificare la presenza di QEMU con driver virtio-gpu attivo negli stack di virtualizzazione e identificare la versione del pacchetto hw/display/virtio-gpu.c.
  • Applicare la patch upstream che modifica calc_image_hostmem() con ritorno bool e calcolo uint64_t, o aggiornare al primo rilascio stabile che la incorpori.
  • Rivedere le policy di deployment per le immagini guest Win32 che utilizzano risorse 2D condivisibili, percorso di codice che attiva il flusso vulnerabile.
  • Auditare i log di allocazione memoria del sottosistema virtio-gpu per anomalie pregresse che possano indicare tentativi di trigger dell'overflow.

Perche la regressione conta più del singolo bug

Il caso CVE-2026-3886 non è un errore di programmazione isolato ma un pattern ricorrente nell'evoluzione del software sistemico. Il commit 9462ff4695aa risolveva un problema legittimo — il rendering condivisibile su Windows — e lo faceva con codice apparentemente robusto. La rimozione del controllo implicito di pixman, tuttavia, non attivò alcun allarme nel processo di review perché il controllo era mascherato nella libreria esterna, non esplicitato nel contratto della funzione.

La patch correttiva non si limita a chiudere il buco: documenta il perché, collegando direttamente la vulnerabilità al cambiamento precedente. Questo livello di trasparenza nel changelog è raro e prezioso. Per gli operatori che gestiscono fork o backport di QEMU, rappresenta un criterio di prioritizzazione oggettivo.

Il ruolo di Xiaobye del DEVCORE Research Team nella scoperta e la rapidità del percorso ZDI-QEMU confermano che il canale di disclosure coordinata funziona per componenti open-source critici. Ciò non attenua il rischio per gli ambienti che non tracciano le advisories di sicurezza dei loro hypervisor con la stessa attenzione riservata ai sistemi operativi guest.

Le informazioni sono state verificate sulle fonti citate e aggiornate al momento della pubblicazione.

Fonti


Fonti e riferimenti
  1. zerodayinitiative.com
  2. cve.org
  3. nvd.nist.gov
  4. patchew.org