Zephyr's IPv6 forwarding path re-sent routed unicast packets without ever decrementing the IPv6 hop limit. Both routing branches of ipv6_route_packet() (subsys/net/ip) were affected: the explicit-route path (net_route_packet()) and the on-link cross-interface path (net_route_packet_if()). Each set the packet forwarding flag and called net_send_data() with the hop limit untouched and no expiry check.
Per RFC 8200 the hop-limit decrement is the mechanism that bounds packet lifetime and terminates routing loops; without it, a device acting as an IPv6 router relays looping packets indefinitely. An on-path attacker who can induce or exploit a transient L3 loop turns it into a permanent forwarding storm, causing CPU/bandwidth resource exhaustion (availability DoS) on the forwarder and adjacent links; path-discovery and loop diagnostics that rely on hop-limit expiry are also defeated.
Affected configurations. In every affected release the forwarding path is reached via CONFIG_NET_ROUTE (enabled by default when CONFIG_NET_IPV6_NBR_CACHE is set), together with CONFIG_NET_ROUTING for cross-interface routing. Note that CONFIG_NET_IPV6_FORWARDING and CONFIG_NET_IPV4_FORWARDING — which appear in the fix and in this advisory's evidence notes — were introduced after v4.4.0, when the routing options were split and renamed; they do not exist in any affected release. When auditing a v4.4.1-or-earlier configuration, look for CONFIG_NET_ROUTE and CONFIG_NET_ROUTING.
IPv4 is not affected in any release. The IPv4 forwarding path (net_route_ipv4_packet() in route_ipv4.c) was added after v4.4.0 and has never shipped in a release. Its TTL decrement and IPv4 header-checksum recomputation landed on main as part of the same fix, so the evidence notes below discuss it, but no released version is reachable by way of IPv4.
Affected releases are v1.8.0 through v4.4.1: v1.8.0 introduced net_route_packet() and v2.2.0 added net_route_packet_if(), and neither decremented the hop limit. v4.3.1 carries the explicit-route fix but not the on-link one, so it is affected as well. Fixed on main by 7d8f1af (explicit-route path) and 589eadc (on-link path).
Affected components
Affected versions
>= 1.8.0, <= 4.4.1
Fix
Fixed (merged) in 7d8f1af
Projected fixed version: 4.5.0 (the fix is merged on main but not yet released; this forecast should be confirmed against the actual release).
Introduced by: predates v4.4.0 — IP forwarding feature never decremented TTL/hop-limit on the unicast forward path
Evidence
- subsys/net/ip/route_ipv4.c:194-217 — post-fix: decrements ttl, drops at <=1 (-ETIMEDOUT), recomputes IPv4 checksum when forwarding; this logic was absent pre-fix
- subsys/net/ip/route_ipv6.c:507-514 — post-fix: drops at hop_limit<=1 and decrements when forwarding
- git show v4.4.0:subsys/net/ip/route.c:1107,1140 — released v4.4.0 unicast forward helpers set forwarding=true with no ttl--/hop_limit-- (vulnerable code shipped)
- git show v4.4.0:subsys/net/ip/ipv4.c — input only checks 'if (hdr->ttl == 0) drop'; TTL never decremented on the forward path
- subsys/net/ip/ipv4.c:440-457 / ipv6.c:631-641 — input dispatches 'not for me' packets to the route/forward path, the attacker-reachable entry point
- subsys/net/ip/route.c:582-607 — net_route_packet_if (on-link cross-iface forward) still calls net_send_data with no TTL/hop-limit decrement after the fix: residual variant
- subsys/net/ip/Kconfig.ipv4:221-227 — NET_IPV4_FORWARDING is an opt-in but first-class router/gateway feature
Patches
Fix 1 — #109585
Fix 2 — #111497
For more information
If you have any questions or comments about this advisory:
embargo: 2026-07-31
Zephyr's IPv6 forwarding path re-sent routed unicast packets without ever decrementing the IPv6 hop limit. Both routing branches of
ipv6_route_packet()(subsys/net/ip) were affected: the explicit-route path (net_route_packet()) and the on-link cross-interface path (net_route_packet_if()). Each set the packet forwarding flag and callednet_send_data()with the hop limit untouched and no expiry check.Per RFC 8200 the hop-limit decrement is the mechanism that bounds packet lifetime and terminates routing loops; without it, a device acting as an IPv6 router relays looping packets indefinitely. An on-path attacker who can induce or exploit a transient L3 loop turns it into a permanent forwarding storm, causing CPU/bandwidth resource exhaustion (availability DoS) on the forwarder and adjacent links; path-discovery and loop diagnostics that rely on hop-limit expiry are also defeated.
Affected configurations. In every affected release the forwarding path is reached via
CONFIG_NET_ROUTE(enabled by default whenCONFIG_NET_IPV6_NBR_CACHEis set), together withCONFIG_NET_ROUTINGfor cross-interface routing. Note thatCONFIG_NET_IPV6_FORWARDINGandCONFIG_NET_IPV4_FORWARDING— which appear in the fix and in this advisory's evidence notes — were introduced after v4.4.0, when the routing options were split and renamed; they do not exist in any affected release. When auditing a v4.4.1-or-earlier configuration, look forCONFIG_NET_ROUTEandCONFIG_NET_ROUTING.IPv4 is not affected in any release. The IPv4 forwarding path (
net_route_ipv4_packet()inroute_ipv4.c) was added after v4.4.0 and has never shipped in a release. Its TTL decrement and IPv4 header-checksum recomputation landed onmainas part of the same fix, so the evidence notes below discuss it, but no released version is reachable by way of IPv4.Affected releases are v1.8.0 through v4.4.1: v1.8.0 introduced
net_route_packet()and v2.2.0 addednet_route_packet_if(), and neither decremented the hop limit. v4.3.1 carries the explicit-route fix but not the on-link one, so it is affected as well. Fixed onmainby 7d8f1af (explicit-route path) and 589eadc (on-link path).Affected components
subsys/net/ipAffected versions
>= 1.8.0, <= 4.4.1Fix
Fixed (merged) in 7d8f1af
Projected fixed version: 4.5.0 (the fix is merged on
mainbut not yet released; this forecast should be confirmed against the actual release).Introduced by: predates v4.4.0 — IP forwarding feature never decremented TTL/hop-limit on the unicast forward path
Evidence
Patches
Fix 1 — #109585
mainv4.4-branchv4.3-branchv3.7-branchFix 2 — #111497
mainv4.4-branchv4.3-branchv3.7-branchFor more information
If you have any questions or comments about this advisory:
embargo: 2026-07-31