Zephyr RTOS
CVE-2026-15891
HIGH
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconGain adjacent UDP network position
-
DeliveryAdvertise rogue MQTT-SN gateway
-
ExploitAccept client CONNECT
-
InstallSuppress all PINGRESP replies
-
C2Exhaust client PINGREQ retry count
-
ExecuteTrigger NULL pointer dereference in process_ping()
-
ImpactCrash or corrupt slab allocator on target device
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Null pointer safety, defensive checks
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The target device must be running Zephyr RTOS with the MQTT-SN client subsystem compiled in (CONFIG_MQTT_SN enabled) and must be in an active or connecting MQTT-SN session. Exploitation requires the attacker to either (1) control or compromise the legitimate MQTT-SN gateway the client is peered with, or (2) occupy an on-path or adjacent network position and either advertise a rogue gateway or suppress real PINGRESP UDP packets from the legitimate gateway. The trigger condition is the exhaustion of the client's PINGREQ retry count, which the attacker forces simply by not responding - no crafted packet payload is needed. MQTT-SN carries no built-in authentication, so gateway impersonation is ungated on UDP networks. Exploitation is limited to: devices using this specific Zephyr subsystem, sessions that are actively in the connected/ping state, and attackers with UDP-level access to the client (adjacent or gateway-compromise path). |
| Impact | The NVD-assigned CVSS 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) overstates the realistic attack vector: the description explicitly names an 'on-path/adjacent attacker' advertising a fake gateway or suppressing real PINGRESPs, which maps to AV:A rather than AV:N in practical exploitation. A pre-compromised remote gateway does provide a fully-network-remote path, but that path requires prior compromise of infrastructure, not just network reachability. AC:L is appropriate once the attacker holds the required adjacent position, since triggering the bug requires only withholding UDP responses for the retry window - no timing precision or heap grooming is needed. PR:N is correct because MQTT-SN specifies no client authentication mechanism. Impact is purely availability: no attacker-controlled data is written, and C:N/I:N are accurate. EPSS data is not provided; no KEV listing confirms active exploitation. The bug is trivially reproducible from the commit diff, but the footprint is constrained to Zephyr MQTT-SN deployments. Real-world priority is moderate: high for IoT fleets relying on Zephyr MQTT-SN connectivity, low for environments not using this subsystem. |
| Exploit ScenarioDerived | An attacker on the same UDP network segment as a Zephyr MQTT-SN device broadcasts or unicasts a forged ADVERTISE packet, causing the client to register the attacker's endpoint as a gateway and connect to it. The attacker accepts the connection and then silently drops all PINGRESP packets. Once the client's PINGREQ retry counter is exhausted, process_ping() executes the gateway-removal path with a NULL gw pointer, crashing the device or corrupting its slab allocator - taking the IoT node offline. No exploit code is publicly known, but the fix is a single-line diff making independent reproduction trivial. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 13, 2026
Null pointer dereference in Zephyr RTOS's MQTT-SN client subsystem allows a malicious or on-path network actor to crash any Zephyr device running an active MQTT-SN session by suppressing gateway keepalive responses. The defect is a missing assignment from the SYS_SLIST_PEEK_HEAD_CONTAINER macro in process_ping(): gw is never populated, remains NULL, and is subsequently dereferenced and passed to the memory slab allocator. The outcome is a kernel panic (with CONFIG_MEM_SLAB_POINTER_VALIDATE) or silent slab free-list corruption on targets where address 0 is writable. No public exploit has been identified at time of analysis, and no KEV listing exists; however, the trivial trigger condition and absence of MQTT-SN authentication make this straightforward for any party controlling or impersonating the client's gateway.
RemediationAI
Apply the upstream one-line patch from commit bd21e954c36be105a374bbc090623810f1a17ee3 (https://github.com/zephyrproject-rtos/zephyr/commit/bd21e954c36be105a374bbc090623810f1a17ee3), which corrects the macro call to gw = SYS_SLIST_PEEK_HEAD_CONTAINER(&client->gateways, gw, next). The exact patched Zephyr release version should be confirmed via the security advisory at https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-c4g8-4f9p-4746. As a compensating control where patching is not immediately possible, disable the MQTT-SN client subsystem in the Kconfig build (deselect CONFIG_MQTT_SN) if the application does not require it - this eliminates the attack surface entirely with no functional trade-off for non-MQTT-SN workloads. Alternatively, network-level controls that restrict which UDP sources can deliver PINGRESP packets (e.g., allowlisting the legitimate gateway IP/port at the network layer) reduce the impersonation attack path, though they do not protect against a compromised legitimate gateway. Enabling CONFIG_MEM_SLAB_POINTER_VALIDATE in the build converts the silent slab corruption case into a deterministic kernel panic, which is preferable for crash diagnostics but does not prevent the DoS itself.
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
MQTT-SN (MQTT for Sensor Networks) is a UDP-based publish-subscribe protocol designed for constrained IoT/embedded devices, used in Zephyr RTOS under subsys/net/lib/mqtt_sn/. The defect (CWE-476, NULL Pointer Dereference) originates from misuse of the Zephyr kernel linked-list macro SYS_SLIST_PEEK_HEAD_CONTAINER, which returns the head container but, unlike assignment macros, does not write back to a pointer variable. The developer called the macro as a void statement, leaving gw at its NULL initialiser. The subsequent gw->gw_id dereference and k_mem_slab_free(&gateways, NULL) call either trigger k_panic() when the kernel slab-pointer validation config option is enabled, or write a corrupted free-list pointer through address 0 in the common/default build - corrupting the allocator state of the entire embedded system. The affected CPE is cpe:2.3:a:zephyrproject:zephyr:*:*:*:*:*:*:*:*, indicating all versions of Zephyr shipping this MQTT-SN implementation. The sibling function process_advertise() uses the safe iterator macro and is unaffected.
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:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Realistic exploitation requires adjacent network position to impersonate or intercept a UDP MQTT-SN gateway; no authentication, pure availability impact.
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
DescriptionCVE.org
The MQTT-SN client keepalive handler process_ping() in subsys/net/lib/mqtt_sn/mqtt_sn.c removes the gateway record after PINGREQ retries are exhausted. It invoked SYS_SLIST_PEEK_HEAD_CONTAINER(&client->gateways, gw, next) but discarded the result. That macro is a pure expression that does not assign to gw, so gw retained its NULL initializer regardless of the list contents.
The code then dereferences the NULL gw (gw->gw_id) and passes it to mqtt_sn_gw_destroy(), reaching k_mem_slab_free(&gateways, NULL). With CONFIG_MEM_SLAB_POINTER_VALIDATE enabled this triggers k_panic(); in the default configuration it performs a write through the NULL pointer ((char )mem = slab->free_list;) and corrupts the slab free list. The outcome is a crash/kernel panic or, on targets where address 0 is writable, silent memory-allocator corruption.
The vulnerable branch runs whenever the connected MQTT-SN gateway fails to answer keepalive PINGREQs for the configured number of retries. This condition is controlled by the remote peer: a malicious or compromised gateway, or an on-path/adjacent attacker that advertises itself as a gateway and then stops responding (or blackholes the real gateway's PINGRESPs), forces the client into the defect. MQTT-SN runs over UDP and no authentication is required.
The impact is a remotely triggerable denial of service (availability) of the affected MQTT-SN client; there is no attacker-controlled data written. The sibling remover process_advertise() uses SYS_SLIST_FOR_EACH_CONTAINER_SAFE and is not affected. The fix assigns the macro's return value to gw.
Technical POC Analysis
CWE-476 (NULL pointer dereference) in the MQTT-SN client keepalive handler processping() in subsys/net/lib/mqttsn/mqttsn.c (advisory pins the pre-fix branch at lines 1004-1010).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Zephyr RTOS devices running MQTT-SN client subsystem are vulnerable to unauthenticated remote denial-of-service attacks that crash the device by suppressing gateway keepalive responses, directly impacting availability of IoT deployments. No public exploit identified at time of analysis, but the trivial trigger and lack of authentication requirements pose significant operational risk to connected device fleets.
Apply vendor patch.
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 null pointer dereference occurs when a program attempts to access memory through a pointer that has been set to NULL (address 0x0).
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Affected Products (CPE)CVE.org
Potential 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
Exploit-DB