« Volver al listado

CVE-2026-19575

Estado: Pendiente de análisisAlta (7.8)—

El manejador de verificación en modo de usuario para la llamada al sistema device_deinit(), z_vrfy_device_deinit() en kernel/device.c, validó su argumento dev con K_SYSCALL_OBJ_INIT(dev, K_OBJ_ANY). k_object_validate() cortocircuita su comparación de tipos cuando el tipo solicitado es K_OBJ_ANY, por lo que la comprobación se reducía a "este puntero es la dirección base de algún objeto del kernel al que se le ha concedido acceso al hilo que realiza la llamada" — el tipo real del objeto nunca se comparó, y K_SYSCALL_OBJ_INIT también omite la comprobación del estado de inicialización. Los manejadores hermanos z_vrfy_device_init() y z_vrfy_device_is_ready() ya utilizaban K_OBJ_DRIVER_ANY y no se vieron afectados.

Leer descripción completaMostrar menos

Un hilo que se ejecuta en modo de usuario puede, por lo tanto, pasar cualquier objeto del kernel sobre el que tenga permiso — más útilmente un objeto de pila de hilo obtenido de la llamada al sistema k_thread_stack_alloc() o un K_THREAD_STACK definido estáticamente al que se le concedió acceso para generar un hilo de usuario hijo — cuya memoria de respaldo es escribible desde modo de usuario. z_impl_device_deinit() luego interpreta esos bytes escritos por el atacante como una struct device: desreferencia el puntero de estado leído del objeto, llama al puntero de función leído de ops.deinit, y en caso de éxito escribe a través de state nuevamente. El resultado es una llamada indirecta a una dirección arbitraria ejecutada en modo supervisor, más una lectura del kernel arbitraria y una única escritura de un byte en el kernel.

La explotación le da a un hilo local sin privilegios ejecución de código completa en el kernel, derrotando completamente el límite de aislamiento CONFIG_USERSPACE; un intento menos preciso genera una falta en modo supervisor y un bloqueo del sistema. El defecto solo es accesible en compilaciones que habiliten tanto CONFIG_USERSPACE como CONFIG_DEVICE_DEINIT_SUPPORT — con la compatibilidad de desinicio deshabilitada, z_impl_device_deinit() devuelve -ENOTSUP sin desreferenciar nunca el puntero. En v4.2.x y v4.3.x, CONFIG_DEVICE_DEINIT_SUPPORT predeterminado a y, por lo que cada compilación de CONFIG_USERSPACE de esos lanzamientos se ve expuesta a menos que la opción se haya desactivado explícitamente. Desde v4.4.0 la opción es de participación voluntaria (sin predeterminado, y no seleccionada por ningún subsistema del árbol), por lo que una compilación v4.4.x se expone solo si habilita la opción explícitamente. La línea v4.2 ya no se mantiene y no recibe ningún backport.

La corrección cambia la comprobación del objeto a K_OBJ_DRIVER_ANY, lo que restringe el argumento al rango de tipo de objeto de controlador generado por compilación (K_OBJ_DRIVER_FIRST..K_OBJ_DRIVER_LAST) — las instancias reales de struct device colocadas por el vinculador — por lo que los campos state y ops.deinit están nuevamente controlados por el kernel.

Traducción automática del texto original de NVD (en inglés).

CVSS

Probabilidad de explotación (EPSS)

EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).

🎯 Técnicas ATT&CK

Cómo se explota esta vulnerabilidad y qué consigue el atacante, en el lenguaje de MITRE ATT&CK.

AV:L + PR:L sin UI permite escalada local; el atacante consigue ejecución de código en modo supervisor dereferenciar punteros de función controlados desde memoria escribible en user mode.

Inferido por nuestro agente de análisis a partir de la descripción oficial, el vector CVSS y la CWE, y comprobado por un supervisor. Puede contener errores.

🛡️ Mitigaciones ATT&CK que cubren estas técnicas

Tecnologías afectadas (1)

⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.

CWE

Referencias

JSON original (NVD)

