CVE-2026-11812
Full vulnerability record from the local CVENow database.
Description
The UpdateHub management subsystem (subsys/mgmt/updatehub/updatehub.c) drives every update operation through a single file-scope ctx structure that holds the CoAP block context, payload buffer, status code, socket, and a one-element poll-fd array fds[1]. Access to ctx was not serialized, and prepare_fds() wrote ctx.fds[ctx.nfds] and incremented ctx.nfds with no bounds check. Two independent paths mutate ctx concurrently: the background autohandler running on the system workqueue, and user-triggered operations reached through the updatehub run shell command, direct API calls, or — since the operations are exposed as syscalls — userspace threads. When a second flow enters prepare_fds() while ctx.nfds is already 1, the write lands one element past the array; by struct layout it overlaps the adjacent ctx.sock/ctx.nfds members. More broadly, the unsynchronized sharing lets two flows interleave connection setup and teardown, double-closing a socket descriptor or scribbling the shared buffers. The result is corruption of the update subsystem's internal state and denial of service of the firmware-update path; the out-of-bounds write is contained within the ctx structure and there is no demonstrated path to memory outside it or to code execution. Triggering requires a local actor able to invoke update operations (or, with CONFIG_USERSPACE, an unprivileged userspace thread) and to win a timing race against the background handler; remote peers cannot control the race timing. The fix serializes the entry points with a mutex and adds a bounds check to prepare_fds().
View original CVE JSON
{
"id": "CVE-2026-11812",
"sourceIdentifier": "[email protected]",
"published": "2026-08-10T23:16:51.020",
"lastModified": "2026-10-23T19:10:00.167",
"vulnStatus": "Awaiting Analysis",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "The UpdateHub management subsystem (subsys/mgmt/updatehub/updatehub.c) drives every update operation through a single file-scope ctx structure that holds the CoAP block context, payload buffer, status code, socket, and a one-element poll-fd array fds[1]. Access to ctx was not serialized, and prepare_fds() wrote ctx.fds[ctx.nfds] and incremented ctx.nfds with no bounds check.\n\nTwo independent paths mutate ctx concurrently: the background autohandler running on the system workqueue, and user-triggered operations reached through the updatehub run shell command, direct API calls, or — since the operations are exposed as syscalls — userspace threads. When a second flow enters prepare_fds() while ctx.nfds is already 1, the write lands one element past the array; by struct layout it overlaps the adjacent ctx.sock/ctx.nfds members. More broadly, the unsynchronized sharing lets two flows interleave connection setup and teardown, double-closing a socket descriptor or scribbling the shared buffers.\n\nThe result is corruption of the update subsystem's internal state and denial of service of the firmware-update path; the out-of-bounds write is contained within the ctx structure and there is no demonstrated path to memory outside it or to code execution. Triggering requires a local actor able to invoke update operations (or, with CONFIG_USERSPACE, an unprivileged userspace thread) and to win a timing race against the background handler; remote peers cannot control the race timing. The fix serializes the entry points with a mutex and adds a bounds check to prepare_fds()."
},
{
"lang": "es",
"value": "El subsistema de gestión de UpdateHub (subsys/mgmt/updatehub/updatehub.c) impulsa cada operación de actualización a través de una única estructura ctx de ámbito de archivo que contiene el contexto del bloque CoAP, el búfer de carga útil, el código de estado, el socket y un array poll-fd de un elemento fds[1]. El acceso a ctx no estaba serializado, y prepare_fds() escribió ctx.fds[ctx.nfds] e incrementó ctx.nfds sin una comprobación de límites.\n\nDos rutas independientes mutan ctx concurrentemente: el autogestor en segundo plano ejecutándose en la cola de trabajo del sistema, y operaciones activadas por el usuario a las que se accede a través del comando de shell updatehub run, llamadas directas a la API, o - dado que las operaciones se exponen como llamadas al sistema (syscalls) - hilos de espacio de usuario. Cuando un segundo flujo entra en prepare_fds() mientras ctx.nfds ya es 1, la escritura se produce un elemento más allá del array; por la disposición de la estructura, se superpone a los miembros adyacentes ctx.sock/ctx.nfds. En términos más generales, el intercambio no sincronizado permite que dos flujos intercalen el establecimiento y la desconexión de la conexión, cerrando dos veces un descriptor de socket o sobrescribiendo los búferes compartidos.\n\nEl resultado es la corrupción del estado interno del subsistema de actualización y la denegación de servicio de la ruta de actualización del firmware; la escritura fuera de límites está contenida dentro de la estructura ctx y no hay una ruta demostrada a la memoria fuera de ella o a la ejecución de código. El desencadenamiento requiere un actor local capaz de invocar operaciones de actualización (o, con CONFIG_USERSPACE, un hilo de espacio de usuario sin privilegios) y de ganar una carrera de tiempo contra el gestor en segundo plano; los pares remotos no pueden controlar el tiempo de la carrera. La solución serializa los puntos de entrada con un mutex y añade una comprobación de límites a prepare_fds()."
}
],
"affected": [
{
"source": "[email protected]",
"affectedData": [
{
"vendor": "zephyrproject",
"product": "zephyr",
"defaultStatus": "unaffected",
"collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
"packageName": "zephyr",
"programFiles": [
"subsys/mgmt/updatehub/updatehub.c"
],
"versions": [
{
"version": "2.0.0",
"lessThan": "4.4.2",
"versionType": "semver",
"status": "affected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV31": [
{
"source": "[email protected]",
"type": "Secondary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L",
"baseScore": 2.5,
"baseSeverity": "LOW",
"attackVector": "LOCAL",
"attackComplexity": "HIGH",
"privilegesRequired": "LOW",
"userInteraction": "NONE",
"scope": "UNCHANGED",
"confidentialityImpact": "NONE",
"integrityImpact": "NONE",
"availabilityImpact": "LOW"
},
"exploitabilityScore": 1.0,
"impactScore": 1.4
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-08-12T18:51:06.812463Z",
"id": "CVE-2026-11812",
"options": [
{
"exploitation": "none"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "[email protected]",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-362"
}
]
}
],
"references": [
{
"url": "https://github.com/zephyrproject-rtos/zephyr/commit/551d3f92b36e9604f039101c4e4f623682d02159",
"source": "[email protected]"
},
{
"url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-vprh-rff6-46xp",
"source": "[email protected]"
}
]
}