CVE-2026-19940

Estado: Pendiente de análisisMedia (6.5)—
Gravedad6.5Media · CVSS 3.1
Probabilidad de explotación0.19 %mayor que el 8 % de las CVE
Explotación activaNono figura en el catálogo de CISA
Exploit públicoNo conocidosin código público localizado

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.

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

Referencias

Mostrar las 2 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"
}