141 lines
7.4 KiB
JSON
141 lines
7.4 KiB
JSON
{
|
||
"dataType": "CVE_RECORD",
|
||
"dataVersion": "5.2",
|
||
"cveMetadata": {
|
||
"cveId": "CVE-2026-18748",
|
||
"assignerOrgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
|
||
"state": "PUBLISHED",
|
||
"assignerShortName": "zephyr",
|
||
"dateReserved": "2026-08-03T21:22:14.200Z",
|
||
"datePublished": "2026-10-21T18:19:29.937Z",
|
||
"dateUpdated": "2026-11-04T05:01:21.030Z"
|
||
},
|
||
"containers": {
|
||
"cna": {
|
||
"providerMetadata": {
|
||
"orgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
|
||
"shortName": "zephyr",
|
||
"dateUpdated": "2026-11-04T05:01:21.030Z"
|
||
},
|
||
"title": "Out-of-bounds read in Bluetooth Classic A2DP codec information element handling",
|
||
"descriptions": [
|
||
{
|
||
"lang": "en",
|
||
"value": "The Bluetooth Classic A2DP host stores a codec Information Element (IE) in struct bt_a2dp_codec_ie, a one-byte len field plus a fixed 8-byte codec_ie[] array. When an AVDTP peer sent a codec IE longer than 8 bytes, a2dp_process_config_ind() in subsys/bluetooth/host/classic/a2dp.c copied only the first 8 bytes but assigned the full, attacker-chosen length to len, and then persisted that inconsistent structure into the application's struct bt_a2dp_stream via stream->codec_config. bt_a2dp_get_config_cb() and bt_a2dp_set_config_cb() had the same truncate-the-copy-but-keep-the-length pattern.\n\nEvery later consumer trusts len. In particular the responder for an incoming AVDTP GET_CONFIGURATION, a2dp_get_config_ind(), executes net_buf_add_mem(rsp_buf, &ep->stream->codec_config.codec_ie[0], ep->stream->codec_config.len), so a paired BR/EDR peer that first sends a SET_CONFIGURATION carrying an oversized codec IE and then requests the configuration back causes the stack to read up to roughly 245 bytes past the end of the 8-byte array and transmit them in the response. codec_config is the last member of struct bt_a2dp_stream, so the read runs into memory adjacent to the application's stream object. The same inconsistency is also handed to the config_req(), reconfig_req() and get_config_rsp() application callbacks, where a natural memcpy() of len bytes performs a further out-of-bounds read.\n\nReaching the on-air disclosure requires CONFIG_BT_CLASSIC with CONFIG_BT_A2DP, an AVDTP peer that has completed pairing (the AVDTP L2CAP channel requires BT_SECURITY_L2), and a local endpoint registered for a non-SBC codec — BT_A2DP_MPEG1/BT_A2DP_MPEG2/BT_A2DP_ATRAC/BT_A2DP_VENDOR via BT_A2DP_EP_INIT() — because the SBC branch already pins the IE length to 4 bytes. The bt_a2dp_get_config_cb() response path has no such gate and hands the lying length to any application. There is no out-of-bounds write: the net_buf tailroom check bounds the destination, so the impact is limited to disclosure of a bounded region of adjacent RAM to the peer.\n\nThe fix replaces the hardcoded BT_A2DP_MAX_IE_LENGTH with the configurable CONFIG_BT_A2DP_CODEC_MAX_IE_LEN (default 8, range 4–253), sizes codec_ie[] from it, and rejects any received IE that exceeds it instead of silently truncating, so len can no longer exceed the number of valid bytes."
|
||
}
|
||
],
|
||
"affected": [
|
||
{
|
||
"vendor": "zephyrproject",
|
||
"product": "zephyr",
|
||
"collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
|
||
"packageName": "zephyr",
|
||
"defaultStatus": "unaffected",
|
||
"programFiles": [
|
||
"include/zephyr/bluetooth/classic/a2dp.h",
|
||
"subsys/bluetooth/host/classic/Kconfig",
|
||
"subsys/bluetooth/host/classic/a2dp.c"
|
||
],
|
||
"programRoutines": [
|
||
{
|
||
"name": "a2dp_get_config_ind"
|
||
},
|
||
{
|
||
"name": "a2dp_process_config_ind"
|
||
},
|
||
{
|
||
"name": "bt_a2dp_get_config_cb"
|
||
}
|
||
],
|
||
"versions": [
|
||
{
|
||
"version": "4.3.0",
|
||
"status": "affected",
|
||
"versionType": "semver",
|
||
"lessThan": "4.3.2"
|
||
},
|
||
{
|
||
"version": "4.4.0",
|
||
"status": "affected",
|
||
"versionType": "semver",
|
||
"lessThan": "4.5.0"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"references": [
|
||
{
|
||
"url": "https://github.com/zephyrproject-rtos/zephyr/commit/c5f649f4714e625362fbaa93ffd7419f9c27342b",
|
||
"name": "Fix commit",
|
||
"tags": [
|
||
"patch"
|
||
]
|
||
},
|
||
{
|
||
"url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-6qq5-25mp-x5rg",
|
||
"name": "GHSA-6qq5-25mp-x5rg"
|
||
}
|
||
],
|
||
"metrics": [
|
||
{
|
||
"format": "CVSS",
|
||
"cvssV3_1": {
|
||
"version": "3.1",
|
||
"vectorString": "CVSS:3.1/AV:A/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N",
|
||
"baseScore": 3.5,
|
||
"baseSeverity": "LOW"
|
||
}
|
||
}
|
||
],
|
||
"problemTypes": [
|
||
{
|
||
"descriptions": [
|
||
{
|
||
"lang": "en",
|
||
"description": "bounds",
|
||
"cweId": "CWE-125",
|
||
"type": "CWE"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"x_generator": {
|
||
"engine": "cvelib 1.8.0"
|
||
}
|
||
},
|
||
"adp": [
|
||
{
|
||
"metrics": [
|
||
{
|
||
"other": {
|
||
"type": "ssvc",
|
||
"content": {
|
||
"timestamp": "2026-10-23T20:42:53.954844Z",
|
||
"id": "CVE-2026-18748",
|
||
"options": [
|
||
{
|
||
"Exploitation": "none"
|
||
},
|
||
{
|
||
"Automatable": "no"
|
||
},
|
||
{
|
||
"Technical Impact": "partial"
|
||
}
|
||
],
|
||
"role": "CISA Coordinator",
|
||
"version": "2.0.3"
|
||
}
|
||
}
|
||
}
|
||
],
|
||
"title": "CISA ADP Vulnrichment",
|
||
"providerMetadata": {
|
||
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
|
||
"shortName": "CISA-ADP",
|
||
"dateUpdated": "2026-10-23T21:31:20.955Z"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
} |