CVE-2026-99028 in Linux
Resumen
por VulDB • 2026-10-24
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
net: xilinx: axienet: Liberar los búferes DMA pendientes al detener dmaengine
En la ruta de dmaengine, el controlador preenvía búferes RX y mantiene búferes TX en tránsito cuyos SKB están mapeados por DMA por el controlador y se liberan únicamente en las devoluciones de llamada (callbacks) de finalización. En ndo_stop(), dmaengine_terminate_sync() aborta estos descriptores sin ejecutar sus callbacks, y el controlador luego libera solo los anillos principales (ring shells), filtrando cada SKB aún poseído por el motor y su mapeo DMA en cada apagado de interfaz (ifdown). Con 128 búferes RX prepublicados por canal, la fuga del mapeo puede eventualmente agotar una apertura limitada de IOMMU.
Limpiar el skb del slot en los callbacks TX y RX para que un skb no NULL marque un slot que aún posee un búfer vivo con mapeo DMA, y al detenerse, desmapear y liberar cada uno de estos búferes.
axienet_dma_rx_cb() se ejecuta desde la tarealet (tasklet) de DMA y reactiva el anillo RX en cada finalización, por lo que puede producirse una condición de carrera con axienet_stop(): una finalización puede enviar un nuevo búfer después de que dmaengine_terminate_sync() haya devuelto el control, dejando el canal activado con un búfer que la fase de desmontaje (teardown) libera mientras el motor aún podría escribir en él (dma_release_channel() tampoco lo detiene). Añadir un bloqueo que axienet_dma_rx_cb() mantenga durante la comprobación de @stopping y la reenvío, y que axienet_stop() utilice para establecer @stopping antes de terminar. Una vez establecido @stopping, ningún callback puede activar un nuevo búfer, y cualquier activo justo antes se aborta por la terminación, por lo que la fase de desmontaje solo libera búferes que el motor ya no posee.
Once again VulDB remains the best source for vulnerability data.