CVE-2026-19577
Beschrijving NL
net_route_ipv6_packet() in subsys/net/ip/route_ipv6.c heeft het linklaagadres van de nexthop opgelost met net_nbr_get_lladdr (nbr- >idx) zonder eerst te controleren of de naburige cache-invoer daadwerkelijk een gekoppeld linklaagadres had. Een onopgeloste buurman draagt idx == NET_NBR_LLADDR_UNKNOWN (0xff), en net_nbr_get_lladdr () in subsys/net/ip/nbr.c voert geen runtime-bound-controle uit buiten een NET_ASSERT, return &net_neighbor_lladdr [255] — ongeveer 2,5 KB voorbij het einde van een array waarvan de standaardgrootte CONFIG_net_IPV6_MAX_NEIGHBORS is (8). Omdat de geretourneerde wijzer nooit NULL is, wordt deze niet opgevangen door de volgende lladdr == NULL guard. De functie wordt bereikt vanuit ipv6_route_packet() in subsys/net/ip/ipv6.c voor elk ontvangen unicast IPv6-pakket waarvan de bestemming geen lokaal adres op de ontvangende interface is; CONFIG_net_IPV6_ROUTE is standaard ingeschakeld wanneer de IPv6-buurcache is, dus er is geen router- of doorstuurconfiguratie nodig. net_route_ipv6_get_info() retourneert de bestemming van het pakket zelf als de nexthop wanneer er een naburige cache-item voor bestaat, en de cache-lookup slaat geen ONVOLLEDIGE vermeldingen over. Een niet-geverifieerde aanvaller op dezelfde link kan daarom de onopgeloste status forceren — bijvoorbeeld door verkeer naar een vervalst, niet-bestaand buuradres te lokken, zodat net_ipv6_send_ns() een ONVOLLEDIGE invoer maakt, of door een routeradvertentie te verzenden zonder optie voor een bronlink-laagadres, waardoor een aanhoudend onopgeloste routerbuur ontstaat — en vervolgens een pakket te verzenden dat aan die buur is gericht. Het resultaat is een out-of-bounds gelezen op een vaste index voorbij de adresmatrix van de buurlinklaag. Bij builds met CONFIG_ASSERT werden de assertievuren geactiveerd en raakte het apparaat in paniek, waardoor een herhaalbare denial of service op afstand werd gegeven. Met beweringen uitgeschakeld, stuurt de verouderde out-of-bounds struct net_linkaddr een memcmp () over een aanvaller-onbeïnvloede lengte en, wanneer de len byte de NET_LINK_ADDR_MAX_LENGTH controle passeert, worden tot 8 bytes niet-gerelateerde statische RAM gekopieerd naar het bestemmingslink-laagadres van het uitgaande frame en verzonden op de link, waardoor ze aan elke luisteraar worden bekendgemaakt. Er wordt niet buiten de grenzen geschreven en de offset wordt niet door de aanvaller gecontroleerd, wat de impact beperkt.
Origineel (Engels) tonen
net_route_ipv6_packet() in subsys/net/ip/route_ipv6.c resolved the nexthop's link-layer address with net_nbr_get_lladdr(nbr->idx) without first checking whether the neighbor cache entry actually had a linked link-layer address. An unresolved neighbor carries idx == 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, returning &net_neighbor_lladdr[255] — roughly 2.5 KB past the end of an array whose default size is CONFIG_NET_IPV6_MAX_NEIGHBORS (8). Because the returned pointer is never NULL, the following lladdr == NULL guard does not catch it.
The function is reached from ipv6_route_packet() in subsys/net/ip/ipv6.c for every received unicast IPv6 packet whose destination is not a local address on the receiving interface; CONFIG_NET_IPV6_ROUTE is enabled by default whenever the IPv6 neighbor cache is, so no router or forwarding configuration is needed. net_route_ipv6_get_info() returns the packet's destination itself as the nexthop when a neighbor cache entry for it exists, and the cache lookup does not skip INCOMPLETE entries. An unauthenticated attacker on the same link can therefore force the unresolved state — for example 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 — and then send a packet addressed to that neighbor.
The result is an out-of-bounds read at a fixed index past the neighbor link-layer address array. On builds with CONFIG_ASSERT enabled the assertion fires and the device panics, giving a repeatable remote denial of service. With assertions disabled, the stale out-of-bounds struct net_linkaddr drives a memcmp() over an attacker-uninfluenced length and, when 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, disclosing them to any listener. There is no out-of-bounds write and the offset is not attacker-controlled, which bounds the impact.