CVE-2026-19939
La capa de señalización AVDTP activa un tiempo de espera de comando de 6 segundos (AVDTP_TIMEOUT) en avdtp_send_cmd() cada vez que el dispositivo local envía una solicitud AVDTP. Todos los manejadores de respuesta en subsys/bluetooth/host/classic/avdtp.c cancelan session->timeout_work antes de limpiar la solicitud pendiente, pero bt_avdtp_l2cap_disconnected() solo limpiaba session->req y dejaba el trabajo diferible armado.
Leer descripción completaMostrar menos
La estructura struct bt_avdtp es el primer miembro de struct bt_a2dp, cuyas instancias residen en un array estático por conexión, y a2dp_get_connection() en subsys/bluetooth/host/classic/a2dp.c borra una posición con memset() en cuanto session->br_chan.chan.conn es NULL, lo que la capa L2CAP provoca inmediatamente después de que regrese la función de retrollamada de desconexión.
Un par Bluetooth BR/EDR remoto provoca la condición abriendo el canal de señalización AVDTP, permitiendo que la aplicación local inicie un procedimiento AVDTP (el flujo estándar de A2DP invoca bt_a2dp_discover() desde la retrollamada de conexión), y después cerrando el canal de señalización sin responder y volviéndolo a abrir dentro del tiempo restante de espera. La reconexión llega a a2dp_accept() → a2dp_get_connection(), que pone a cero todo el struct bt_a2dp mientras la struct _timeout del elemento de trabajo sigue enlazada en la lista global de tiempos de espera del kernel. Tanto el instante de la desconexión como el de la reconexión los elige el atacante, por lo que no es necesario ganar ninguna carrera; se requiere un enlace BR/EDR cifrado y debe estar habilitado CONFIG_BT_A2DP (experimental).
Con el backend predeterminado CONFIG_TIMEOUT_BACKEND_DLIST, el kernel decide que un tiempo de espera está inactivo comprobando si su nodo de lista está enlazado; por tanto, tras el memset(), el kernel trata como libre un nodo que todavía figura en la lista global de tiempos de espera: la ruta de anuncio extrae un nodo cuyos enlaces y puntero de manejador son NULL, y el siguiente bt_work_reschedule() sobre la sesión reciclada vuelve a insertar el mismo nodo en una lista que ya lo contiene. La consecuencia es la corrupción de la única estructura de datos del kernel de la que dependen todos los temporizadores, las rodajas de tiempo y las suspensiones: escrituras a través de punteros de lista puestos a cero o obsoletos y una invocación de manejador NULL, lo que produce un fallo o bloqueo de todo el sistema y no un fallo confinado a la sesión A2DP.
La corrección cancela session->timeout_work al principio de bt_avdtp_l2cap_disconnected() y traslada k_work_init_delayable() desde avdtp_send_cmd() a las rutas de establecimiento de sesión bt_avdtp_connect() y bt_avdtp_l2cap_accept(), de modo que el elemento de trabajo esté siempre inicializado antes de que pueda ejecutarse una retrollamada de desconexión.
Traducción automática del texto original de NVD (en inglés).
CVSS
- Puntuación base
- 6.3
- Versión
- 3.1
- Vector
- CVSS:3.1/AV:A/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días
- 0.18 %
- Percentil entre todas las CVEs puntuadas
- 7
- Fecha de la puntuación
- 20/10/2026
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.
- Explotación
T1210Exploitation of Remote Serviceslateral movement85 % - Impacto principal
T1499.004Application or System Exploitationimpact85 %
El vector AV:A/PR:L/UI:N indica red adyacente con privilegios bajos; el texto describe corrupción de la lista de timers del kernel que provoca un crash o cuelgue de todo el sistema.
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
- CWE-825
Referencias
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-19939",
"cveTags": [],
"metrics": {
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-19939",
"role": "CISA Coordinator",
"options": [
{
"exploitation": "none"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"version": "2.0.3",
"timestamp": "2026-10-14T18:49:00.544306Z"
}
}
],
"cvssMetricV31": [
{
"type": "Secondary",
"source": "vulnerabilities@zephyrproject.org",
"cvssData": {
"scope": "UNCHANGED",
"version": "3.1",
"baseScore": 6.3,
"attackVector": "ADJACENT_NETWORK",
"baseSeverity": "MEDIUM",
"vectorString": "CVSS:3.1/AV:A/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H",
"integrityImpact": "LOW",
"userInteraction": "NONE",
"attackComplexity": "LOW",
"availabilityImpact": "HIGH",
"privilegesRequired": "LOW",
"confidentialityImpact": "NONE"
},
"impactScore": 4.2,
"exploitabilityScore": 2.1
}
]
},
"affected": [
{
"source": "vulnerabilities@zephyrproject.org",
"affectedData": [
{
"vendor": "zephyrproject",
"product": "zephyr",
"versions": [
{
"status": "affected",
"version": "3.7.0",
"versionType": "semver",
"lessThanOrEqual": "4.4.2"
}
],
"packageName": "zephyr",
"programFiles": [
"subsys/bluetooth/host/classic/avdtp.c"
],
"collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
"defaultStatus": "unaffected",
"programRoutines": [
{
"name": "bt_avdtp_l2cap_disconnected"
}
]
}
]
}
],
"published": "2026-10-13T17:17:39.937",
"references": [
{
"url": "https://github.com/zephyrproject-rtos/zephyr/commit/a10d18c3be9d1a968574dbfbce6baee58ea398e8",
"source": "vulnerabilities@zephyrproject.org"
},
{
"url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-9mww-f3h4-mq95",
"source": "vulnerabilities@zephyrproject.org"
}
],
"vulnStatus": "Awaiting Analysis",
"weaknesses": [
{
"type": "Secondary",
"source": "vulnerabilities@zephyrproject.org",
"description": [
{
"lang": "en",
"value": "CWE-825"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "The AVDTP signalling layer arms a 6-second command timeout (AVDTP_TIMEOUT) in avdtp_send_cmd() whenever the local device issues an AVDTP request. Every response handler in subsys/bluetooth/host/classic/avdtp.c cancels session->timeout_work before clearing the pending request, but bt_avdtp_l2cap_disconnected() only cleared session->req and left the delayable work armed. The struct bt_avdtp session is the first member of struct bt_a2dp, whose instances live in a static per-connection array, and a2dp_get_connection() in subsys/bluetooth/host/classic/a2dp.c wipes a slot with memset() as soon as session->br_chan.chan.conn is NULL — which the L2CAP layer arranges immediately after the disconnect callback returns.\n\nA remote Bluetooth BR/EDR peer triggers the condition by opening the AVDTP signalling channel, letting the local application issue an AVDTP procedure (the standard A2DP flow issues bt_a2dp_discover() from the connected callback), then tearing the signalling channel down without responding and re-opening it within the remaining timeout window. The reconnect reaches a2dp_accept() → a2dp_get_connection(), which zeroes the whole struct bt_a2dp while the work item's struct _timeout is still linked into the kernel's global timeout list. Both the disconnect and the reconnect instants are chosen by the attacker, so no race has to be won; an encrypted BR/EDR link is required, and CONFIG_BT_A2DP (experimental) must be enabled.\n\nWith the default CONFIG_TIMEOUT_BACKEND_DLIST backend the kernel decides a timeout is inactive by testing whether its list node is linked, so after the memset() the kernel treats a node that is still on the global timeout list as free: the announce path pops a node whose links and handler pointer are NULL, and the next bt_work_reschedule() on the recycled session re-inserts the same node into a list that already contains it. The consequence is corruption of the single kernel data structure every timer, timeslice and sleep depends on — writes through zeroed or stale list pointers and a NULL handler dispatch — producing a system-wide crash or hang rather than a fault confined to the A2DP session.\n\nThe fix cancels session->timeout_work at the top of bt_avdtp_l2cap_disconnected() and moves k_work_init_delayable() from avdtp_send_cmd() to the session-establishment paths bt_avdtp_connect() and bt_avdtp_l2cap_accept(), so the work item is always initialized before a disconnect callback can run."
}
],
"lastModified": "2026-10-14T19:17:14.893",
"sourceIdentifier": "vulnerabilities@zephyrproject.org"
}