Linux: net: ip_tunnel: initialize `options_len` before referencing options
What fixes it
- 9907325257b4b382f26aafd5d9a8d47915907dd5LinuxCVE List
- 0f6a6beb01c068fcd5274eabf22c260039749feaLinuxCVE List
- 455ebeadf714f51e1dbbd6a022c74c9215b1cd76LinuxCVE 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:
net: ip_tunnel: initialize options_len before referencing options
The following command triggers a kernel panic:
ip link add d0 type dummy; ip link set d0 up ip route add 10.30.0.0/16 \ encap ip id 300 geneve_opts 4660:66:11223344 dev d0
memcpy: detected buffer overflow: 4 byte write of buffer size 0 kernel BUG at lib/string_helpers.c:1044! ... ip_tun_parse_opts.part.0.cold+0x10/0x10 ip_tun_build_state+0x116/0x2a0
On kernels built with GCC 15+ and CONFIG_FORTIFY_SOURCE, the fortified memcpy() got 0 sized destination with request of 4 bytes length:
static int ip_tun_parse_opts_geneve(...) { ... attr = tb[LWTUNNEL_IP_OPT_GENEVE_DATA]; data_len = nla_len(attr); /* == 4 */
struct geneve_opt *opt = ip_tunnel_info_opts(info) + opts_len; memcpy(opt->opt_data, nla_data(attr), data_len); /* ^^^^^^^^^^^^^ 0 since options_len is assigned afterwards */
Fixed by initializing the counter before the options are referenced. Matching what tunnel_key_opts_set() already does.
Text from CVE List
Affected versions 8
- Linuxaffected: bb5e62f2d547c4de6d1b144cbce2373a76c33f18 before 9907325257b4b382f26aafd5d9a8d47915907dd5CVE List
- Linuxaffected: bb5e62f2d547c4de6d1b144cbce2373a76c33f18 before 0f6a6beb01c068fcd5274eabf22c260039749feaCVE List
- Linuxaffected: bb5e62f2d547c4de6d1b144cbce2373a76c33f18 before 455ebeadf714f51e1dbbd6a022c74c9215b1cd76CVE List
- Linuxaffected: 6.15CVE List
- Linuxunaffected: all versions before 6.15CVE List
- Linuxunaffected: 6.18.54 through 6.18.*CVE List
- Linuxunaffected: 7.2.8 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List