Subject: CVE-2024-39487: bonding: Fix out-of-bounds read in bond_option_arp_ip_targets_set()

From: Greg Kroah-Hartman <[email-masked]>

Description
===========

In the Linux kernel, the following vulnerability has been resolved:

bonding: Fix out-of-bounds read in bond_option_arp_ip_targets_set()

In function bond_option_arp_ip_targets_set(), if newval->string is an
empty string, newval->string+1 will point to the byte after the
string, causing an out-of-bound read.

BUG: KASAN: slab-out-of-bounds in strlen+0x7d/0xa0 lib/string.c:418
Read of size 1 at addr ffff8881119c4781 by task syz-executor665/8107
CPU: 1 PID: 8107 Comm: syz-executor665 Not tainted 6.7.0-rc7 #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
Call Trace:
 <TASK>
 __dump_stack lib/dump_stack.c:88 [inline]
 dump_stack_lvl+0xd9/0x150 lib/dump_stack.c:106
 print_address_description mm/kasan/report.c:364 [inline]
 print_report+0xc1/0x5e0 mm/kasan/report.c:475
 kasan_report+0xbe/0xf0 mm/kasan/report.c:588
 strlen+0x7d/0xa0 lib/string.c:418
 __fortify_strlen include/linux/fortify-string.h:210 [inline]
 in4_pton+0xa3/0x3f0 net/core/utils.c:130
 bond_option_arp_ip_targets_set+0xc2/0x910
drivers/net/bonding/bond_options.c:1201
 __bond_opt_set+0x2a4/0x1030 drivers/net/bonding/bond_options.c:767
 __bond_opt_set_notify+0x48/0x150 drivers/net/bonding/bond_options.c:792
 bond_opt_tryset_rtnl+0xda/0x160 drivers/net/bonding/bond_options.c:817
 bonding_sysfs_store_option+0xa1/0x120 drivers/net/bonding/bond_sysfs.c:156
 dev_attr_store+0x54/0x80 drivers/base/core.c:2366
 sysfs_kf_write+0x114/0x170 fs/sysfs/file.c:136
 kernfs_fop_write_iter+0x337/0x500 fs/kernfs/file.c:334
 call_write_iter include/linux/fs.h:2020 [inline]
 new_sync_write fs/read_write.c:491 [inline]
 vfs_write+0x96a/0xd80 fs/read_write.c:584
 ksys_write+0x122/0x250 fs/read_write.c:637
 do_syscall_x64 arch/x86/entry/common.c:52 [inline]
 do_syscall_64+0x40/0x110 arch/x86/entry/common.c:83
 entry_SYSCALL_64_after_hwframe+0x63/0x6b
---[ end trace ]---

Fix it by adding a check of string length before using it.

The Linux kernel CVE team has assigned CVE-2024-39487 to this issue.

Affected and fixed versions
===========================

	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 4.19.318 with commit 6a8a4fd082c4
	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 5.4.280 with commit 6b21346b399f
	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 5.10.222 with commit 707c85ba3527
	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 5.15.163 with commit bfd14e5915c2
	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 6.1.98 with commit c8eb8ab9a44f
	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 6.6.39 with commit b75e33eae866
	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 6.9.9 with commit 9f835e48bd4c
	Issue introduced in 3.13 with commit f9de11a16594 and fixed in 6.10 with commit e271ff53807e

Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.

Unaffected versions might change over time as fixes are backported to
older supported kernel versions.  The official CVE entry at
	https://cve.org/CVERecord/?id=CVE-2024-39487
will be updated if fixes are backported, please check that for the most
up to date information about this issue.

Affected files
==============

The file(s) affected by this issue are:
	drivers/net/bonding/bond_options.c

Mitigation
==========

The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes.  Individual
changes are never tested alone, but rather are part of a larger kernel
release.  Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all.  If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
	https://git.kernel.org/stable/c/6a8a4fd082c439e19fede027e80c79bc4c84bb8e
	https://git.kernel.org/stable/c/6b21346b399fd1336fe59233a17eb5ce73041ee1
	https://git.kernel.org/stable/c/707c85ba3527ad6aa25552033576b0f1ff835d7b
	https://git.kernel.org/stable/c/bfd14e5915c2669f292a31d028e75dcd82f1e7e9
	https://git.kernel.org/stable/c/c8eb8ab9a44ff0e73492d0a12a643c449f641a9f
	https://git.kernel.org/stable/c/b75e33eae8667084bd4a63e67657c6a5a0f8d1e8
	https://git.kernel.org/stable/c/9f835e48bd4c75fdf6a9cff3f0b806a7abde78da
	https://git.kernel.org/stable/c/e271ff53807e8f2c628758290f0e499dbe51cb3d