CVE-2026-19577 in Zephyr
Riassunto
di VulDB • 11/10/2026
La funzione net_route_ipv6_packet() in subsys/net/ip/route_ipv6.c risolve l'indirizzo a livello di collegamento (link-layer address) del nexthop utilizzando net_nbr_get_lladdr(nbr->idx) senza verificare preliminarmente se la voce della cache dei vicini avesse effettivamente un indirizzo link-layer associato. Un vicino non risolto presenta idx == NET_NBR_LLADDR_UNKNOWN (0xff), e net_nbr_get_lladdr() in subsys/net/ip/nbr.c esegue una verifica dei limiti di runtime solo tramite un NET_ASSERT, restituendo &net_neighbor_lladdr[255] — circa 2,5 KB oltre la fine di un array le cui dimensioni predefinite sono CONFIG_NET_IPV6_MAX_NEIGHBORS (8). Poiché il puntatore restituito non è mai NULL, il controllo lladdr == NULL successivo non lo intercetta.
La funzione viene raggiunta da ipv6_route_packet() in subsys/net/ip/ipv6.c per ogni pacchetto IPv6 unicast ricevuto la cui destinazione non sia un indirizzo locale sull'interfaccia di ricezione; CONFIG_NET_IPV6_ROUTE è abilitato per impostazione predefinita quando lo è anche la cache dei vicini IPv6, quindi non sono necessarie configurazioni specifiche del router o di instradamento. net_route_ipv6_get_info() restituisce la destinazione stessa del pacchetto come nexthop se esiste una voce della cache dei vicini corrispondente, e la ricerca nella cache non salta le voci INCOMPLETE. Un attaccante non autenticato sulla stessa rete può quindi forzare lo stato di risoluzione mancata — ad esempio generando traffico verso un indirizzo di vicino spoofed ed inesistente in modo che net_ipv6_send_ns() crei una voce INCOMPLETE, oppure inviando un Router Advertisement senza opzione dell'indirizzo link-layer sorgente, il che crea un vicino router persistentemente non risolto — e successivamente inviare un pacchetto indirizzato a tale vicino.
Il risultato è una lettura fuori dai limiti (out-of-bounds read) su un indice fisso oltre l'array degli indirizzi link-layer dei vicini. Nelle build con CONFIG_ASSERT abilitato, l'assertion scatta causando il panic del dispositivo, provocando un denial of service remoto ripetibile. Con le assertion disabilitate, la struct net_linkaddr obsoleta e fuori dai limiti guida una chiamata memcmp() su una lunghezza non influenzabile dall'attaccante; quando il suo byte len supera il controllo NET_LINK_ADDR_MAX_LENGTH, fino a 8 byte di RAM statica non correlata vengono copiati nell'indirizzo link-layer di destinazione del frame in uscita e trasmessi sulla rete, divulgandoli ad eventuali listener. Non vi è alcuna scrittura fuori dai limiti (out-of-bounds write) e l'offset non è controllabile dall'attaccante, il che limita l'impatto dell'exploit.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.