Files
vuln-cve/data/2026/16xxx/CVE-2026-16664.json
T

111 lines
6.8 KiB
JSON

{
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"cveMetadata": {
"cveId": "CVE-2026-16664",
"assignerOrgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
"state": "PUBLISHED",
"assignerShortName": "zephyr",
"dateReserved": "2026-07-22T19:47:54.908Z",
"datePublished": "2026-11-13T00:23:05.652Z",
"dateUpdated": "2026-11-13T21:59:26.710Z"
},
"containers": {
"cna": {
"providerMetadata": {
"orgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
"shortName": "zephyr",
"dateUpdated": "2026-11-13T21:59:26.710Z"
},
"title": "Unchecked serial-recovery image index causes out-of-bounds slot-table read in MCUboot Zephyr port",
"descriptions": [
{
"lang": "en",
"value": "MCUboot's Zephyr serial-recovery upload handler bs_upload() in boot/boot_serial/src/boot_serial.c decodes the host-supplied image field of an MCUmgr image-upload request into img_num (a full 32-bit value) and latches it on the off == 0 packet without any range check. It then passes img_num straight to flash_area_id_from_multi_image_slot(img_num, 0), which on the Zephyr port resolves to __flash_area_ids_for_slot() in boot/zephyr/include/sysflash/sysflash.h and indexes the static const int all_slots[] table as all_slots[img_num 2]. That table holds only MCUBOOT_IMAGE_NUMBER 2 entries, so any img_num >= MCUBOOT_IMAGE_NUMBER is an out-of-bounds read.\n\nThe path is reachable by anyone with access to the serial / SMP recovery console, which is unauthenticated by design, and the bad value is supplied before any image signature is verified. The defect is specific to the default non-direct upload path (MCUBOOT_SERIAL_DIRECT_IMAGE_UPLOAD disabled) on the Zephyr port with the array-backed slot layout (not CONFIG_SINGLE_APPLICATION_SLOT). It is not gated on a multi-image configuration: MCUBOOT_IMAGE_NUMBER defaults to 1, so even a default single-image build is affected for any image >= 1. The MCUBOOT_SERIAL_DIRECT_IMAGE_UPLOAD path is safe (its flash_area_id_from_direct_image() switch returns -EINVAL for unknown indices).\n\nflash_area_id_from_multi_image_slot() takes a signed int image_index while img_num is uint32_t, so the attacker controls the sign of the index as well as its magnitude: an image of 0xFFFFFFFE converts to -2 and reads all_slots[-4], off the front of the table, while large positive values read off the end (CWE-192). (0xFFFFFFFF itself is the \"no image given\" sentinel and selects image 0.) Either way the index multiply img * 2 is performed in int, so a wild offset yields a bus/hard fault, giving a reliable denial of service of the bootloader during recovery. For moderately out-of-range indices the read returns adjacent .rodata as a garbage flash-area id that is handed to flash_area_open(); this normally fails with MGMT_ERR_EINVAL, but if the garbage id happens to match a valid non-image partition, the subsequent erase/write can target a partition outside the image set (CWE-787). The attacker-supplied value is never echoed back, so there is no information disclosure. The fix is to reject img_num >= BOOT_IMAGE_NUMBER on the off == 0 packet, before the slot lookup. The comparison must be made on the unsigned img_num: an equivalent guard applied after the conversion to int would not reject the negative case above. __flash_area_ids_for_slot() should bounds-check its own arguments as defence in depth.\nThis vulnerability was reported independently twice: by NVIDIA Project Vanessa on 2026-06-22, and by Kai Phan (@kaimandalic) on 2026-07-19 as GHSA-8v33-88p6-jffj, which is closed as a duplicate of this advisory. Both original reports are reproduced in full below."
}
],
"affected": [
{
"vendor": "mcu-tools",
"product": "mcuboot",
"collectionURL": "https://github.com/mcu-tools/mcuboot",
"packageName": "mcuboot",
"defaultStatus": "unaffected",
"programFiles": [
"boot/boot_serial/src/boot_serial.c",
"boot/zephyr/include/sysflash/sysflash.h"
],
"programRoutines": [
{
"name": "__flash_area_ids_for_slot"
},
{
"name": "bs_upload"
}
],
"versions": [
{
"version": "2.0.0",
"status": "affected",
"lessThanOrEqual": "*",
"versionType": "semver"
}
]
}
],
"references": [
{
"url": "https://github.com/mcu-tools/mcuboot/commit/183a05f256bdbbac86edcb048958da59018f814e",
"name": "Fix commit 183a05f256bd",
"tags": [
"patch"
]
},
{
"url": "https://github.com/mcu-tools/mcuboot/commit/b35d623fc44b873cbb244a4fb0930f259ff45eb8",
"name": "Fix commit b35d623fc44b",
"tags": [
"patch"
]
},
{
"url": "https://github.com/mcu-tools/mcuboot/commit/f30be48bcc58d18c22e61be914e8f7b380abcf53",
"name": "Fix commit f30be48bcc58",
"tags": [
"patch"
]
},
{
"url": "https://github.com/mcu-tools/mcuboot/security/advisories/GHSA-8rcq-2mgr-fhp8",
"name": "GHSA-8rcq-2mgr-fhp8"
}
],
"metrics": [
{
"format": "CVSS",
"cvssV3_1": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L",
"baseScore": 5.1,
"baseSeverity": "MEDIUM"
}
}
],
"problemTypes": [
{
"descriptions": [
{
"lang": "en",
"description": "bounds",
"cweId": "CWE-129",
"type": "CWE"
}
]
}
],
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
}
}