HIGH Introduced in 2.6.12
netfilter ZeroAddr OOB Read
CVE-2026-98485
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:H
01Description
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.
02KernelScan AI Analysis
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.
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.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 5.10 | 2.6.12 | 5.10.271 | 959d1829d1ce |
| 5.15 | 2.6.12 | 5.15.222 | fe336bab1383 |
| 6.1 | 2.6.12 | 6.1.189 | 5a54f8b7f7fe |
| 6.12 | 2.6.12 | 6.12.112 | dd55c0ea87bf |
| 6.18 | 2.6.12 | 6.18.55 | 191239b09396 |
| 6.6 | 2.6.12 | 6.6.158 | b89249819a7d |
| 7.2 | 2.6.12 | 7.2.9 | d9cf4ac6f326 |
| mainline | 2.6.12 | 7.3 | 82313c169edd |
| cip/5.10 | 2.6.12 | 5.10.271-cip78 | 959d1829d1ce |
| cip/6.1 | 2.6.12 | 6.1.189-cip61 | 5a54f8b7f7fe |
| cip/6.1-rt | 2.6.12 | 6.1.189-cip61-rt32 | 5a54f8b7f7fe |
| cip/6.12 | 2.6.12 | 6.12.112-cip33 | dd55c0ea87bf |
04CIP Kernels
State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.
| CIP tree | State |
|---|---|
| cip/6.12 | Fixed in 6.12.112-cip33 |
| cip/6.1 | Fixed in 6.1.189-cip61 |
| cip/6.1-rt | Fixed in 6.1.189-cip61-rt32 |
| cip/5.10 | Fixed in 5.10.271-cip78 |
| cip/5.10-rt | Affected — no CIP fix yet (latest 5.10.268-cip77-rt34) |
| cip/4.19 | Affected — no CIP fix yet (latest 4.19.325-cip136) |
| cip/4.19-rt | Affected — no CIP fix yet (latest 4.19.325-cip136-rt50) |
| cip/4.4 | Affected — no CIP fix yet (latest 4.4.302-cip115) |
| cip/4.4-rt | Affected — no CIP fix yet (latest 4.4.302-cip115-rt63) |