CVE-2026-31769

In the Linux kernel, the following vulnerability has been resolved: gpib: fix use-after-free in IO ioctl handlers The IBRD, IBWRT, IBCMD, and IBWAIT ioctl handlers use a gpib_descriptor pointer after board->big_gpib_mutex has been released. A concurrent IBCLOSEDEV ioctl can free the descriptor via close_dev_ioctl() during this window, causing a use-after-free. The IO handlers (read_ioctl, write_ioctl, command_ioctl) explicitly release big_gpib_mutex before calling their handler. wait_ioctl() is called with big_gpib_mutex held, but ibwait() releases it internally when wait_mask is non-zero. In all four cases, the descriptor pointer obtained from handle_to_descriptor() becomes unprotected. Fix this by introducing a kernel-only descriptor_busy reference count in struct gpib_descriptor. Each handler atomically increments descriptor_busy under file_priv->descriptors_mutex before releasing the lock, and decrements it when done. close_dev_ioctl() checks descriptor_busy under the same lock and rejects the close with -EBUSY if the count is non-zero. A reference count rather than a simple flag is necessary because multiple handlers can operate on the same descriptor concurrently (e.g. IBRD and IBWAIT on the same handle from different threads). A separate counter is needed because io_in_progress can be cleared from unprivileged userspace via the IBWAIT ioctl (through general_ibstatus() with set_mask containing CMPL), which would allow an attacker to bypass a check based solely on io_in_progress. The new descriptor_busy counter is only modified by the kernel IO paths. The lock ordering is consistent (big_gpib_mutex -> descriptors_mutex) and the handlers only hold descriptors_mutex briefly during the lookup, so there is no deadlock risk and no impact on IO throughput.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*

History

11 Nov 2026, 21:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: gpib: corrección de uso después de liberación en los gestores ioctl de E/S Los gestores ioctl IBRD, IBWRT, IBCMD e IBWAIT usan un puntero gpib_descriptor después de que board -> big_gpib_mutex ha sido liberado. Un ioctl IBCLOSEDEV concurrente puede liberar el descriptor a través de close_dev_ioctl() durante esta ventana, causando un uso después de liberación. Los gestores de E/S (read_ioctl, write_ioctl, command_ioctl) liberan explícitamente big_gpib_mutex antes de llamar a su gestor. wait_ioctl() se llama con big_gpib_mutex retenido, pero ibwait() lo libera internamente cuando wait_mask es distinto de cero. En los cuatro casos, el puntero del descriptor obtenido de handle_to_descriptor() queda desprotegido. Esto se soluciona introduciendo un contador de referencias descriptor_busy solo para el kernel en la estructura gpib_descriptor. Cada gestor incrementa atómicamente descriptor_busy bajo file_priv -> descriptors_mutex antes de liberar el bloqueo, y lo decrementa al finalizar. close_dev_ioctl() comprueba descriptor_busy bajo el mismo bloqueo y rechaza el cierre con -EBUSY si el contador es distinto de cero. Es necesario un contador de referencias en lugar de un simple indicador porque múltiples gestores pueden operar sobre el mismo descriptor concurrentemente (por ejemplo, IBRD e IBWAIT en el mismo identificador desde hilos diferentes). Se necesita un contador separado porque io_in_progress puede borrarse desde el espacio de usuario sin privilegios a través del ioctl IBWAIT (mediante general_ibstatus() con set_mask conteniendo CMPL), lo que permitiría a un atacante eludir una comprobación basada únicamente en io_in_progress. El nuevo contador descriptor_busy solo es modificado por las rutas de E/S del kernel. El orden de bloqueo es consistente (big_gpib_mutex -> descriptors_mutex) y los gestores solo retienen descriptors_mutex brevemente durante la búsqueda, por lo que no hay riesgo de interbloqueo ni impacto en el rendimiento de E/S.

Information

Published : 2026-05-01 15:16

Updated : 2026-11-11 21:10


NVD link : CVE-2026-31769

Mitre link : CVE-2026-31769

CVE.ORG link : CVE-2026-31769


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-416

Use After Free