{
    "dataType": "CVE_RECORD",
    "dataVersion": "5.2",
    "cveMetadata": {
        "cveId": "CVE-2026-19577",
        "assignerOrgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
        "state": "PUBLISHED",
        "assignerShortName": "zephyr",
        "dateReserved": "2026-08-11T19:57:38.944Z",
        "datePublished": "2026-10-11T17:14:55.032Z",
        "dateUpdated": "2026-10-11T17:14:55.032Z"
    },
    "containers": {
        "cna": {
            "providerMetadata": {
                "orgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
                "shortName": "zephyr",
                "dateUpdated": "2026-10-11T17:14:55.032Z"
            },
            "title": "Out-of-bounds read in IPv6 route forwarding when the nexthop neighbor has no link-layer address",
            "descriptions": [
                {
                    "lang": "en",
                    "value": "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.\n\nThe 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.\n\nThe 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."
                }
            ],
            "affected": [
                {
                    "vendor": "zephyrproject",
                    "product": "zephyr",
                    "collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
                    "packageName": "zephyr",
                    "defaultStatus": "unaffected",
                    "programFiles": [
                        "subsys/net/ip/route.c",
                        "subsys/net/ip/route_ipv6.c"
                    ],
                    "programRoutines": [
                        {
                            "name": "net_route_ipv6_packet"
                        },
                        {
                            "name": "net_route_packet"
                        }
                    ],
                    "versions": [
                        {
                            "version": "1.8.0",
                            "status": "affected",
                            "lessThan": "4.5.0",
                            "versionType": "semver"
                        }
                    ]
                }
            ],
            "references": [
                {
                    "url": "https://github.com/zephyrproject-rtos/zephyr/commit/b0b0e8973d1967114adbb9ed1611d448b5a46519",
                    "name": "Fix commit",
                    "tags": [
                        "patch"
                    ]
                },
                {
                    "url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-vv76-4m89-95q5",
                    "name": "GHSA-vv76-4m89-95q5"
                }
            ],
            "metrics": [
                {
                    "format": "CVSS",
                    "cvssV3_1": {
                        "version": "3.1",
                        "vectorString": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H",
                        "baseScore": 7.1,
                        "baseSeverity": "HIGH"
                    }
                }
            ],
            "problemTypes": [
                {
                    "descriptions": [
                        {
                            "lang": "en",
                            "description": "bounds",
                            "cweId": "CWE-125",
                            "type": "CWE"
                        }
                    ]
                }
            ],
            "x_generator": {
                "engine": "cvelib 1.8.0"
            }
        }
    }
}