KernelScan.io

HIGH Introduced in 2.6.12

netfilter ZeroAddr OOB Read

CVE-2026-98485

CVSS 7.4 / 10.0 KernelScan AI

CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:H

01

In the Linux kernel, the following vulnerability has been resolved: netfilter: ip6t_rt: fix zero-address non-strict match out-of-bounds read rt_mt6_check() permits rules to be configured with rtinfo->addrnr == 0 even when address matching (IP6T_RT_FST_MASK) is requested. In the IP6T_RT_FST_NSTRICT path, rt_mt6() evaluates packet routing addresses against rtinfo->addrs[i] and terminates backwards at the bottom of the loop: if (ipv6_addr_equal(ap, &rtinfo->addrs[i])) { i++; } if (i == rtinfo->addrnr) break; When addrnr is 0, if the first packet address matches rtinfo->addrs[0], i is incremented to 1. Because i is now strictly greater than addrnr (0), the loop termination condition (i == rtinfo->addrnr) is bypassed and will never be satisfied. If a crafted IPv6 packet contains matching routing addresses, i will advance past IP6T_RT_HOPS (16). The subsequent call to ipv6_addr_equal() reads beyond struct ip6t_rt, triggering UBSAN/KASAN out-of-bounds warnings or kernel panics. Fix this by: 1. Rejecting rules in rt_mt6_check() where IP6T_RT_FST_MASK is set but rtinfo->addrnr is zero. 2. In rt_mt6(), moving the termination condition (i < rtinfo->addrnr) into the for-loop header condition and removing the backwards break at the end of the loop body.

02

Engine v0.9.0

Risk summary

A flaw in the IPv6 routing header match module (ip6t_rt) allows an out-of-bounds read when a firewall rule is configured to match routing header addresses but provides zero addresses. An attacker who can send crafted IPv6 packets with routing headers to a system with such a rule installed can read kernel memory beyond the rule structure, potentially leaking sensitive data or causing a kernel panic.

Affectednet/ipv6/netfilter/ip6t_rt.c (netfilter IPv6 rt match)

Vulnerability analysis

The IPv6 routing header match module allows firewall rules to be created that request address matching but provide no addresses to match against. When such a rule encounters a packet with a routing header whose first address happens to match the (non-existent) rule address, an internal loop counter increments past zero and the loop's exit condition is never met. The loop then continues reading past the end of the rule's address array, accessing adjacent kernel memory. This can leak kernel data or crash the system. The fix rejects invalid rules at creation time and corrects the loop logic to stop at the declared address count.

03

BranchIntroducedFixed inPatch commit
5.102.6.125.10.271959d1829d1ce
5.152.6.125.15.222fe336bab1383
6.12.6.126.1.1895a54f8b7f7fe
6.122.6.126.12.112dd55c0ea87bf
6.182.6.126.18.55191239b09396
6.62.6.126.6.158b89249819a7d
7.22.6.127.2.9d9cf4ac6f326
mainline2.6.127.382313c169edd
cip/5.102.6.125.10.271-cip78959d1829d1ce
cip/6.12.6.126.1.189-cip615a54f8b7f7fe
cip/6.1-rt2.6.126.1.189-cip61-rt325a54f8b7f7fe
cip/6.122.6.126.12.112-cip33dd55c0ea87bf

04

State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.

CIP treeState
cip/6.12Fixed in 6.12.112-cip33
cip/6.1Fixed in 6.1.189-cip61
cip/6.1-rtFixed in 6.1.189-cip61-rt32
cip/5.10Fixed in 5.10.271-cip78
cip/5.10-rtAffected — no CIP fix yet (latest 5.10.268-cip77-rt34)
cip/4.19Affected — no CIP fix yet (latest 4.19.325-cip136)
cip/4.19-rtAffected — no CIP fix yet (latest 4.19.325-cip136-rt50)
cip/4.4Affected — no CIP fix yet (latest 4.4.302-cip115)
cip/4.4-rtAffected — no CIP fix yet (latest 4.4.302-cip115-rt63)