Skip to main content
Vulnerability Database/CVE-2026-19577

CVE-2026-19577: IPv6 Routing Out-of-Bounds Read DoS Vulnerability

CVE-2026-19577 is a denial of service flaw in IPv6 routing that triggers out-of-bounds memory reads through unresolved neighbor cache entries. Attackers can crash devices or leak memory contents. This post explains its impact, affected versions, and mitigation steps.

Published:

CVE-2026-19577 Overview

CVE-2026-19577 is an out-of-bounds read vulnerability [CWE-125] in the Zephyr RTOS IPv6 routing subsystem. The flaw resides in net_route_ipv6_packet() within subsys/net/ip/route_ipv6.c, which resolves a neighbor's link-layer address without first validating that the neighbor cache entry has a linked address. An unresolved neighbor carries idx == NET_NBR_LLADDR_UNKNOWN (0xff), causing net_nbr_get_lladdr() to return a pointer roughly 2.5 KB past the end of the net_neighbor_lladdr array. An unauthenticated attacker on the same link can trigger the condition remotely.

Critical Impact

Attackers on the same network segment can crash the device or leak up to 8 bytes of static RAM to any listener on the link.

Affected Products

  • Zephyr RTOS with CONFIG_NET_IPV6 enabled
  • Builds with CONFIG_NET_IPV6_ROUTE enabled (default when the IPv6 neighbor cache is active)
  • Devices with CONFIG_NET_IPV6_MAX_NEIGHBORS set to the default value of 8

Discovery Timeline

  • 2026-10-11 - CVE-2026-19577 published to NVD
  • 2026-10-15 - Last updated in NVD database

Technical Details for CVE-2026-19577

Vulnerability Analysis

The vulnerability arises in net_route_ipv6_packet() when it processes a unicast IPv6 packet whose destination is not local to the receiving interface. The function calls net_nbr_get_lladdr(nbr->idx) to resolve the next-hop link-layer address without checking whether the neighbor cache entry has a valid link-layer binding. When the neighbor is in the INCOMPLETE state, nbr->idx equals NET_NBR_LLADDR_UNKNOWN (0xff), and net_nbr_get_lladdr() in subsys/net/ip/nbr.c performs no runtime bounds check beyond a NET_ASSERT.

The function returns &net_neighbor_lladdr[255], which lies approximately 2.5 KB past the end of the array whose default size is 8. Because the returned pointer is non-NULL, the subsequent lladdr == NULL guard fails to catch the error. On builds with CONFIG_ASSERT enabled, the assertion fires and the device panics, producing a repeatable remote denial of service.

When assertions are disabled, the stale out-of-bounds struct net_linkaddr drives a memcmp() against uncontrolled memory. If its len byte passes the NET_LINK_ADDR_MAX_LENGTH check, up to 8 bytes of unrelated static RAM are copied into the outgoing frame's destination link-layer address and transmitted on the link.

Root Cause

The root cause is a missing precondition check before dereferencing the neighbor index. net_route_ipv6_get_info() returns the packet destination itself as the next hop when a cache entry exists, and the lookup does not skip INCOMPLETE entries. The downstream resolver trusts the index without validating that a link-layer address has been bound to it.

Attack Vector

An unauthenticated attacker on the same link forces a neighbor into the unresolved state. This can be done by eliciting traffic to a spoofed, non-existent neighbor address so that net_ipv6_send_ns() creates an INCOMPLETE entry, or by sending a Router Advertisement with no source link-layer address option, which creates a persistently unresolved router neighbor. The attacker then sends a packet addressed to that neighbor to trigger the out-of-bounds read.

c
 	    net_route_ll_addr_supported(out_iface) &&
 	    net_route_ll_addr_supported(net_pkt_iface(pkt)) &&
 	    net_route_ll_addr_supported(net_pkt_orig_iface(pkt))) {
+		if (nbr->idx == NET_NBR_LLADDR_UNKNOWN) {
+			NET_DBG("Neighbor %s has no link-layer (idx unknown)",
+				net_sprint_ipv6_addr(nexthop));
+			return -ESRCH;
+		}
+
 		lladdr = net_nbr_get_lladdr(nbr->idx);
 		if (lladdr == NULL) {
 			NET_DBG("Cannot find %s neighbor link layer address.",

Source: Zephyr Project patch commit b0b0e89

Detection Methods for CVE-2026-19577

Indicators of Compromise

  • Unexpected device panics or reboots on IPv6-capable Zephyr endpoints coinciding with inbound IPv6 unicast traffic
  • Router Advertisement messages on the local link that omit the source link-layer address option
  • Neighbor Solicitation storms targeting addresses that never resolve
  • Outbound Ethernet frames with destination MAC addresses that do not correspond to any known neighbor

Detection Strategies

  • Monitor link-local IPv6 traffic for malformed Router Advertisements lacking the SLLAO option
  • Correlate device crash telemetry with recent IPv6 Neighbor Discovery activity on the same segment
  • Inspect outbound frames from Zephyr-based devices for destination MAC values that do not match ARP or NDP caches

Monitoring Recommendations

  • Enable IPv6 Neighbor Discovery logging on managed switches serving Zephyr devices
  • Baseline crash and watchdog reset counters for embedded devices to flag anomalous spikes
  • Capture packet traces on segments hosting IoT devices to retain evidence of adjacent-network probes

How to Mitigate CVE-2026-19577

Immediate Actions Required

  • Apply the upstream Zephyr patch from commit b0b0e89 to all affected firmware images
  • Rebuild and redeploy firmware for every Zephyr device with CONFIG_NET_IPV6_ROUTE enabled
  • Restrict adjacent-network access to IPv6-capable embedded devices by segmenting them from untrusted endpoints

Patch Information

The fix adds an explicit check for nbr->idx == NET_NBR_LLADDR_UNKNOWN before calling net_nbr_get_lladdr(), returning -ESRCH when the neighbor has no link-layer binding. Refer to the GitHub Security Advisory GHSA-vv76-4m89-95q5 and the upstream patch commit for integration details.

Workarounds

  • Disable CONFIG_NET_IPV6_ROUTE where IPv6 forwarding is not required by the application
  • Deploy RA Guard or equivalent switch-level filtering to block malformed Router Advertisements
  • Place vulnerable devices on isolated VLANs where only trusted neighbors can reach them
bash
# Kconfig workaround: disable IPv6 routing where not required
# In prj.conf for the Zephyr build
CONFIG_NET_IPV6_ROUTE=n

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.