Vulnerabilidad en Linux (CVE-2026-23086)
Fecha de publicación:
04/02/2026
En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br />
<br />
vsock/virtio: limitar el crédito TX al tamaño del búfer local<br />
<br />
Los transportes virtio derivan su crédito TX directamente de peer_buf_alloc, que se establece a partir del valor SO_VM_SOCKETS_BUFFER_SIZE del punto final remoto.<br />
<br />
En el lado del host, esto significa que la cantidad de datos que estamos dispuestos a encolar para una conexión se escala por un tamaño de búfer elegido por el invitado, en lugar de la propia configuración vsock del host. Un invitado malicioso puede anunciar un búfer grande y leer lentamente, haciendo que el host asigne una cantidad correspondientemente grande de memoria sk_buff.<br />
Lo mismo ocurriría en el invitado con un host malicioso, ya que los transportes virtio comparten la misma base de código.<br />
<br />
Introducir una pequeña función auxiliar, virtio_transport_tx_buf_size(), que devuelve min(peer_buf_alloc, buf_alloc), y usarla dondequiera que consumamos peer_buf_alloc.<br />
<br />
Esto asegura que la ventana TX efectiva esté limitada tanto por el búfer anunciado del par como por nuestro propio buf_alloc (ya ajustado a buffer_max_size a través de SO_VM_SOCKETS_BUFFER_MAX_SIZE), de modo que un par remoto no pueda forzar al otro a encolar más datos de los permitidos por su propia configuración vsock.<br />
<br />
En un host Ubuntu 22.04 sin parchear (~64 GiB de RAM), ejecutar una PoC con 32 conexiones vsock de invitado anunciando 2 GiB cada una y leyendo lentamente llevó Slab/SUnreclaim de ~0.5 GiB a ~57 GiB; el sistema solo se recuperó después de terminar el proceso QEMU. Dicho esto, si la memoria de QEMU está limitada con cgroups, la memoria máxima utilizada estará limitada.<br />
<br />
Con este parche aplicado:<br />
<br />
Antes:<br />
MemFree: ~61.6 GiB<br />
Slab: ~142 MiB<br />
SUnreclaim: ~117 MiB<br />
<br />
Después de 32 conexiones de alto crédito:<br />
MemFree: ~61.5 GiB<br />
Slab: ~178 MiB<br />
SUnreclaim: ~152 MiB<br />
<br />
Solo un aumento de ~35 MiB en Slab/SUnreclaim, sin OOM del host, y el invitado permanece receptivo.<br />
<br />
Compatibilidad con transportes no virtio:<br />
<br />
- VMCI utiliza los controles de búfer AF_VSOCK para dimensionar sus pares de cola por socket basándose en los valores locales vsk-&gt;buffer_*; el lado remoto no puede ampliar esas colas más allá de lo que configuró el punto final local.<br />
<br />
- El transporte vsock de Hyper-V utiliza búferes de anillo VMBus de tamaño fijo y un límite de MTU; no hay un campo de crédito controlado por el par comparable a peer_buf_alloc, y el punto final remoto no puede impulsar la memoria del kernel en tránsito por encima de esos tamaños de anillo.<br />
<br />
- La ruta de bucle invertido reutiliza virtio_transport_common.c, por lo que naturalmente sigue la misma semántica que el transporte virtio.<br />
<br />
Este cambio se limita a virtio_transport_common.c y por lo tanto afecta a virtio-vsock, vhost-vsock y loopback, poniéndolos en línea con el comportamiento de &#39;ventana remota intersectada con política local&#39; que VMCI y Hyper-V ya tienen efectivamente.<br />
<br />
[Stefano: pequeños ajustes después de cambiar el parche anterior]<br />
[Stefano: ajustar el mensaje de commit]
Gravedad: Pendiente de análisis
Última modificación:
06/02/2026