Linux: netfilter: ip6t_rt: fix zero-address non-strict match out-of-bounds read
What fixes it
- 959d1829d1ce8b91b435b24a923b51bcc8897090LinuxCVE List
- 5a54f8b7f7fe207a5c14713015a5820588faf1adLinuxCVE List
- 191239b0939692e92459d8d32cad14247fa93f89LinuxCVE List
- 82313c169eddc02b1bf5ba6b427803e272d3ec42LinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
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:
- Rejecting rules in rt_mt6_check() where IP6T_RT_FST_MASK is set but
rtinfo->addrnr is zero.
- 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.
Text from CVE List
Affected versions 18
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 959d1829d1ce8b91b435b24a923b51bcc8897090CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before fe336bab13834394320997de8b16ca4a913b4f13CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 5a54f8b7f7fe207a5c14713015a5820588faf1adCVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before b89249819a7d6698bed152feafd3bc6c08489d15CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before dd55c0ea87bf70e4e4b3b683acd29ef981335b26CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 191239b0939692e92459d8d32cad14247fa93f89CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before d9cf4ac6f326330e1fe4d95671d36a6ff3593f64CVE List
- Linuxaffected: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 before 82313c169eddc02b1bf5ba6b427803e272d3ec42CVE List
- Linuxaffected: 2.6.12CVE List
- Linuxunaffected: all versions before 2.6.12CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.112 through 6.12.*CVE List
- Linuxunaffected: 6.18.55 through 6.18.*CVE List
- Linuxunaffected: 7.2.9 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/959d1829d1ce8b91b435b24a923b51bcc8897090Referencevia CVE List
- git.kernel.org/stable/c/fe336bab13834394320997de8b16ca4a913b4f13Referencevia CVE List
- git.kernel.org/stable/c/5a54f8b7f7fe207a5c14713015a5820588faf1adReferencevia CVE List
- git.kernel.org/stable/c/b89249819a7d6698bed152feafd3bc6c08489d15Referencevia CVE List
- git.kernel.org/stable/c/dd55c0ea87bf70e4e4b3b683acd29ef981335b26Referencevia CVE List
- git.kernel.org/stable/c/191239b0939692e92459d8d32cad14247fa93f89Referencevia CVE List
- git.kernel.org/stable/c/d9cf4ac6f326330e1fe4d95671d36a6ff3593f64Referencevia CVE List
- git.kernel.org/stable/c/82313c169eddc02b1bf5ba6b427803e272d3ec42Referencevia CVE List