In the Linux kernel, the following vulnerability has been resolved:
ipv6: Add lwtunnel encap size of all siblings in nexthop calculation
In function rt6nlmsgsize(), the length of nexthop is calculated by multipling the nexthop length of fib6info and the number of siblings. However if the fib6info has no lwtunnel but the siblings have lwtunnels, the nexthop length is less than it should be, and it will trigger a warning in inet6rtnotify() as follows:
WARNING: CPU: 0 PID: 6082 at net/ipv6/route.c:6180 inet6rtnotify+0x120/0x130 ...... Call Trace: <TASK> fib6addrt2node+0x685/0xa30 fib6add+0x96/0x1b0 ip6routeadd+0x50/0xd0 inet6rtmnewroute+0x97/0xa0 rtnetlinkrcvmsg+0x156/0x3d0 netlinkrcvskb+0x5a/0x110 netlinkunicast+0x246/0x350 netlinksendmsg+0x250/0x4c0 socksendmsg+0x66/0x70 _syssendmsg+0x7c/0xd0 _syssendmsg+0x5d/0xb0 dosyscall64+0x3f/0x90 entrySYSCALL64after_hwframe+0x72/0xdc
This bug can be reproduced by script:
ip -6 addr add 2002::2/64 dev ens2 ip -6 route add 100::/64 via 2002::1 dev ens2 metric 100
for i in 10 20 30 40 50 60 70; do ip link add link ens2 name ipv$i type ipvlan ip -6 addr add 2002::$i/64 dev ipv$i ifconfig ipv_$i up done
for i in 10 20 30 40 50 60; do ip -6 route append 100::/64 encap ip6 dst 2002::$i via 2002::1 dev ipv_$i metric 100 done
ip -6 route append 100::/64 via 2002::1 dev ipv_70 metric 100
This patch fixes it by adding nexthoplen of every siblings using rt6nhnlmsgsize().