Netdev List
 help / color / mirror / Atom feed
* [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes
@ 2026-05-21 13:05 Maoyi Xie
  2026-05-21 13:05 ` [PATCH net v4 1/2] ip6: vti: Use ip6_tnl.net in vti6_changelink() Maoyi Xie
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Maoyi Xie @ 2026-05-21 13:05 UTC (permalink / raw)
  To: Jakub Kicinski, David S . Miller, Paolo Abeni, Eric Dumazet,
	David Ahern
  Cc: Kuniyuki Iwashima, Steffen Klassert, Xiao Liang, netdev,
	linux-kernel, stable

v3 -> v4

 - Update Fixes tag on both patches to commit 61220ab34948
   ("vti6: Enable namespace changing"). Xiao noted the old tag
   5e72ce3e3980 is not the introducing commit. dev_net(dev) and
   t->net first diverge when 61220ab34948 dropped
   NETIF_F_NETNS_LOCAL and made vti6 devices movable through
   IFLA_NET_NS_FD. Same Fixes shape Jakub took for the sibling
   fix 1d324c2f43f7.

 - 2/2 adds ns_capable(self->net->user_ns, CAP_NET_ADMIN) inside
   the non fallback SIOCCHGTUNNEL branch. The check at the top
   of the case is against dev_net(dev)->user_ns only. A caller
   in the migrated netns can pick params absent from self->net,
   the lookup returns NULL, t becomes self, and vti6_update()
   inserts the device into self->net's hash. v3 did not close
   that path.

1/2 carries forward Eric Dumazet's Reviewed-by. Only the Fixes
tag changes there. 2/2 changes the Fixes tag and adds the
ns_capable hunk.

Kuniyuki Iwashima (1):
  ip6: vti: Use ip6_tnl.net in vti6_changelink().

Maoyi Xie (1):
  ip6: vti: Use ip6_tnl.net in vti6_siocdevprivate().

 net/ipv6/ip6_vti.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

--
2.34.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH net v4 1/2] ip6: vti: Use ip6_tnl.net in vti6_changelink().
  2026-05-21 13:05 [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes Maoyi Xie
@ 2026-05-21 13:05 ` Maoyi Xie
  2026-05-21 13:05 ` [PATCH net v4 2/2] ip6: vti: Use ip6_tnl.net in vti6_siocdevprivate() Maoyi Xie
  2026-05-26  9:30 ` [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Maoyi Xie @ 2026-05-21 13:05 UTC (permalink / raw)
  To: Jakub Kicinski, David S . Miller, Paolo Abeni, Eric Dumazet,
	David Ahern
  Cc: Kuniyuki Iwashima, Steffen Klassert, Xiao Liang, netdev,
	linux-kernel, stable

From: Kuniyuki Iwashima <kuniyu@google.com>

ip netns add ns1
ip netns add ns2
ip -n ns1 link add vti6_test type vti6 remote ::1 local ::2 key 7
ip -n ns1 link set vti6_test netns ns2
ip -n ns2 link set vti6_test type vti6 remote ::3 local ::4 key 9
ip netns del ns2
ip netns del ns1
[  132.495484] ------------[ cut here ]------------
[  132.497609] kernel BUG at net/core/dev.c:12376!

Commit 61220ab34948 ("vti6: Enable namespace changing") dropped
NETIF_F_NETNS_LOCAL from vti6 devices. A vti6 tunnel can then
move through IFLA_NET_NS_FD. After the move dev_net(dev) points
at the new netns while t->net stays at the creation netns.

vti6_changelink() and vti6_update() still use dev_net(dev) and
dev_net(t->dev). They unlink from one per netns hash and relink
into another. The creation netns is left with a stale entry.
cleanup_net() of that netns later walks freed memory.

Reachable from an unprivileged user namespace (unshare --user
--map-root-user --net). Cross tenant scope on container hosts.

Fixes: 61220ab34948 ("vti6: Enable namespace changing")
Reported-by: Maoyi Xie <maoyi.xie@ntu.edu.sg>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Cc: stable@vger.kernel.org # v5.15+
Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
---
 net/ipv6/ip6_vti.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index ad5290be4dd6..dcb257411d6e 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -722,10 +722,11 @@ vti6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p,
 static int vti6_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p,
 		       bool keep_mtu)
 {
-	struct net *net = dev_net(t->dev);
-	struct vti6_net *ip6n = net_generic(net, vti6_net_id);
+	struct net *net = t->net;
+	struct vti6_net *ip6n;
 	int err;
 
+	ip6n = net_generic(net, vti6_net_id);
 	vti6_tnl_unlink(ip6n, t);
 	synchronize_net();
 	err = vti6_tnl_change(t, p, keep_mtu);
@@ -1031,11 +1032,12 @@ static int vti6_changelink(struct net_device *dev, struct nlattr *tb[],
 			   struct nlattr *data[],
 			   struct netlink_ext_ack *extack)
 {
-	struct ip6_tnl *t;
+	struct ip6_tnl *t = netdev_priv(dev);
+	struct net *net = t->net;
 	struct __ip6_tnl_parm p;
-	struct net *net = dev_net(dev);
-	struct vti6_net *ip6n = net_generic(net, vti6_net_id);
+	struct vti6_net *ip6n;
 
+	ip6n = net_generic(net, vti6_net_id);
 	if (dev == ip6n->fb_tnl_dev)
 		return -EINVAL;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH net v4 2/2] ip6: vti: Use ip6_tnl.net in vti6_siocdevprivate().
  2026-05-21 13:05 [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes Maoyi Xie
  2026-05-21 13:05 ` [PATCH net v4 1/2] ip6: vti: Use ip6_tnl.net in vti6_changelink() Maoyi Xie
@ 2026-05-21 13:05 ` Maoyi Xie
  2026-05-26  9:30 ` [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Maoyi Xie @ 2026-05-21 13:05 UTC (permalink / raw)
  To: Jakub Kicinski, David S . Miller, Paolo Abeni, Eric Dumazet,
	David Ahern
  Cc: Kuniyuki Iwashima, Steffen Klassert, Xiao Liang, netdev,
	linux-kernel, stable

After patch 1/2 in this series, vti6_update() unlinks and relinks
the tunnel through t->net. vti6_siocdevprivate() still uses
dev_net(dev) for the collision lookup. For a tunnel moved through
IFLA_NET_NS_FD, dev_net(dev) is the new netns, not t->net.

SIOCCHGTUNNEL on a migrated tunnel then runs:

  net = dev_net(dev)                    /* migrated netns */
  t   = vti6_locate(net, &p1, false)    /* misses target in t->net */
  ...
  t   = netdev_priv(dev)
  vti6_update(t, &p1, false)            /* mutates t->net's hash */

A caller in the migrated netns picks params that match a tunnel
in the creation netns. The lookup in dev_net(dev) finds nothing.
vti6_update() prepends the migrated tunnel at the head of the
creation netns hash bucket for those params. Later lookups in
the creation netns resolve to the migrated device. xfrm receive
delivers the matched packets through a device the caller controls.

Reachable from an unprivileged user namespace (unshare --user
--map-root-user --net). Cross tenant scope on container hosts.

Switch the SIOCCHGTUNNEL path on a non fallback device to use
t->net for the lookup. The lookup now matches the netns
vti6_update() operates on.

Also add ns_capable(self->net->user_ns, CAP_NET_ADMIN) before
the lookup. The check at the top of the case is against
dev_net(dev)->user_ns, which after migration is the attacker's
netns. A caller there can pick params absent from self->net,
the lookup returns NULL, t becomes self, and vti6_update()
inserts the device into the creation netns hash. The new check
requires CAP_NET_ADMIN in the creation netns user_ns too.

SIOCADDTUNNEL and SIOCCHGTUNNEL on the fallback device keep
dev_net(dev), which equals init_net there.

Fixes: 61220ab34948 ("vti6: Enable namespace changing")
Suggested-by: Jakub Kicinski <kuba@kernel.org>
Suggested-by: Xiao Liang <shaw.leon@gmail.com>
Cc: stable@vger.kernel.org # v5.15+
Signed-off-by: Maoyi Xie <maoyixie.tju@gmail.com>
---
 net/ipv6/ip6_vti.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index dcb257411d6e..df793c8bfffb 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -835,17 +835,24 @@ vti6_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data
 		if (p.proto != IPPROTO_IPV6  && p.proto != 0)
 			break;
 		vti6_parm_from_user(&p1, &p);
-		t = vti6_locate(net, &p1, cmd == SIOCADDTUNNEL);
 		if (dev != ip6n->fb_tnl_dev && cmd == SIOCCHGTUNNEL) {
+			struct ip6_tnl *self = netdev_priv(dev);
+
+			err = -EPERM;
+			if (!ns_capable(self->net->user_ns, CAP_NET_ADMIN))
+				break;
+			t = vti6_locate(self->net, &p1, false);
 			if (t) {
 				if (t->dev != dev) {
 					err = -EEXIST;
 					break;
 				}
 			} else
-				t = netdev_priv(dev);
+				t = self;
 
 			err = vti6_update(t, &p1, false);
+		} else {
+			t = vti6_locate(net, &p1, cmd == SIOCADDTUNNEL);
 		}
 		if (t) {
 			err = 0;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes
  2026-05-21 13:05 [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes Maoyi Xie
  2026-05-21 13:05 ` [PATCH net v4 1/2] ip6: vti: Use ip6_tnl.net in vti6_changelink() Maoyi Xie
  2026-05-21 13:05 ` [PATCH net v4 2/2] ip6: vti: Use ip6_tnl.net in vti6_siocdevprivate() Maoyi Xie
@ 2026-05-26  9:30 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-05-26  9:30 UTC (permalink / raw)
  To: Maoyi Xie
  Cc: kuba, davem, pabeni, edumazet, dsahern, kuniyu, steffen.klassert,
	shaw.leon, netdev, linux-kernel, stable

Hello:

This series was applied to netdev/net.git (main)
by Paolo Abeni <pabeni@redhat.com>:

On Thu, 21 May 2026 21:05:53 +0800 you wrote:
> v3 -> v4
> 
>  - Update Fixes tag on both patches to commit 61220ab34948
>    ("vti6: Enable namespace changing"). Xiao noted the old tag
>    5e72ce3e3980 is not the introducing commit. dev_net(dev) and
>    t->net first diverge when 61220ab34948 dropped
>    NETIF_F_NETNS_LOCAL and made vti6 devices movable through
>    IFLA_NET_NS_FD. Same Fixes shape Jakub took for the sibling
>    fix 1d324c2f43f7.
> 
> [...]

Here is the summary with links:
  - [net,v4,1/2] ip6: vti: Use ip6_tnl.net in vti6_changelink().
    https://git.kernel.org/netdev/net/c/11b326fb0a37
  - [net,v4,2/2] ip6: vti: Use ip6_tnl.net in vti6_siocdevprivate().
    https://git.kernel.org/netdev/net/c/8b484efd5cb4

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



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-05-26  9:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-21 13:05 [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes Maoyi Xie
2026-05-21 13:05 ` [PATCH net v4 1/2] ip6: vti: Use ip6_tnl.net in vti6_changelink() Maoyi Xie
2026-05-21 13:05 ` [PATCH net v4 2/2] ip6: vti: Use ip6_tnl.net in vti6_siocdevprivate() Maoyi Xie
2026-05-26  9:30 ` [PATCH net v4 0/2] ip6_vti: vti6_changelink and vti6_siocdevprivate netns fixes patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox