CVE-2026-19940

Source
https://cve.org/CVERecord?id=CVE-2026-19940
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-19940.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2026-19940
Aliases
  • GHSA-v47w-8959-rx62
Published
2026-10-13T16:40:10Z
Modified
2026-10-28T11:09:36Z
Severity
  • 6.5 (Medium) CVSS_V3 - CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H CVSS Calculator
Summary
Bluetooth HFP AG reuses a connection slot while a delayable work item is still armed, corrupting kernel timeout bookkeeping
Details

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.

ag->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.

The 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.

Database specific
{
    "cna_assigner": "zephyr",
    "cwe_ids": [
        "CWE-416"
    ],
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/19xxx/CVE-2026-19940.json"
}
References

Affected packages

Git / github.com/zephyrproject-rtos/zephyr

Affected ranges

Type
GIT
Repo
https://github.com/zephyrproject-rtos/zephyr
Events
Database specific
Show details
{
    "extracted_events": [
        {
            "range": [
                {
                    "introduced": "4.2.0"
                },
                {
                    "last_affected": "4.4.2"
                }
            ],
            "source": "AFFECTED_FIELD",
            "strategy": "StandardRange"
        },
        {
            "range": [
                {
                    "fixed": "204c36b896fe8d68ca3cb3d00216f245f91d14be"
                }
            ],
            "source": "REFERENCES_COMMIT"
        }
    ]
}

Affected versions

v4.*
v4.2.0
v4.3.0
v4.3.0-rc1
v4.3.0-rc2
v4.3.0-rc3
v4.4.0
v4.4.0-rc1
v4.4.0-rc2
v4.4.0-rc3

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-19940.json"
vanir_signatures
[
    {
        "deprecated": false,
        "digest": {
            "function_hash": "25748332480029839598526772550302549411",
            "length": 993
        },
        "id": "CVE-2026-19940-b27273c1",
        "signature_type": "Function",
        "signature_version": "v1",
        "source": "https://github.com/zephyrproject-rtos/zephyr/commit/204c36b896fe8d68ca3cb3d00216f245f91d14be",
        "target": {
            "file": "subsys/bluetooth/host/classic/hfp_ag.c",
            "function": "hfp_ag_disconnected"
        }
    },
    {
        "deprecated": false,
        "digest": {
            "line_hashes": [
                "266145529230776900541329259762843611367",
                "68690071363074844386663273311713520277",
                "80242989964075056828355009181414286140",
                "90570253038561571440941645823506920413"
            ],
            "threshold": 0.9
        },
        "id": "CVE-2026-19940-f3501c98",
        "signature_type": "Line",
        "signature_version": "v1",
        "source": "https://github.com/zephyrproject-rtos/zephyr/commit/204c36b896fe8d68ca3cb3d00216f245f91d14be",
        "target": {
            "file": "subsys/bluetooth/host/classic/hfp_ag.c"
        }
    }
]
vanir_signatures_modified
"2026-10-28T11:09:36Z"