[PATCH net] tun: prevent negative ifindex

9 views
Skip to first unread message

Eric Dumazet

unread,
Oct 16, 2023, 2:08:54 PM10/16/23
to David S . Miller, Jakub Kicinski, Paolo Abeni, net...@vger.kernel.org, eric.d...@gmail.com, Eric Dumazet, syzbot
After commit 956db0a13b47 ("net: warn about attempts to register
negative ifindex") syzbot is able to trigger the following splat.

Negative ifindex are not supported.

WARNING: CPU: 1 PID: 6003 at net/core/dev.c:9596 dev_index_reserve+0x104/0x210
Modules linked in:
CPU: 1 PID: 6003 Comm: syz-executor926 Not tainted 6.6.0-rc4-syzkaller-g19af4a4ed414 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/06/2023
pstate: 80400005 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : dev_index_reserve+0x104/0x210
lr : dev_index_reserve+0x100/0x210
sp : ffff800096a878e0
x29: ffff800096a87930 x28: ffff0000d04380d0 x27: ffff0000d04380f8
x26: ffff0000d04380f0 x25: 1ffff00012d50f20 x24: 1ffff00012d50f1c
x23: dfff800000000000 x22: ffff8000929c21c0 x21: 00000000ffffffea
x20: ffff0000d04380e0 x19: ffff800096a87900 x18: ffff800096a874c0
x17: ffff800084df5008 x16: ffff80008051f9c4 x15: 0000000000000001
x14: 1fffe0001a087198 x13: 0000000000000000 x12: 0000000000000000
x11: 0000000000000000 x10: 0000000000000000 x9 : 0000000000000000
x8 : ffff0000d41c9bc0 x7 : 0000000000000000 x6 : 0000000000000000
x5 : ffff800091763d88 x4 : 0000000000000000 x3 : ffff800084e04748
x2 : 0000000000000001 x1 : 00000000fead71c7 x0 : 0000000000000000
Call trace:
dev_index_reserve+0x104/0x210
register_netdevice+0x598/0x1074 net/core/dev.c:10084
tun_set_iff+0x630/0xb0c drivers/net/tun.c:2850
__tun_chr_ioctl+0x788/0x2af8 drivers/net/tun.c:3118
tun_chr_ioctl+0x38/0x4c drivers/net/tun.c:3403
vfs_ioctl fs/ioctl.c:51 [inline]
__do_sys_ioctl fs/ioctl.c:871 [inline]
__se_sys_ioctl fs/ioctl.c:857 [inline]
__arm64_sys_ioctl+0x14c/0x1c8 fs/ioctl.c:857
__invoke_syscall arch/arm64/kernel/syscall.c:37 [inline]
invoke_syscall+0x98/0x2b8 arch/arm64/kernel/syscall.c:51
el0_svc_common+0x130/0x23c arch/arm64/kernel/syscall.c:136
do_el0_svc+0x48/0x58 arch/arm64/kernel/syscall.c:155
el0_svc+0x58/0x16c arch/arm64/kernel/entry-common.c:678
el0t_64_sync_handler+0x84/0xfc arch/arm64/kernel/entry-common.c:696
el0t_64_sync+0x190/0x194 arch/arm64/kernel/entry.S:595
irq event stamp: 11348
hardirqs last enabled at (11347): [<ffff80008a716574>] __raw_spin_unlock_irqrestore include/linux/spinlock_api_smp.h:151 [inline]
hardirqs last enabled at (11347): [<ffff80008a716574>] _raw_spin_unlock_irqrestore+0x38/0x98 kernel/locking/spinlock.c:194
hardirqs last disabled at (11348): [<ffff80008a627820>] el1_dbg+0x24/0x80 arch/arm64/kernel/entry-common.c:436
softirqs last enabled at (11138): [<ffff8000887ca53c>] spin_unlock_bh include/linux/spinlock.h:396 [inline]
softirqs last enabled at (11138): [<ffff8000887ca53c>] release_sock+0x15c/0x1b0 net/core/sock.c:3531
softirqs last disabled at (11136): [<ffff8000887ca41c>] spin_lock_bh include/linux/spinlock.h:356 [inline]
softirqs last disabled at (11136): [<ffff8000887ca41c>] release_sock+0x3c/0x1b0 net/core/sock.c:3518

Fixes: fb7589a16216 ("tun: Add ability to create tun device with given index")
Reported-by: syzbot <syzk...@googlegroups.com>
Signed-off-by: Eric Dumazet <edum...@google.com>
---
drivers/net/tun.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 89ab9efe522c30bd167d690f60c6b18fc29680a5..afa5497f7c35c3ab5682e66440afc8a888d14414 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -3073,10 +3073,11 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
struct net *net = sock_net(&tfile->sk);
struct tun_struct *tun;
void __user* argp = (void __user*)arg;
- unsigned int ifindex, carrier;
+ unsigned int carrier;
struct ifreq ifr;
kuid_t owner;
kgid_t group;
+ int ifindex;
int sndbuf;
int vnet_hdr_sz;
int le;
@@ -3132,7 +3133,9 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
ret = -EFAULT;
if (copy_from_user(&ifindex, argp, sizeof(ifindex)))
goto unlock;
-
+ ret = -EINVAL;
+ if (ifindex < 0)
+ goto unlock;
ret = 0;
tfile->ifindex = ifindex;
goto unlock;
--
2.42.0.655.g421f12c284-goog

Stephen Hemminger

unread,
Oct 16, 2023, 3:33:23 PM10/16/23
to Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni, net...@vger.kernel.org, eric.d...@gmail.com, syzbot
On Mon, 16 Oct 2023 18:08:51 +0000
Eric Dumazet <edum...@google.com> wrote:

> + ret = -EINVAL;
> + if (ifindex < 0)
> + goto unlock;

Shouldn't this be <= 0 since 0 is not a valid ifindex.
Zero ifindex is used as a sentinel in some API's

For example: if_nametoindex() returns 0 if name is not found.

Eric Dumazet

unread,
Oct 16, 2023, 3:42:25 PM10/16/23
to Stephen Hemminger, David S . Miller, Jakub Kicinski, Paolo Abeni, net...@vger.kernel.org, eric.d...@gmail.com, syzbot
Setting tfile->ifindex to zero should be a NOP ?

This means dev_index_reserve() will allocate a ifindex for us.

Not sure we want to prevent something that was working properly in the past.

Stephen Hemminger

unread,
Oct 16, 2023, 4:57:33 PM10/16/23
to Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni, net...@vger.kernel.org, eric.d...@gmail.com, syzbot
On Mon, 16 Oct 2023 21:42:10 +0200
Eric Dumazet <edum...@google.com> wrote:

> Setting tfile->ifindex to zero should be a NOP ?
>
> This means dev_index_reserve() will allocate a ifindex for us.
>
> Not sure we want to prevent something that was working properly in the past.

That makes sense. did not read ahead to see what happens

Willem de Bruijn

unread,
Oct 16, 2023, 8:55:34 PM10/16/23
to Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni, net...@vger.kernel.org, eric.d...@gmail.com, Eric Dumazet, syzbot
Reviewed-by: Willem de Bruijn <wil...@google.com>

Jason Wang

unread,
Oct 17, 2023, 3:07:00 AM10/17/23
to Willem de Bruijn, Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni, net...@vger.kernel.org, eric.d...@gmail.com, syzbot
Acked-by: Jason Wang <jaso...@redhat.com>

Thanks

>
>

patchwork-b...@kernel.org

unread,
Oct 17, 2023, 9:00:28 PM10/17/23
to Eric Dumazet, da...@davemloft.net, ku...@kernel.org, pab...@redhat.com, net...@vger.kernel.org, eric.d...@gmail.com, syzk...@googlegroups.com
Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <ku...@kernel.org>:
> [...]

Here is the summary with links:
- [net] tun: prevent negative ifindex
https://git.kernel.org/netdev/net/c/cbfbfe3aee71

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html


Greg Kroah-Hartman

unread,
Oct 23, 2023, 7:05:14 AM10/23/23
to sta...@vger.kernel.org, Greg Kroah-Hartman, pat...@lists.linux.dev, syzbot, Eric Dumazet, Willem de Bruijn, Jason Wang, Jakub Kicinski
6.5-stable review patch. If anyone has any objections, please let me know.

------------------

From: Eric Dumazet <edum...@google.com>

commit cbfbfe3aee718dc4c3c837f5d2463170ee59d78c upstream.
Fixes: fb7589a16216 ("tun: Add ability to create tun device with given index")
Reported-by: syzbot <syzk...@googlegroups.com>
Signed-off-by: Eric Dumazet <edum...@google.com>
Reviewed-by: Willem de Bruijn <wil...@google.com>
Acked-by: Jason Wang <jaso...@redhat.com>
Link: https://lore.kernel.org/r/20231016180851.3...@google.com
Signed-off-by: Jakub Kicinski <ku...@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
drivers/net/tun.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -3068,10 +3068,11 @@ static long __tun_chr_ioctl(struct file
struct net *net = sock_net(&tfile->sk);
struct tun_struct *tun;
void __user* argp = (void __user*)arg;
- unsigned int ifindex, carrier;
+ unsigned int carrier;
struct ifreq ifr;
kuid_t owner;
kgid_t group;
+ int ifindex;
int sndbuf;
int vnet_hdr_sz;
int le;
@@ -3127,7 +3128,9 @@ static long __tun_chr_ioctl(struct file
ret = -EFAULT;
if (copy_from_user(&ifindex, argp, sizeof(ifindex)))
goto unlock;
-
+ ret = -EINVAL;
+ if (ifindex < 0)
+ goto unlock;

Greg Kroah-Hartman

unread,
Oct 23, 2023, 7:23:02 AM10/23/23
to sta...@vger.kernel.org, Greg Kroah-Hartman, pat...@lists.linux.dev, syzbot, Eric Dumazet, Willem de Bruijn, Jason Wang, Jakub Kicinski
6.1-stable review patch. If anyone has any objections, please let me know.
@@ -3056,10 +3056,11 @@ static long __tun_chr_ioctl(struct file
struct net *net = sock_net(&tfile->sk);
struct tun_struct *tun;
void __user* argp = (void __user*)arg;
- unsigned int ifindex, carrier;
+ unsigned int carrier;
struct ifreq ifr;
kuid_t owner;
kgid_t group;
+ int ifindex;
int sndbuf;
int vnet_hdr_sz;
int le;
@@ -3115,7 +3116,9 @@ static long __tun_chr_ioctl(struct file

Greg Kroah-Hartman

unread,
Oct 23, 2023, 7:31:50 AM10/23/23
to sta...@vger.kernel.org, Greg Kroah-Hartman, pat...@lists.linux.dev, syzbot, Eric Dumazet, Willem de Bruijn, Jason Wang, Jakub Kicinski
5.4-stable review patch. If anyone has any objections, please let me know.
@@ -3134,10 +3134,11 @@ static long __tun_chr_ioctl(struct file
struct net *net = sock_net(&tfile->sk);
struct tun_struct *tun;
void __user* argp = (void __user*)arg;
- unsigned int ifindex, carrier;
+ unsigned int carrier;
struct ifreq ifr;
kuid_t owner;
kgid_t group;
+ int ifindex;
int sndbuf;
int vnet_hdr_sz;
int le;
@@ -3194,7 +3195,9 @@ static long __tun_chr_ioctl(struct file

Greg Kroah-Hartman

unread,
Oct 23, 2023, 7:36:39 AM10/23/23
to sta...@vger.kernel.org, Greg Kroah-Hartman, pat...@lists.linux.dev, syzbot, Eric Dumazet, Willem de Bruijn, Jason Wang, Jakub Kicinski
5.15-stable review patch. If anyone has any objections, please let me know.
@@ -3010,10 +3010,11 @@ static long __tun_chr_ioctl(struct file
struct net *net = sock_net(&tfile->sk);
struct tun_struct *tun;
void __user* argp = (void __user*)arg;
- unsigned int ifindex, carrier;
+ unsigned int carrier;
struct ifreq ifr;
kuid_t owner;
kgid_t group;
+ int ifindex;
int sndbuf;
int vnet_hdr_sz;
int le;
@@ -3069,7 +3070,9 @@ static long __tun_chr_ioctl(struct file

Greg Kroah-Hartman

unread,
Oct 23, 2023, 7:47:18 AM10/23/23
to sta...@vger.kernel.org, Greg Kroah-Hartman, pat...@lists.linux.dev, syzbot, Eric Dumazet, Willem de Bruijn, Jason Wang, Jakub Kicinski
5.10-stable review patch. If anyone has any objections, please let me know.
@@ -3064,10 +3064,11 @@ static long __tun_chr_ioctl(struct file
struct net *net = sock_net(&tfile->sk);
struct tun_struct *tun;
void __user* argp = (void __user*)arg;
- unsigned int ifindex, carrier;
+ unsigned int carrier;
struct ifreq ifr;
kuid_t owner;
kgid_t group;
+ int ifindex;
int sndbuf;
int vnet_hdr_sz;
int le;
@@ -3124,7 +3125,9 @@ static long __tun_chr_ioctl(struct file
Reply all
Reply to author
Forward
0 new messages