CVE-2026-10682

The userspace verifier z_vrfy_log_filter_set() for the log_filter_set syscall in subsys/logging/log_mgmt.c performed a signed comparison against the int16_t src_id parameter: src_id < (int16_t)log_src_cnt_get(domain_id). Any negative value for src_id (e.g. -1) trivially satisfied this check and was forwarded into z_impl_log_filter_set, where it propagated to filter_set() and ultimately to get_dynamic_filter(), which uses source_id as an unsigned index into the linker-section array &TYPE_SECTION_START(log_dynamic)[source_id].filters. After implicit conversion through uint32_t, an int16_t -1 becomes 0xFFFFFFFF, indexing log_dynamic far out of bounds and causing the kernel to perform an OOB read and an OOB read-modify-write (LOG_FILTER_SLOT_GET/SET) against memory adjacent to the log_dynamic section. The written value is a constrained 3-bit log level slot within the targeted 32-bit word, but the target address is attacker-chosen (a small negative offset from log_dynamic) and the write occurs in supervisor mode following a syscall from an unprivileged user thread, providing a kernel memory-corruption / privilege-escalation primitive. The defect is reachable on any build with CONFIG_USERSPACE=y and CONFIG_LOG_RUNTIME_FILTERING=y. Present from Zephyr v3.3.0 through v4.4.1. The fix replaces the signed bound check with an unsigned comparison: (uint32_t)src_id < log_src_cnt_get(domain_id), which correctly rejects negative inputs.
Configurations

Configuration 1 (hide)

cpe:2.3:o:zephyrproject:zephyr:*:*:*:*:*:*:*:*

History

24 Oct 2026, 13:10

Type Values Removed Values Added
Summary
  • (es) El verificador de espacio de usuario z_vrfy_log_filter_set() para la llamada al sistema log_filter_set en subsys/logging/log_mgmt.c realizó una comparación con signo contra el parámetro int16_t src_id: src_id < (int16_t)log_src_cnt_get(domain_id). Cualquier valor negativo para src_id (p. ej., -1) satisfizo trivialmente esta verificación y fue reenviado a z_impl_log_filter_set, donde se propagó a filter_set() y finalmente a get_dynamic_filter(), que utiliza source_id como un índice sin signo en el array de sección del enlazador &TYPE_SECTION_START(log_dynamic)[source_id].filters. Después de la conversión implícita a través de uint32_t, un int16_t -1 se convierte en 0xFFFFFFFF, indexando log_dynamic muy fuera de los límites y causando que el kernel realice una lectura fuera de límites y una lectura-modificación-escritura fuera de límites (LOG_FILTER_SLOT_GET/SET) contra la memoria adyacente a la sección log_dynamic. El valor escrito es una ranura de nivel de registro de 3 bits restringida dentro de la palabra de 32 bits objetivo, pero la dirección objetivo es elegida por el atacante (un pequeño desplazamiento negativo desde log_dynamic) y la escritura ocurre en modo supervisor después de una llamada al sistema de un hilo de usuario sin privilegios, proporcionando una primitiva de corrupción de memoria del kernel / escalada de privilegios. El defecto es alcanzable en cualquier compilación con CONFIG_USERSPACE=y y CONFIG_LOG_RUNTIME_FILTERING=y. Presente desde Zephyr v3.3.0 hasta v4.4.1. La solución reemplaza la verificación de límites con signo con una comparación sin signo: (uint32_t)src_id < log_src_cnt_get(domain_id), que rechaza correctamente las entradas negativas.

Information

Published : 2026-07-27 19:17

Updated : 2026-10-24 13:10


NVD link : CVE-2026-10682

Mitre link : CVE-2026-10682

CVE.ORG link : CVE-2026-10682


JSON object : View

Products Affected

zephyrproject

  • zephyr
CWE
CWE-787

Out-of-bounds Write