Threats affecting pkg:github/zephyr
220 threats
Most recently published first
| Severity | CVSS | Signals | Threat | Source | Published | Score and star |
|---|---|---|---|---|---|---|
| High | 7.5 | EPSS 0.6% | CVE-2026-15891zephyrproject zephyr · Memory-safety High7.5EPSS 0.6%CVE Database V5CVE-2026-15891 CVE-2026-15891 is a memory safety vulnerability in the Zephyr project's MQTT-SN client keepalive handler. The flaw occurs when the client fails to properly handle gateway records after PINGREQ retries are exhausted, leading to a NULL pointer dereference and subsequent memory corruption or kernel panic. This can be triggered remotely by a malicious or compromised MQTT-SN gateway or an attacker impersonating a gateway. The impact is a denial of service on the affected MQTT-SN client. The vulnerability affects Zephyr versions from 4.1.0 up to but not including 4.4.2. A fix is available that correctly assigns the gateway pointer before use. EPSS 0.6%Vulnerability | CVE Database V5 | ||
| Medium | 5.3 | EPSS 0.2% | CVE-2026-15461zephyrproject zephyr · Memory-safety Medium5.3EPSS 0.2%CVE Database V5CVE-2026-15461 The Sierra Wireless HL78xx modem GNSS driver (drivers/modem/hl78xx/, later drivers/modem/vendor_standalone/hl78xx/) embeds a generic struct gnss_nmea0183_match_data match_data inside struct hl78xx_gnss_data. The generic NMEA0183 match helper (drivers/gnss/gnss_nmea0183_match.c) requires that context to be the first member because its callbacks cast user_data directly to struct gnss_nmea0183_match_data . In the affected releases match_data was the second member (after const struct device dev), so it sat at a non-zero offset while gnss_nmea0183_match_init() initialized it at the correct address. The registered NMEA handlers instead pass the whole device data object (data->devices.gnss->data, offset 0), producing an offset-shifted type confusion between where state is initialized and where the parse callbacks read and write it. When NMEA sentences from the GNSS receiver are parsed, the GGA/RMC callbacks write parsed fix data into the wrong location within the struct, and the GSV callback (gnss_nmea0183_match_gsv_callback, active under CONFIG_GNSS_SATELLITES) reads its satellites pointer and bound from the wrong offsets — non-pointer bytes of struct hl78xx_gnss_data — and then writes parsed struct gnss_satellite entries through that bogus pointer. This is a write through an uninitialized/wild pointer with a garbage bound. The NMEA handlers are registered by default (CONFIG_HL78XX_GNSS_SOURCE_NMEA is the default GNSS source) on devices using the HL78xx GNSS. The driver runs in kernel context and the NMEA data originates from the GNSS radio front-end, so a party able to influence the GNSS signal (for example GNSS/GPS spoofing at radio proximity) can drive the kernel-side parser into the faulty write. The most likely impact is a crash (denial of service) because the bogus pointer resolves to a fixed near-NULL value, with adjacent-memory corruption possible on MMU-less targets. Confidentiality is not affected. Exploitation requires the satellites feature to be enabled and active, so attack complexity is high. EPSS 0.2%Vulnerability | CVE Database V5 | ||
| Medium | 5.4 | EPSS 0.2% | CVE-2026-15460zephyrproject zephyr · Logic Medium5.4EPSS 0.2%CVE Database V5CVE-2026-15460 CVE-2026-15460 is a medium severity vulnerability in the Zephyr project's Bluetooth Classic L2CAP receive handler. The flaw allows a remote attacker within radio range to send data to a channel that is not fully connected or authenticated, potentially causing denial of service or a dangling pointer condition. This occurs because inbound data PDUs are dispatched based only on the destination channel ID without verifying the channel's connected state. The issue affects Zephyr versions from 1.6.0 up to but not including 4.4.2. The vulnerability does not impact confidentiality but can affect integrity and availability. EPSS 0.2%Vulnerability | CVE Database V5 | ||
| Medium | 6.5 | EPSS 0.3% | CVE-2026-14697zephyrproject zephyr · Dos Medium6.5EPSS 0.3%CVE Database V5CVE-2026-14697 net_ipv6_send_ns() in subsys/net/ip/ipv6_nbr.c allocates a transmit net_pkt for a Neighbor Solicitation. When it is called with a data packet pending on an unresolved neighbor and that neighbor's pending_queue is already non-empty (an NS is already outstanding), the function appends the data packet and returns early without ever sending the NS via net_send_data() or releasing it with net_pkt_unref(). The freshly allocated NS net_pkt and its attached TX buffers are held only by a local variable and are leaked permanently, never returning to CONFIG_NET_PKT_TX_COUNT / CONFIG_NET_BUF_TX_COUNT. The leaking branch sits on the normal IPv6 transmit path: net_ipv6_prepare_for_send() (called from net_if.c) invokes net_ipv6_send_ns() for any outbound or forwarded IPv6 packet whose next hop is not yet in the neighbor cache. An on-link (adjacent) attacker can drive it deterministically by sending a burst of request packets (for example ICMPv6 echo requests or UDP datagrams) that all spoof a single non-existent on-link source address: the node generates a reply to each, the first reply queues an NS, and every subsequent reply during the roughly three-second INCOMPLETE resolution window takes the leaking branch and loses one TX packet. Router-configured nodes forwarding attacker traffic toward a non-existent on-link host leak identically. Because the leaked packets are never reclaimed and CONFIG_NET_PKT_TX_COUNT defaults to only 4 (14 for Ethernet), a brief low-rate burst exhausts the TX pool. Once exhausted the node can no longer allocate any transmit packet and cannot send TCP/UDP, ARP/ND, or any reply at all, producing a complete and persistent network denial of service that does not self-heal until reboot. The fix releases the unsent NS packet with net_pkt_unref(pkt) before the early return. EPSS 0.3%Vulnerability | CVE Database V5 | ||
| Medium | 6.5 | EPSS 0.3% | CVE-2026-14696zephyrproject zephyr · Dos Medium6.5EPSS 0.3%CVE Database V5CVE-2026-14696 When Ethernet bridging is enabled (CONFIG_NET_ETHERNET_BRIDGE), eth_bridge_input_process() in subsys/net/l2/ethernet/bridge/bridge_input.c decides how each frame received on a bridge member interface is handled. For frames that must also be delivered to the local stack, the code called eth_bridge_handle_locally() and returned NET_OK. That helper does not consume the packet — it only calls bridge_iface_recv() (via virtual_recv()), which returns NET_CONTINUE without taking ownership of pkt. The NET_OK verdict then propagates through ethernet_recv() up to processing_data() in subsys/net/ip/net_core.c, where NET_OK is interpreted as "the packet was consumed, do not free it." Because no consumer actually took ownership, the RX net_pkt is never returned to the pool and is leaked. The concretely reproducible leak occurs for frames whose EtherType has no registered L3 handler when CONFIG_NET_ETHERNET_FORWARD_UNRECOGNISED_ETHERTYPE is set (default y when CONFIG_NET_SOCKETS_PACKET is enabled): the fall-through L3 dispatch does not overwrite the NET_OK verdict, so ethernet_recv() returns NET_OK and the buffer is never released. Any device on a bridged L2 segment can emit broadcast/multicast frames carrying an arbitrary EtherType with no authentication. Each such frame permanently consumes one buffer from the finite RX pool (CONFIG_NET_PKT_RX_COUNT), so a brief broadcast flood exhausts the pool and the device can no longer receive traffic until it is rebooted — a persistent denial of service. There is no confidentiality or integrity impact. The fix makes eth_bridge_handle_locally() propagate the real net_verdict and return NET_CONTINUE for locally-kept frames, writing the bridge interface back through a new dst_iface out-parameter so the packet follows the normal receive path and is unreferenced exactly once. EPSS 0.3%Vulnerability | CVE Database V5 | ||
| Medium | 5.4 | EPSS 0.4% | CVE-2026-14368zephyrproject zephyr · Bounds Medium5.4EPSS 0.4%CVE Database V5CVE-2026-14368 The LwM2M JSON content formatter's get_string() in subsys/net/lib/lwm2m/lwm2m_rw_json.c copies a parsed JSON string into a caller-supplied buffer and NUL-terminates it. The length guard used if (string_length > buflen), which accepts a string whose length is exactly buflen. After memcpy() fills the whole buffer, buf[string_length] = '\0' then writes one byte past the end of the buffer (CWE-787). The string value and its length are taken directly from the incoming CoAP payload during a LwM2M WRITE: do_write_op_json() parses the payload obtained from coap_packet_get_payload(), and get_string() is invoked from lwm2m_write_handler() (engine_get_string() in subsys/net/lib/lwm2m/lwm2m_message_handling.c) for a LWM2M_RES_TYPE_STRING resource. The destination buf/buflen is either the resource instance's fixed data buffer (res_inst->data_ptr/max_data_len) or the engine validation buffer (msg->ctx->validate_buf). A LwM2M server (the client's DTLS peer) can therefore write a string resource with a value whose length equals the target buffer size and force a one-byte overflow. The overflow is a single out-of-bounds write of the constant byte 0x00 immediately past the resource or validation buffer, corrupting the adjacent byte in memory. It is not an information leak and the written value is fixed, so it is not a direct code-execution primitive, but it can corrupt adjacent state (an adjacent resource value, a length/flag field, or a struct field) and cause data corruption or a crash. Triggering the write is deterministic; the resulting impact depends on memory layout. The fix changes the guard to string_length >= buflen, rejecting the exact-length case and aligning the JSON formatter with the other content formatters (lwm2m_rw_plain_text.c, lwm2m_rw_oma_tlv.c, lwm2m_rw_senml_json.c, lwm2m_rw_cbor.c, lwm2m_rw_senml_cbor.c), which already used the correct boundary check. EPSS 0.4%Vulnerability | CVE Database V5 | ||
| Low | 3.1 | EPSS 0.1% | CVE-2026-14367zephyrproject zephyr · Race Low3.1EPSS 0.1%CVE Database V5CVE-2026-14367 The I3C IBI subsystem in drivers/i3c/i3c_ibi_workq.c hands out statically-allocated work nodes through a free-list i3c_ibi_work_nodes_free implemented as a plain sys_slist_t, which provides no synchronization. The allocation helpers (i3c_ibi_work_enqueue, i3c_ibi_work_enqueue_target_irq, i3c_ibi_work_enqueue_hotjoin, i3c_ibi_work_enqueue_controller_request, i3c_ibi_work_enqueue_cb) called sys_slist_get() directly from ISR context, while the workqueue handler i3c_ibi_work_handler() returned nodes with sys_slist_append() from the workqueue thread, with no lock on either side. Because sys_slist_get() and sys_slist_append() are neither atomic nor interrupt-safe, an IBI interrupt that fires while the workqueue thread is mid-append (or a truly parallel access under CONFIG_SMP) races on the shared list. This corrupts the list linkage: a node may be handed to two consumers, a node may be lost, or the head/tail pointers may be left inconsistent so sys_slist_get() returns a stale or garbage pointer. In the double-hand-out case the subsequent memcpy(ibi_node, ibi_work, sizeof(*ibi_node)) overwrites a node still in flight; a garbage pointer turns the same memcpy into an out-of-bounds write. The race is driven by I3C bus traffic — IBIs, hot-joins, and controller-role requests originate from target devices on the bus, and I3C supports hot-joining devices. An attacker controlling an I3C peripheral on the board's chip-to-chip bus can generate high-frequency interrupts timed to collide with the free operation. Exploitation requires physical access to the bus and winning a narrow timing window; the most realistic impact is a crash or hang (denial of service), with memory corruption possible but hard to control. The fix wraps all free-list sys_slist_get()/sys_slist_append() operations in the new ibi_work_alloc()/ibi_work_free() helpers, each guarded by a k_spinlock (ibi_work_lock), closing the race across ISR and thread contexts. EPSS 0.1%Vulnerability | CVE Database V5 | ||
| Medium | 6.4 | EPSS 0.2% | CVE-2026-14366zephyrproject zephyr · Use After Free Medium6.4EPSS 0.2%CVE Database V5CVE-2026-14366 The Silicon Labs SiWx917 WiFi driver's transmit callback siwx91x_send() in drivers/wifi/siwx91x/siwx91x_wifi.c frees a network packet it does not own. In the Zephyr TX path the net_pkt is owned by the L2/networking stack; the driver only borrows it to copy the frame bytes into a local net_buf. Before the fix, after transmitting, siwx91x_send() additionally called net_pkt_unref(pkt) on the caller-owned packet, dropping its last reference and returning it to the shared packet pool prematurely. This code path is compiled in by default (CONFIG_WIFI_SILABS_SIWX91X_NET_STACK_NATIVE). The caller, ethernet_send() in subsys/net/l2/ethernet/ethernet.c, keeps using the packet after the driver returns: it reads net_pkt_get_len(pkt), updates TX statistics, and then performs its own net_pkt_unref(pkt). Because the driver already released the packet, these are use-after-free reads followed by a second unref (a double free). When concurrent network activity recycles the freed slab slot between the two unrefs, the trailing unref decrements a different, live packet's reference count and frees it, corrupting the net_pkt pool shared by both the receive and transmit paths. The defect is exercised by ordinary transmission over the native-stack SiWx917 WiFi interface, and an adjacent attacker on the same WiFi network can induce transmissions (for example ARP or ICMP echo replies, or TCP handshakes) to drive the path. The primary observable impact is loss of availability (transmit hangs and crashes from pool corruption), with race-dependent memory corruption of the kernel networking buffer pool. The fix removes the erroneous net_pkt_unref(pkt) from siwx91x_send(); the driver's receive-path unref, which correctly frees a packet the driver itself allocated, is unaffected. EPSS 0.2%Vulnerability | CVE Database V5 | ||
| Low | 3.7 | EPSS 0.3% | CVE-2026-13735zephyrproject zephyr · Auth Low3.7EPSS 0.3%CVE Database V5CVE-2026-13735 Zephyr's WireGuard implementation in subsys/net/lib/wireguard/wg_crypto.c mishandled keepalive packets. In wg_process_data_message(), any type-4 transport-data message whose payload was exactly 16 bytes (an empty plaintext plus a bare Poly1305 tag, i.e. a keepalive) was accepted and returned immediately, before wg_decrypt_packet() was ever called. The Poly1305 authentication tag was therefore never verified; the only preceding gates were a cleartext receiver-index lookup (get_peer_keypair_for_index() on the attacker-supplied data_hdr->receiver) and a non-cryptographic keypair validity/expiry check. The path is reachable entirely from the network: inbound UDP on the WireGuard port is dispatched by wg_input() to handle_transport_data() and then wg_process_data_message(). The 32-bit receiver index is transmitted in cleartext in WireGuard handshake and data messages, so an on-path observer learns it directly and an off-path attacker can brute-force it against the UDP port. Given an active receiving-valid session for that index, an attacker could send a 16-byte garbage payload and have it accepted without possessing the session key. On acceptance the unauthenticated message caused the management layer to observe a spoofed NET_EVENT_VPN_CONNECTED signal (setting peer->first_valid and notifying any net_mgmt listener) and incremented the keepalive-RX statistic. The impact is limited to integrity of this status signal: no plaintext is decrypted or injected, no key is disclosed, and the early-return path did not update the peer endpoint or liveness timers, so there is no traffic-injection, session-takeover, or availability consequence. The fix removes the pre-decrypt early return so a 16-byte payload flows through wg_decrypt_packet(), which verifies the Poly1305 tag over the empty plaintext, followed by the existing anti-replay check; only an authenticated, non-replayed message is then recognised as a keepalive. Forged keepalives now fail the tag check and are counted as decrypt failures. EPSS 0.3%Vulnerability | CVE Database V5 | ||
| Medium | 6.5 | EPSS 0.3% | CVE-2026-13734zephyrproject zephyr · Auth Medium6.5EPSS 0.3%CVE Database V5CVE-2026-13734 Zephyr's WireGuard VPN data-plane receive handler wg_process_data_message() in subsys/net/lib/wireguard/wg_crypto.c validated the anti-replay counter too late. After AEAD decryption of a MESSAGE_TRANSPORT_DATA packet succeeded, the code committed several peer-state changes — update_peer_addr() (endpoint roaming update), the keypair->last_rx/peer->last_rx liveness timers, and keypair_update() (promote next→current and destroy the previous keypair) — and only afterward called wg_check_replay(). On a replayed packet the replay check returned -EINVAL, but none of the preceding mutations were rolled back. The AEAD tag authenticates content but not freshness, so a replayed-but-authentic transport packet decrypts correctly. An attacker who captures one valid ciphertext off the wire (an on-path or shared-medium observer) can re-inject it from an arbitrary spoofed source address. Reaching the handler requires no credentials: it is driven directly from inbound UDP datagrams via the dispatch in subsys/net/lib/wireguard/wg.c. Because the state mutations committed before the replay check, the replay repoints the peer endpoint to the attacker-chosen source address (roaming hijack), redirecting the victim's subsequent outbound tunnel traffic until the legitimate peer's next packet re-corrects it; it also prematurely destroys the previous keypair and refreshes the RX liveness timer. The tunnel payload stays encrypted under the session keypair, so this is an integrity/availability impact (traffic redirection and session disruption), not payload disclosure. The fix moves wg_check_replay() to immediately after a successful decrypt, before any peer-state mutation, matching the WireGuard specification and the Linux reference implementation. EPSS 0.3%Vulnerability | CVE Database V5 | ||
| Medium | 5.4 | EPSS 0.2% | CVE-2026-13481zephyrproject zephyr · Bounds Medium5.4EPSS 0.2%CVE Database V5CVE-2026-13481 CVE-2026-13481 is a medium severity vulnerability in the Zephyr project's IEEE 1588 PTP management-message parser. The flaw occurs because the parser mishandles the PTP_MGMT_TIME management ID by not validating the length of the TLV data before casting and accessing it. This can lead to an out-of-bounds read and a bounded in-place corruption of the parsed timestamp within the message buffer. The vulnerability allows an adjacent attacker on the local PTP segment to send a specially crafted message causing minor information exposure and corruption of the device's parsed management TIME value without causing crashes or broader memory corruption. A fix involves adding a length check before processing the timestamp data. EPSS 0.2%Vulnerability | CVE Database V5 | ||
| Low | 3.1 | EPSS 0.2% | CVE-2026-13480zephyrproject zephyr · Bounds Low3.1EPSS 0.2%CVE Database V5CVE-2026-13480 CVE-2026-13480 is a low-severity vulnerability in the Zephyr project's LoRaWAN TS004 Fragmented Data Block Transport handler. It involves an out-of-bounds read due to insufficient validation of payload length before accessing data structures during downlink command parsing. The flaw requires possession of the device's session keys and results in limited confidentiality impact without enabling code execution or memory corruption. EPSS 0.2%Vulnerability | CVE Database V5 | ||
| Low | 3.1 | EPSS 0.2% | CVE-2026-13479zephyrproject zephyr · Bounds Low3.1EPSS 0.2%CVE Database V5CVE-2026-13479 CVE-2026-13479 is a low-severity vulnerability in the Zephyr project's LoRaWAN clock-synchronization service. The vulnerability arises from insufficient bounds checking when parsing the AppTimeAns command in downlink messages, allowing a read of up to 5 bytes beyond the decrypted payload buffer. This over-read does not cause crashes or data disclosure but can cause a minor integrity impact by applying a garbage time correction to the device's clock offset. Exploitation requires a malicious or compromised network/application server or possession of session keys. A fix involves adding an explicit length check to drop too-short AppTimeAns messages. EPSS 0.2%Vulnerability | CVE Database V5 | ||
| Medium | 5.5 | EPSS 0.1% | CVE-2026-13478zephyrproject zephyr · Bounds Medium5.5EPSS 0.1%CVE Database V5CVE-2026-13478 CVE-2026-13478 is a medium severity vulnerability in the Zephyr ext2 filesystem driver that causes an out-of-bounds read during mounting of a crafted ext2 image. The flaw arises from improper bounds checking of the block bitmap size, allowing a large memory read beyond the allocated bitmap buffer. This leads to a denial of service by crashing the system when mounting attacker-controlled ext2 media. No information leak or code execution is possible. A fix is available that rejects images with oversized block counts before scanning. EPSS 0.1%Vulnerability | CVE Database V5 | ||
| Medium | 5.9 | EPSS 0.7% | CVE-2026-13217zephyrproject zephyr · Memory-safety Medium5.9EPSS 0.7%CVE Database V5CVE-2026-13217 CVE-2026-13217 is a memory-safety vulnerability in the Zephyr project's OCPP 1.6 client. It involves improper handling of server-supplied uid strings in the ocpp_process_server_msg() function, leading to a NULL pointer dereference when parsing malformed uid values. This can cause a remote denial of service on platforms that trap NULL pointer accesses. The vulnerability is triggered by network data from a malicious or compromised OCPP central system or a man-in-the-middle on non-TLS connections. The fix partially addresses the issue but does not fully guard against all NULL dereferences in the parsing logic. EPSS 0.7%Vulnerability | CVE Database V5 | ||
| Medium | 6.1 | EPSS 0.3% | CVE-2026-13216zephyrproject zephyr · Bounds Medium6.1EPSS 0.3%CVE Database V5CVE-2026-13216 CVE-2026-13216 is a vulnerability in the Zephyr project's virtio PCI driver where an unvalidated device-supplied capability length can cause out-of-bounds stack writes during device initialization. This occurs because a length value read from the PCI config space is only checked by an assert that is disabled in production builds, allowing attacker-controlled data to overflow a fixed-size buffer. The flaw can lead to kernel stack corruption and potential code execution or crashes when an untrusted virtio PCIe device is present. The vulnerability primarily affects bare-metal systems with untrusted devices or confidential computing scenarios where the guest must defend against the host. A fix replaces the disabled assert with a runtime range check to validate the length before copying data. EPSS 0.3%Vulnerability | CVE Database V5 | ||
| Medium | 6.8 | EPSS 0.3% | CVE-2026-13215zephyrproject zephyr · Bounds Medium6.8EPSS 0.3%CVE Database V5CVE-2026-13215 CVE-2026-13215 is a vulnerability in the Zephyr ext2 filesystem driver where the s_log_block_size field from the on-disk superblock is not properly validated during filesystem mount. This allows an attacker to supply a crafted ext2 image with a manipulated s_log_block_size value that can cause an out-of-bounds write in kernel memory. The flaw arises because the driver calculates a block size based on this unchecked field and uses it to initialize memory slabs without verifying buffer boundaries. This can lead to memory corruption with impacts ranging from denial of service to potential code execution in kernel mode. EPSS 0.3%Vulnerability | CVE Database V5 | ||
| Critical | 9.8 | EPSS 0.9% | CVE-2026-13214zephyrproject zephyr · Memory-safety Critical9.8EPSS 0.9%CVE Database V5CVE-2026-13214 CVE-2026-13214 is a critical stack buffer overflow vulnerability in the Zephyr project's OCPP 1.6 client. The flaw occurs in the parse_getconfig_msg() function when handling a GetConfiguration request, where an attacker-controlled JSON key string is copied without bounds into a fixed 50-byte stack buffer. This allows an attacker controlling the central system endpoint or a man-in-the-middle on an unencrypted connection to overflow the stack, potentially causing denial of service or remote code execution depending on system hardening. EPSS 0.9%Vulnerability | CVE Database V5 | ||
| Medium | 5.3 | EPSS 0.2% | CVE-2026-13213zephyrproject zephyr · Memory-safety Medium5.3EPSS 0.2%CVE Database V5CVE-2026-13213 The Hearing Access Service (HAS) GATT server in subsys/bluetooth/audio/has.c installs a connection-callback set unconditionally via BT_CONN_CB_DEFINE, so security_changed() runs for every connection that establishes security even before the application has called bt_has_register(). The service attribute pointers hearing_aid_features_attr, preset_control_point_attr, and active_preset_index_attr remain NULL until bt_has_register() resolves them and sets has.registered. With CONFIG_BT_SETTINGS, settings_set_cb() restores each bonded client's persisted context at boot and unconditionally sets context->flags to BONDED_CLIENT_INIT_FLAGS (non-zero). When a previously bonded peer reconnects and re-establishes security during the startup window before bt_has_register() has been called, security_changed() sees the non-zero flags and schedules notify_work_handler, which calls bt_gatt_is_subscribed() with a still-NULL attribute pointer. That triggers an assertion (__ASSERT(attr, ...) in bt_gatt_is_subscribed()), or a NULL dereference of attr->uuid when assertions are compiled out. The result is a remotely triggerable (Bluetooth, adjacent) crash of the HAS peripheral. Exploitation requires the peer to have previously bonded with the device and to reconnect within the boot-time race window before the application registers the service; a peer that reconnects persistently can prolong the outage. Impact is denial of service only, with no memory corruption or information disclosure. The fix adds an early if (!has.registered) { return; } guard in security_changed(), so no notification work is scheduled until the GATT service is registered and its attribute pointers are valid. EPSS 0.2%Vulnerability | CVE Database V5 | ||
| High | 8.8 | EPSS 0.4% | CVE-2026-13212zephyrproject zephyr · Memory-safety High8.8EPSS 0.4%CVE Database V5CVE-2026-13212 The Zephyr virtio driver does not validate the descriptor-chain head id that the virtio device writes into the used ring. In virtio_isr() (drivers/virtio/virtio_common.c), the device-written vq->used->ring[idx].id is used directly as an index into vq->recv_cbs[] and vq->desc[], which are both allocated with exactly vq->num entries. recv_cbs[] holds {cb, opaque} callback entries, and the indexed callback pointer is then invoked as cbe.cb(cbe.opaque, used_len). Because the id is consumed as a 16-bit value with no bound check, a malicious or compromised virtio backend (an untrusted hypervisor, or an untrusted hardware/peer-processor virtio device on a PCI or MMIO transport) can supply an id far beyond vq->num. This causes an out-of-bounds read of a {function pointer, argument} pair from heap memory beyond recv_cbs[], after which the driver calls that attacker-shaped pointer in the guest's interrupt context. No guest privileges or user interaction are required; the backend triggers it by writing the shared used ring and raising the queue interrupt. The result is an arbitrary / attacker-influenced function-pointer call in the Zephyr guest, i.e. a control-flow-hijack primitive that can lead to code execution or, at minimum, a reliable crash. The fix rejects any used-ring id >= vq->num before indexing recv_cbs[]/desc[] or invoking the callback. This affects builds using CONFIG_VIRTIO with the PCI or MMIO transport. EPSS 0.4%Vulnerability | CVE Database V5 |
Page 5 of 11