CVE-2026-16664

Source
https://cve.org/CVERecord?id=CVE-2026-16664
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-16664.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2026-16664
Aliases
  • GHSA-8rcq-2mgr-fhp8
Published
2026-11-13T00:23:05Z
Modified
2026-11-14T02:47:33Z
Severity
  • 5.1 (Medium) CVSS_V3 - CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L CVSS Calculator
Summary
Unchecked serial-recovery image index causes out-of-bounds slot-table read in MCUboot Zephyr port
Details

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.

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

flash_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 0xFFFFFFFF converts to -1 and reads all_slots[-2], off the front of the table, while large positive values read off the end (CWE-192). 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. This 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.

Database specific
{
    "cna_assigner": "zephyr",
    "cwe_ids": [
        "CWE-129"
    ],
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/16xxx/CVE-2026-16664.json",
    "unresolved_ranges": [
        {
            "extracted_events": [
                {
                    "range": [
                        {
                            "introduced": "2.0.0"
                        },
                        {
                            "last_affected": "*"
                        }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StandardRange"
                }
            ]
        }
    ]
}
References

Affected packages

Git / github.com/mcu-tools/mcuboot

Affected ranges

Type
GIT
Repo
https://github.com/mcu-tools/mcuboot
Events
Introduced
0 Unknown introduced commit / All previous commits are affected
Fixed
Database specific
Show details
{
    "extracted_events": [
        {
            "range": [
                {
                    "fixed": "183a05f256bdbbac86edcb048958da59018f814e"
                }
            ],
            "source": "REFERENCES_COMMIT"
        }
    ]
}

Affected versions

1.*
1.7.0-rc1
TF-Mv1.*
TF-Mv1.2-integ
TF-Mv1.3-integ
TF-Mv1.4-integ
TF-Mv1.4-integ-rc1
TF-Mv1.4-integ-rc2
cypress-latest-v1.*
cypress-latest-v1.X
v0.*
v0.9-rc1
v0.9-test1
v0.9.0
v0.9.0-rc2
v1.*
v1.0.0
v1.0.0-rc1
v1.0.0-rc2
v1.0.0-rc3
v1.1.0
v1.1.0-rc1
v1.1.0-rc2
v1.10.0
v1.10.0-rc1
v1.2.0
v1.2.0-rc1
v1.2.0-rc2
v1.2.0-rc3
v1.2.0-rc4
v1.2.0-rc5
v1.3.0
v1.3.0-rc1
v1.3.0-rc2
v1.3.0-rc3
v1.3.1
v1.3.1-rc1
v1.4.0
v1.4.0-rc1
v1.4.0-rc2
v1.5.0
v1.5.0-cypress
v1.5.0-rc1
v1.5.0-rc2
v1.6.0
v1.6.0-cypress
v1.6.0-rc1
v1.6.0-rc2
v1.6.1-cypress
v1.7.0
v1.7.0-rc2
v1.8.0
v1.8.0-rc1
v1.9.0
v1.9.0-rc1
v1.9.0-rc2
v2.*
v2.0.0
v2.0.0-rc1
v2.1.0
v2.1.0-rc1
v2.2.0
v2.2.0-rc1
v2.2.0-rc2
v2.3.0
v2.3.0-rc1
v2.3.0-rc2
v2.4.0
v2.4.0-rc1

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-16664.json"