Saltar al contenido
DUPIN
ALERTAS · EN VIVO
Contacto

VULNERABILIDADDetectada 03 NOV · 12:15

CVE-2026-85035 Uso después de liberar por cola de mensajes dinámica retenida por el filtro RX de CAN

La llamada al sistema can_add_rx_filter_msgq() instala un filtro RX de CAN cuyo callback recibe el puntero struct k_msgq * del llamador como user_data, y el driver del controlador lo desreferencia en la ruta RX cada vez que llega una trama coincidente. El verificador z_vrfy_can_add_rx_filter_msgq() solo validaba la cola con K_SYSCALL_OBJ(), una comprobación puntual que no considera el tiempo de vida del objeto. En builds con CONFIG_USERSPACE=y y CONFIG_DYNAMIC_OBJECTS=y, un hilo no privilegiado en modo usuario…

8.8ALTA

CVSS 3.1

  • Probabilidad de explotación · EPSS del 09/110,2 % · percentil 13
  • Explotada activamenteNo confirmada
  • Exploit públicoNo conocido

Afectados

  • zephyrproject zephyr

    desde 1.14.0 hasta antes de 4.3.2desde 4.4.0 hasta antes de 4.5.0

Qué hacer

  1. Verificá si usás zephyr y en qué versión.
  2. Actualizá a la versión corregida que indique el fabricante en su aviso o aplicá su mitigación.
  3. Revisá registros y accesos de los sistemas expuestos para descartar un uso previo.

Calculadora CVSS

CVSS 3.1 · 8.8 ALTA

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

  • Vector de ataqueLocal
  • Complejidad del ataqueBaja
  • Privilegios requeridosBajos
  • Interacción del usuarioNinguna
  • AlcanceCambiado
  • ConfidencialidadAlta
  • IntegridadAlta
  • DisponibilidadAlta

Descripción original

The can_add_rx_filter_msgq() system call installs a CAN RX filter whose callback (can_msgq_put() in drivers/can/can_common.c) is handed the caller's struct k_msgq * as user_data. The controller driver stores that raw pointer in its filter table and dereferences it from the RX path every time a matching frame arrives. The system call verifier z_vrfy_can_add_rx_filter_msgq() in drivers/can/can_handlers.c validated the queue only with K_SYSCALL_OBJ(), which is a point-in-time check of type, initialization and caller permission and says nothing about the object's lifetime. On a build with CONFIG_USERSPACE=y and CONFIG_DYNAMIC_OBJECTS=y, an unprivileged user-mode thread that has been granted access to a CAN device can obtain a message queue whose lifetime it fully controls: k_object_alloc(K_OBJ_MSGQ) followed by k_msgq_alloc_init(). The lifetime of such an object is driven solely by its permission bitmask, and a pointer retained by the kernel is not represented there. After registering the filter, the thread calls k_object_release() — or simply terminates — and unref_check() frees the struct k_msgq storage while the CAN driver still holds the pointer. The next matching CAN frame causes k_msgq_put() to run in supervisor context against freed memory that the attacker can have groomed with another kernel allocation: the frame payload is memcpy()d through the reused block's write_ptr, and the queue's wait_q (and poll_events under CONFIG_POLL) list nodes are manipulated. This yields kernel-heap corruption reachable from a user-mode thread, defeating the isolation CONFIG_USERSPACE is intended to provide; the same dangling pointer also arises benignly when an application thread exits without calling can_remove_rx_filter(). The fix validates the queue with K_SYSCALL_OBJ_STATIC(), which additionally rejects objects carrying K_OBJ_FLAG_ALLOC, so only statically defined queues (CAN_MSGQ_DEFINE()) may be registered from user mode. Supervisor-mode callers bypass the verifier and must themselves keep the queue valid until the filter is removed.

Referencias (2)

Resumen traducido automáticamente de la descripción original. Fuente: Nureq Monitor. Cómo funciona.

DUPIN · CONTACTO

Contanos tu caso

El mensaje ya va armado: podés cambiarlo.

También podés escribir a [email protected]. Usamos tus datos solo para responderte.