CVE-2026-19940
La implementación del Audio Gateway del perfil Bluetooth Classic Hands-Free en subsys/bluetooth/host/classic/hfp_ag.c mantiene sus objetos struct bt_hfp_ag en un pool estático indexado por el índice de conexión ACL. Al desconectarse el enlace, hfp_ag_disconnected() cancela ag->tx_work y los elementos de trabajo por llamada y, a continuación, pone a cero ag->acl_conn, lo que marca la ranura del pool como libre, pero deja sin tocar ag->ongoing_call_work (y ag->slc_work).
Leer descripción completaMostrar menos
La siguiente conexión que se asigna a la misma ranura entra en hfp_ag_create(), cuya única comprobación de ocupación es ag->acl_conn, y ejecuta de inmediato memset(ag, 0, sizeof(struct bt_hfp_ag)) seguido de k_work_init_delayable(). Poner a cero y reinicializar un k_work_delayable cuyo nodo struct _timeout sigue enlazado en la lista de timeouts del kernel deja al kernel con una referencia a un nodo con los enlaces prev/next a NULL.
El elemento ag->ongoing_call_work lo activa el dispositivo remoto: cuando una unidad Hands-Free envía AT+CIND? durante el establecimiento del Service Level Connection y la aplicación proporciona el callback asíncrono get_ongoing_call, el AG programa el trabajo durante CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT milisegundos (por defecto, 10000). El temporizador solo se cancela si la aplicación responde a tiempo mediante bt_hfp_ag_ongoing_calls(). Un par que envía AT+CIND?, después desconecta el DLC RFCOMM del HFP y, a continuación, lo vuelve a abrir inmediatamente en el mismo enlace ACL, reutiliza de forma determinista la misma ranura del pool mientras el timeout sigue pendiente; la ruta de aceptación del servidor RFCOMM del AG (hfp_ag_accept()) llama directamente a hfp_ag_create(), por lo que el lado remoto controla tanto la desconexión como la recreación.
El resultado es la corrupción de la lista de timeouts del kernel: sys_dlist_remove() sobre el nodo puesto a cero realiza escrituras a través de punteros NULL desde la ruta de anuncio de reloj, y reprogramar el trabajo reinicializado vuelve a insertar un nodo que la lista ya referencia, creando un ciclo que el bucle de anuncio recorre con las interrupciones bloqueadas. El impacto observable es un fallo o bloqueo de todo el sistema, es decir, una denegación de servicio alcanzable desde el alcance de la radio Bluetooth; no se escriben datos controlados por el atacante, por lo que esto no permite por sí solo la ejecución de código. La exposición se limita a compilaciones con CONFIG_BT_HFP_AG (marcado como experimental y desactivado por defecto) cuya aplicación implementa el callback asíncrono get_ongoing_call.
Traducción automática del texto original de NVD (en inglés).
CVSS
- Puntuación base
- 6.5
- Versión
- 3.1
- Vector
- CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días
- 0.19 %
- Percentil entre todas las CVEs puntuadas
- 8
- 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 movement90 % - Impacto principal
T1499Endpoint Denial of Serviceimpact88 %
Vector AV:A/PR:N/UI:N (adyacente, alcance por radio Bluetooth) → T1210; el texto describe corrupción de la lista de timeouts del kernel que provoca fallo o cuelgue del sistema (DoS).
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-416
Referencias
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-19940",
"cveTags": [],
"metrics": {
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-19940",
"role": "CISA Coordinator",
"options": [
{
"exploitation": "none"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"version": "2.0.3",
"timestamp": "2026-10-14T19:26:45.572487Z"
}
}
],
"cvssMetricV31": [
{
"type": "Secondary",
"source": "vulnerabilities@zephyrproject.org",
"cvssData": {
"scope": "UNCHANGED",
"version": "3.1",
"baseScore": 6.5,
"attackVector": "ADJACENT_NETWORK",
"baseSeverity": "MEDIUM",
"vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
"integrityImpact": "NONE",
"userInteraction": "NONE",
"attackComplexity": "LOW",
"availabilityImpact": "HIGH",
"privilegesRequired": "NONE",
"confidentialityImpact": "NONE"
},
"impactScore": 3.6,
"exploitabilityScore": 2.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": [
"subsys/bluetooth/host/classic/hfp_ag.c"
],
"collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
"defaultStatus": "unaffected",
"programRoutines": [
{
"name": "hfp_ag_create"
},
{
"name": "hfp_ag_disconnected"
}
]
}
]
}
],
"published": "2026-10-13T17:17:40.107",
"references": [
{
"url": "https://github.com/zephyrproject-rtos/zephyr/commit/204c36b896fe8d68ca3cb3d00216f245f91d14be",
"source": "vulnerabilities@zephyrproject.org"
},
{
"url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-v47w-8959-rx62",
"source": "vulnerabilities@zephyrproject.org"
}
],
"vulnStatus": "Awaiting Analysis",
"weaknesses": [
{
"type": "Secondary",
"source": "vulnerabilities@zephyrproject.org",
"description": [
{
"lang": "en",
"value": "CWE-416"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "The Bluetooth Classic Hands-Free Profile Audio Gateway implementation in subsys/bluetooth/host/classic/hfp_ag.c keeps its struct bt_hfp_ag objects in a static pool indexed by ACL connection index. On link teardown, hfp_ag_disconnected() cancels ag->tx_work and the per-call work items and then clears ag->acl_conn, which marks the pool slot as free — but it leaves ag->ongoing_call_work (and ag->slc_work) untouched. The next connection that lands on the same slot enters hfp_ag_create(), whose only occupancy test is ag->acl_conn, and immediately executes memset(ag, 0, sizeof(struct bt_hfp_ag)) followed by k_work_init_delayable(). Zeroing and re-initialising a k_work_delayable whose struct _timeout node is still linked into the kernel timeout list leaves the kernel holding a reference to a node with NULL prev/next links.\n\nag->ongoing_call_work is armed by the remote peer: when a Hands-Free unit sends AT+CIND? during Service Level Connection establishment and the application provides the asynchronous get_ongoing_call callback, the AG schedules the work for CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT milliseconds (default 10000). The timer is cancelled only if the application answers in time via bt_hfp_ag_ongoing_calls(). A peer that sends AT+CIND?, then disconnects the HFP RFCOMM DLC, then immediately re-opens it on the same ACL link, reuses the same pool slot deterministically while the timeout is still pending — the AG's RFCOMM server accept path (hfp_ag_accept()) calls hfp_ag_create() directly, so the remote side drives both teardown and re-creation.\n\nThe result is corruption of the kernel's timeout list: sys_dlist_remove() on the zeroed node performs writes through NULL pointers from the clock-announce path, and rescheduling the re-initialised work re-inserts a node the list already references, creating a cycle that the announce loop walks with interrupts locked. The observable impact is a fault or hang of the whole system, i.e. a denial of service reachable from Bluetooth radio range; no attacker-controlled data is written, so this does not by itself yield code execution. Exposure is limited to builds with CONFIG_BT_HFP_AG (marked experimental and disabled by default) whose application implements the asynchronous get_ongoing_call callback."
}
],
"lastModified": "2026-10-14T20:17:35.800",
"sourceIdentifier": "vulnerabilities@zephyrproject.org"
}