Zephyr MCUmgr
CVE-2026-18747
MEDIUM
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain write access to MCUmgr console (USB CDC-ACM/UART)
-
DeliveryStage preceding frames to shape pool buffer
-
ExploitSend 7-byte zero-length SMP frame
-
ExecutionCRC passes, len underflows to ~65KB
-
PersistCBOR/net_buf_pull reads out of bounds
-
ImpactFault MCUmgr thread or leak adjacent memory
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Bounds checking, read limits
MITRE ATT&CK
1 technique across 1 tactic: Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a target built with a serial SMP transport that selects MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE - specifically CONFIG_MCUMGR_TRANSPORT_UART (smp_uart.c) or CONFIG_MCUMGR_TRANSPORT_SHELL (smp_shell.c); the test-only CONFIG_MCUMGR_TRANSPORT_DUMMY loopback shares the bug but has no external input path and is not exploitable. The attacker needs write access to that management console, which on many boards is an exposed USB CDC-ACM port rather than a physical UART header - this local-console access requirement (AV:L) is the primary limiting factor. No authentication, prior session state, fragmentation, or credentials are needed (PR:N, UI:N), as the malformed frame is processed before command-level access control. Reliable memory disclosure additionally depends on the default-enabled CONFIG_MCUMGR_GRP_OS_ECHO handler and on staging preceding frames to shape the reused pool buffer. |
| Impact | This is a real but access-constrained flaw. The CVSS 3.1 vector (AV:L/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H, base 6.8) is internally consistent with the description: exploitation requires write access to a local management console (UART or, on many boards, a USB CDC-ACM port), hence AV:L rather than AV:N, and it needs no credentials or session state because the malformed frame is mishandled before any command-level access control (PR:N). The dominant impact is availability (A:H - the OOB read faults the MCUmgr thread / can reset the device), with limited confidentiality (C:L) via the default os echo handler leaking adjacent memory, and no integrity gain beyond what the already-unauthenticated transport permits (I:N). No EPSS score, no CISA KEV listing, and no public POC were provided in the intelligence, so there is no signal of active or automated exploitation - this is a vendor-reported (Zephyr project) advisory with a confirmed source-level fix, not an in-the-wild threat. The AV:L local-console requirement is the single biggest risk limiter and correctly keeps this out of the remotely-wormable class despite PR:N; treat as a real defect to patch on exposed/physically-accessible devices, not an internet-facing emergency. Note the bare 7-byte trigger alone typically only re-parses stale pool bytes into a parse error; reliably reaching the faulting OOB read or memory disclosure requires the attacker to stage preceding frames - feasible precisely because the transport is unauthenticated and the attacker controls all console input. |
| Exploit ScenarioDerived | An attacker with write access to a device's MCUmgr management console (a bare UART header or, commonly, an exposed USB CDC-ACM port) sends a single unauthenticated 7-byte line - the 0x06 0x09 packet marker, the base64 group AAA=, and a newline - declaring a zero-length packet that passes the CRC check for free and underflows net_buf::len to ~65 KB against a 384-byte buffer. To move from a mere parse error to a faulting out-of-bounds read or memory disclosure, the same unauthenticated attacker first stages preceding frames so that a request parses with nh_len larger than the buffer, driving net_buf_pull() (guarded only by __ASSERT_NO_MSG) out of bounds. No public exploit code was identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 29, 2026
An out-of-bounds read in Zephyr's MCUmgr SMP-over-console transport (subsys/mgmt/mcumgr/transport/src/serial_util.c) lets a single 7-byte, unauthenticated console line underflow a net_buf length field and hand the SMP layer a bogus ~65 KB payload window over a buffer whose data area defaults to 384 bytes. The flaw affects builds that enable CONFIG_MCUMGR_TRANSPORT_UART (smp_uart.c) or CONFIG_MCUMGR_TRANSPORT_SHELL (smp_shell.c), both of which select MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE; the test-only CONFIG_MCUMGR_TRANSPORT_DUMMY loopback carries the same pattern but has no external input path and is not exploitable. Because exploitation needs only write access to the management console - on many boards an exposed USB CDC-ACM port rather than a bare UART header - the practical impact is a faulted MCUmgr thread (denial of service) plus possible limited memory disclosure via the default-enabled os echo handler; no public exploit identified at time of analysis and no confirmed active exploitation (CISA KEV).
RemediationAI
Upstream fix available (commit f7fc3e779a59c68c96eaf63a6b03ac7489f5e4a5); a released patched version is not independently confirmed from the available data, so integrators should cherry-pick the commit or track the upstream advisory at https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-g6cx-xj75-hvfw. The patch adds a guard in mcumgr_serial_extract_len() rejecting any declared packet length of two bytes or fewer (rx_ctxt->pkt_len <= sizeof(uint16_t) returns -EINVAL), which prevents the CRC-strip subtraction from underflowing; note the identical pattern remains in the test-only smp_dummy.c loopback transport, harmless because it has no external input path. Where patching is not immediately possible, disable the affected console transports by not enabling CONFIG_MCUMGR_TRANSPORT_UART and CONFIG_MCUMGR_TRANSPORT_SHELL on externally reachable consoles - the trade-off is loss of UART/shell-based device management, so retain an alternate management path (BLE or UDP/CoAP SMP transport) if field management is required. Additionally disable CONFIG_MCUMGR_GRP_OS_ECHO to remove the default-enabled disclosure primitive, at the cost of losing the os echo command used for diagnostics, and restrict physical or USB access to the management console (disable or gate the USB CDC-ACM management endpoint, and require authenticated physical access), since the primitive needs only unauthenticated write access to that console and this local-console exposure is the primary limiting factor.
Affected ProductsAI
Zephyr RTOS builds that enable the MCUmgr serial/consoletransport helper MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE are affected, specifically configurations with CONFIG_MCUMGR_TRANSPORT_UART (subsys/mgmt/mcumgr/transport/src/smp_uart.c) or CONFIG_MCUMGR_TRANSPORT_SHELL (subsys/mgmt/mcumgr/transport/src/smp_shell.c); the vulnerable buffer size is governed by CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE, default 384 bytes. Exposure is highest where the management console is routed to an externally reachable interface such as a USB CDC-ACM port rather than an internal UART header, and disclosure potential is greater with the default-enabled CONFIG_MCUMGR_GRP_OS_ECHO handler. The test-only loopback transport subsys/mgmt/mcumgr/transport/src/smp_dummy.c (CONFIG_MCUMGR_TRANSPORT_DUMMY) shares the identical underflow pattern but has no external input path and is not practically exposed. Vendor advisory and fix details are at https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-g6cx-xj75-hvfw and https://github.com/zephyrproject-rtos/zephyr/commit/f7fc3e779a59c68c96eaf63a6b03ac7489f5e4a5.
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
MCUmgr's SMP-over-console transport frames management packets as base64 payloads preceded by a 0x06 0x09 marker on a newline-terminated line. mcumgr_serial_process_frag() decodes the base64 group, reads a 16-bit declared packet length via mcumgr_serial_extract_len(), verifies a CRC16, then unconditionally strips the two CRC bytes with rx_ctxt->nb->len -= 2U. The length check accepted 0 and 1, and a declared length of 0 passes the checksum for free because crc16_itu_t() over zero bytes returns the zero seed; since net_buf::len is a uint16_t, subtracting 2 underflows to ~65535 while the actual data area is only CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE bytes (default 384). Downstream, smp_process_request_packet() in subsys/mgmt/mcumgr/smp/src/smp.c loses its bound: cbor_nb_reader_init() exposes a ~65 KB CBOR window over the small buffer, and each request header's nh_len is validated only against the inflated length. Because net_buf_pull() is guarded only by __ASSERT_NO_MSG, an attacker who stages prior frames on the unauthenticated transport can shape the reused pool buffer so a request succeeds with an nh_len larger than the buffer, driving the parse cursor out of bounds and reading adjacent memory - CWE-125 (out-of-bounds read). The trigger is the 7-byte line 0x06 0x09 followed by base64 'AAA=' and a newline, requiring no session state, fragmentation, or credentials, and mishandled before any command handler or command-level access control executes.
Know when Zephyr gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:L/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H
Local management console write access gives AV:L; no auth or interaction before the flaw (PR:N/UI:N); trivial length underflow (AC:L); crash-driven A:H with limited memory leak (C:L) and no integrity gain (I:N).
Primary rating from Vendor (zephyrproject).
CVSS VectorVendor: zephyrproject
DescriptionCVE.org
The MCUmgr SMP-over-console transport decodes a base64 frame, reads a 16-bit packet length from it, verifies a CRC and then unconditionally strips the trailing CRC with rx_ctxt->nb->len -= 2U; in mcumgr_serial_process_frag() (subsys/mgmt/mcumgr/transport/src/serial_util.c). mcumgr_serial_extract_len() accepted any declared length, including 0 and 1, and a packet declaring length 0 passes the checksum test for free because crc16_itu_t() over zero bytes returns the zero seed. Since net_buf::len is a uint16_t, the subtraction underflows and the buffer is handed to SMP claiming roughly 65 KB of payload while its data area is only CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE bytes (default 384).
The trigger is a single unauthenticated 7-byte line on the management console - the 0x06 0x09 packet marker followed by the base64 group AAA= and a newline - delivered to any transport built on this helper: CONFIG_MCUMGR_TRANSPORT_UART (smp_uart.c) or CONFIG_MCUMGR_TRANSPORT_SHELL (smp_shell.c), both of which select MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE. No prior session state, fragmentation or credentials are required to trigger the underflow, and the malformed frame is mishandled before any command handler or command-level access control runs. The attacker only needs write access to that console, which on many boards is a USB CDC-ACM port rather than a bare UART header.
With the inflated length, smp_process_request_packet() in subsys/mgmt/mcumgr/smp/src/smp.c loses its bound: cbor_nb_reader_init() gives the CBOR decoder a ~65 KB window into a 384-byte buffer, and each request header's nh_len is checked only against the inflated length. On its own the 7-byte frame re-parses whatever stale bytes the reused pool buffer still holds, typically a replay of the previously received request followed by a parse error, without leaving the buffer. Because the transport is unauthenticated, though, the attacker also controls the frames sent before the trigger, and can stage buffer contents so that a request succeeds with an nh_len larger than the buffer; net_buf_pull(), guarded only by __ASSERT_NO_MSG, then moves the parse cursor out of bounds and the loop reads further headers and CBOR from adjacent memory. The consequence is an out-of-bounds read that can fault the MCUmgr thread (denial of service); memory disclosure is also possible, since the default-enabled os echo handler (CONFIG_MCUMGR_GRP_OS_ECHO) decodes its string inside that window and copies it into its response. There is no integrity gain beyond what the unauthenticated transport already permits.
The fix rejects any declared packet length of two bytes or fewer in mcumgr_serial_extract_len(), so the CRC-strip subtraction can no longer underflow. The identical pattern remains in the test-only loopback transport subsys/mgmt/mcumgr/transport/src/smp_dummy.c (CONFIG_MCUMGR_TRANSPORT_DUMMY), which has no external input path and therefore carries no practical exposure.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
A buffer overflow occurs when a program writes more data to a memory buffer than it was allocated to hold, causing the excess data to spill into adjacent memory regions.
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Related Vulnerabilities in Zephyr RTOS Memory Safety and DoS Vulnerabilities
View all 3Potential off-by-one buffer overflow vulnerability in the Zephyr fuse file system. Rated critical severity (CVSS 10.0),
An out-of-bounds write in the Zephyr RTOS DNS resolver (dns_unpack_name()) lets a crafted DNS response corrupt memory on
Possible variant of CVE-2021-3434 in function le_ecred_reconf_req. Rated critical severity (CVSS 9.8), this vulnerabilit
Unchecked user input length in /subsys/net/l2/wifi/wifi_shell.c can cause buffer overflows. Rated critical severity (CVS
Potential buffer overflow vulnerability in the Zephyr CAN bus subsystem. Rated critical severity (CVSS 9.8), this vulner
Integer Underflow in 6LoWPAN IPHC Header Uncompression in Zephyr. Rated critical severity (CVSS 9.8), this vulnerability
Buffer overflow in Zephyr USB DFU DNLOAD. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitable
DOS: Incorrect 802154 Frame Validation for Omitted Source / Dest Addresses. Rated critical severity (CVSS 9.8), this vul
zephyr-rtos version 1.12.0 contains a NULL base pointer reference vulnerability in sys_ring_buf_put(), sys_ring_buf_get(
Potential buffer overflow vulnerabilities n the Zephyr Bluetooth subsystem. Rated critical severity (CVSS 9.6), this vul
The documentation specifies that the BT_GATT_PERM_READ_LESC and BT_GATT_PERM_WRITE_LESC defines for a Bluetooth characte
Potential buffer overflows in the Bluetooth subsystem due to asserts being disabled in /subsys/bluetooth/host/hci_core.c
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB