Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: net/mlx5e: evitar la liberación de búferes XSK obsoletos al reintentar el rellenado Cuando falla una redirección XDP hacia un socket AF_XDP porque su anillo RX está lleno, el núcleo XSK libera el búfer. Durante el rellenado por lotes posterior de una RQ cíclica legacy, mlx5e también libera el búfer XSK del WQE antes de asignar uno de reemplazo. Si ese rellenado solo tiene éxito parcial, un WQE que queda sin reemplazo conserva su puntero al búfer anterior. Mientras tanto, el búfer puede asignarse a otro WQE. Un reintento de rellenado posterior puede entonces liberar el búfer en uso a través del puntero obsoleto y publicar dos veces el mismo frame UMEM. Se marca el WQE como liberado inmediatamente después de la liberación en el lado del controlador. La marca ya se borra cuando se asigna un búfer de reemplazo, por lo que los reintentos de rellenado ya no liberan punteros obsoletos. La falla es silenciosa y no produce advertencias ni splat del kernel. Un reproductor independiente de libxsk zero-copy con RQ cíclica legacy, usando tráfico UDP de 64 bytes ofrecido a 12 Mpps, la detectó: la versión original se detuvo después de 2,854,914 paquetes en 4.094 segundos, con 4,542 eventos xdp_rx_ring_full y 64 errores de propiedad/doble publicación. Con este cambio, procesó 356,904,225 paquetes en 30 segundos pese a 571,405 eventos xdp_rx_ring_full, sin errores de propiedad ni de datos.
Qué hacer
Revisa si usas el producto afectado y en qué versión, y aplica la actualización o la mitigación que indique el aviso del fabricante. CISA no ha confirmado que se esté explotando; si eso cambia, esta ficha pasa a «explotada» y te avisamos en el boletín.
Versiones afectadas
- Linux Afectadas: 3f93f82988bc6b4104314bf9aa485d47fbb7e241 y anteriores a 32bbb870078d467479965c21bbc4960c57eea208 · 3f93f82988bc6b4104314bf9aa485d47fbb7e241 y anteriores a 34d1db2b18e1c1d189e34dd51923e031815f88e3 · 3f93f82988bc6b4104314bf9aa485d47fbb7e241 y anteriores a 639522e5056cade578a324acfa993ec6c9f7f5dc · 3f93f82988bc6b4104314bf9aa485d47fbb7e241 y anteriores a 655f47477054d19de3b138840be229a1a4490d0c · 3f93f82988bc6b4104314bf9aa485d47fbb7e241 y anteriores a e01620844c5c88b6fcf819d171df8e3976a0e76f
- Linux Afectadas: 6.4 No afectadas: 6.6.160 · 6.12.113 · 6.18.57 · 7.2.11 · 7.3
Según el registro de la vulnerabilidad en CVE.org, tal como lo publicó el fabricante. Confirma tu versión exacta en el aviso del fabricante.
Referencias
- Referencia en git.kernel.orggit.kernel.org/stable/c/32bbb870078d467479965c21bbc4960c57eea208
- Referencia en git.kernel.orggit.kernel.org/stable/c/34d1db2b18e1c1d189e34dd51923e031815f88e3
- Referencia en git.kernel.orggit.kernel.org/stable/c/639522e5056cade578a324acfa993ec6c9f7f5dc
- Referencia en git.kernel.orggit.kernel.org/stable/c/655f47477054d19de3b138840be229a1a4490d0c
- Referencia en git.kernel.orggit.kernel.org/stable/c/e01620844c5c88b6fcf819d171df8e3976a0e76f
Ver el texto original en inglés (CVE.org)
net/mlx5e: Prevent stale XSK buffer release on refill retry
In the Linux kernel, the following vulnerability has been resolved: net/mlx5e: Prevent stale XSK buffer release on refill retry When an XDP redirect to an AF_XDP socket fails because its RX ring is full, the XSK core frees the buffer. During the subsequent batched refill of a legacy cyclic RQ, mlx5e also releases the WQE's XSK buffer before allocating a replacement. If that refill succeeds only partially, a WQE left without a replacement retains its old buffer pointer. The buffer can meanwhile be allocated to another WQE. A later refill retry can then free the live buffer through the stale pointer and publish the same UMEM frame twice. Mark the WQE as released immediately after the driver-side free. The flag is already cleared when a replacement buffer is assigned, so refill retries no longer release stale pointers. The failure is silent and produces no kernel warning or splat. A standalone legacy cyclic-RQ zero-copy libxsk reproducer, using 64-byte UDP traffic offered at 12 Mpps, detected it: stock stopped after 2,854,914 packets in 4.094 seconds, with 4,542 xdp_rx_ring_full events and 64 ownership/double-publication errors. With this change it processed 356,904,225 packets in 30 seconds despite 571,405 xdp_rx_ring_full events, with no ownership or data errors.