Mostrar
{
  "id": "CVE-2026-19575",
  "cveTags": [],
  "metrics": {
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "id": "CVE-2026-19575",
          "role": "CISA Coordinator",
          "options": [
            {
              "exploitation": "none"
            },
            {
              "automatable": "no"
            },
            {
              "technicalImpact": "total"
            }
          ],
          "version": "2.0.3",
          "timestamp": "2026-10-09T17:53:21.684305Z"
        }
      }
    ],
    "cvssMetricV31": [
      {
        "type": "Secondary",
        "source": "vulnerabilities@zephyrproject.org",
        "cvssData": {
          "scope": "UNCHANGED",
          "version": "3.1",
          "baseScore": 7.8,
          "attackVector": "LOCAL",
          "baseSeverity": "HIGH",
          "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
          "integrityImpact": "HIGH",
          "userInteraction": "NONE",
          "attackComplexity": "LOW",
          "availabilityImpact": "HIGH",
          "privilegesRequired": "LOW",
          "confidentialityImpact": "HIGH"
        },
        "impactScore": 5.9,
        "exploitabilityScore": 1.8
      }
    ]
  },
  "affected": [
    {
      "source": "vulnerabilities@zephyrproject.org",
      "affectedData": [
        {
          "vendor": "zephyrproject",
          "product": "zephyr",
          "versions": [
            {
              "status": "affected",
              "version": "4.2.0",
              "versionType": "semver",
              "lessThanOrEqual": "4.4.2"
            }
          ],
          "packageName": "zephyr",
          "programFiles": [
            "kernel/device.c"
          ],
          "collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
          "defaultStatus": "unaffected",
          "programRoutines": [
            {
              "name": "z_impl_device_deinit"
            },
            {
              "name": "z_vrfy_device_deinit"
            }
          ]
        }
      ]
    }
  ],
  "published": "2026-10-09T08:16:55.057",
  "references": [
    {
      "url": "https://github.com/zephyrproject-rtos/zephyr/commit/1036694889ab33996db41b4141ddf66aa786d267",
      "source": "vulnerabilities@zephyrproject.org"
    },
    {
      "url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-j9m4-fr5f-49wm",
      "source": "vulnerabilities@zephyrproject.org"
    }
  ],
  "vulnStatus": "Awaiting Analysis",
  "weaknesses": [
    {
      "type": "Secondary",
      "source": "vulnerabilities@zephyrproject.org",
      "description": [
        {
          "lang": "en",
          "value": "CWE-843"
        }
      ]
    }
  ],
  "descriptions": [
    {
      "lang": "en",
      "value": "The user-mode verification handler for the device_deinit() system call, z_vrfy_device_deinit() in kernel/device.c, validated its dev argument with K_SYSCALL_OBJ_INIT(dev, K_OBJ_ANY). k_object_validate() short-circuits its type comparison when the requested type is K_OBJ_ANY, so the check reduced to \"this pointer is the base address of some kernel object the calling thread has been granted\" — the object's actual type was never compared, and K_SYSCALL_OBJ_INIT also skips the initialization-state check. The sibling handlers z_vrfy_device_init() and z_vrfy_device_is_ready() already used K_OBJ_DRIVER_ANY and were unaffected.\n\nA thread running in user mode can therefore pass any kernel object it holds permission on — most usefully a thread stack object obtained from the k_thread_stack_alloc() syscall or a statically defined K_THREAD_STACK it was granted in order to spawn a child user thread — whose backing memory is writable from user mode. z_impl_device_deinit() then interprets those attacker-written bytes as a struct device: it dereferences the state pointer read out of the object, calls the function pointer read out of ops.deinit, and on success writes through state again. The result is an indirect call to an arbitrary address executed in supervisor mode, plus an arbitrary kernel read and a single-byte kernel write.\n\nExploitation gives a local unprivileged thread full kernel code execution, defeating the CONFIG_USERSPACE isolation boundary entirely; a less precise attempt yields a supervisor-mode fault and a system crash. The defect is only reachable in builds that enable both CONFIG_USERSPACE and CONFIG_DEVICE_DEINIT_SUPPORT — with de-initialization support disabled, z_impl_device_deinit() returns -ENOTSUP without ever dereferencing the pointer. In v4.2.x and v4.3.x, CONFIG_DEVICE_DEINIT_SUPPORT defaulted to y, so every CONFIG_USERSPACE build of those releases is exposed unless the option was explicitly turned off. From v4.4.0 the option is opt-in (no default, and not selected by any in-tree subsystem), so a v4.4.x build is exposed only if it enables the option explicitly. The v4.2 line is no longer maintained and receives no backport.\n\nThe fix changes the object check to K_OBJ_DRIVER_ANY, which constrains the argument to the build-generated driver object type range (K_OBJ_DRIVER_FIRST..K_OBJ_DRIVER_LAST) — the real struct device instances placed by the linker — so the state and ops.deinit fields are once again kernel-controlled."
    }
  ],
  "lastModified": "2026-10-09T18:17:08.263",
  "sourceIdentifier": "vulnerabilities@zephyrproject.org"
}