FAILED: patch "[PATCH] net: ipip: require CAP_NET_ADMIN in the device netns for" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x 8211a26324667980a463c069469a818e71207e02
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026072006-purely-upload-afbd@gregkh' --subject-prefix 'PATCH 5.10.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8211a26324667980a463c069469a818e71207e02 Mon Sep 17 00:00:00 2001
From: Maoyi Xie <[email protected]>
Date: Fri, 12 Jun 2026 16:59:36 +0800
Subject: [PATCH] net: ipip: require CAP_NET_ADMIN in the device netns for
changelink
ipip_changelink() operates on at most two netns, dev_net(dev) and the tunnel link netns t->net. They differ once the device is created in or moved to a netns other than the one the request runs in. The rtnl changelink path checks CAP_NET_ADMIN only against dev_net(dev), so a caller privileged there but not in t->net can rewrite a tunnel that lives in t->net.
Gate ipip_changelink() on rtnl_dev_link_net_capable() at its top, before any attribute is parsed.
net/ipv4/ipip.c +3 -0
@@ -494,6 +494,9 @@ static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],bool collect_md;__u32 fwmark = t->fwmark; +if (!rtnl_dev_link_net_capable (dev, t->net)) +return -EPERM ; +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) {int err =ip_tunnel_encap_setup (t, &ipencap);
Sasha Levin
maintainerPATCH 1/2 net: Add helper function to parse netlink msg of ip_tunnel_encap
From: Liu Jian <[email protected]>
[ Upstream commit 537dd2d9fb9f4aa7939fb4fcf552ebe4f497bd7e ]
Add ip_tunnel_netlink_encap_parms to parse netlink msg of ip_tunnel_encap. Reduces duplicate code, no actual functional changes.
Stable-dep-of: 8211a2632466 ("net: ipip: require CAP_NET_ADMIN in the device netns for changelink")
--- include/net/ip_tunnels.h | 3 +++ net/ipv4/ip_tunnel_core.c | 35 +++++++++++++++++++++++++++++++++++ net/ipv4/ipip.c | 38 ++------------------------------------ net/ipv6/ip6_tunnel.c | 37 ++----------------------------------- net/ipv6/sit.c | 38 ++------------------------------------ 5 files changed, 44 insertions(+), 107 deletions(-)
include/net/ip_tunnels.h +3 -0
@@ -297,6 +297,9 @@ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], struct ip_tunnel_parm *p, __u32 fwmark);void ip_tunnel_setup (struct net_device *dev,unsigned int net_id); +bool ip_tunnel_netlink_encap_parms (struct nlattr *data[], +struct ip_tunnel_encap *encap); +extern const struct header_ops ip_tunnel_header_ops;__be16 ip_tunnel_parse_protocol (const struct sk_buff *skb);
net/ipv4/ip_tunnel_core.c +35 -0
@@ -1099,3 +1099,38 @@ EXPORT_SYMBOL(ip_tunnel_parse_protocol);const struct header_ops ip_tunnel_header_ops = { .parse_protocol = ip_tunnel_parse_protocol };EXPORT_SYMBOL (ip_tunnel_header_ops); + +/* This function returns true when ENCAP attributes are present in the nl msg */ +bool ip_tunnel_netlink_encap_parms (struct nlattr *data[], +struct ip_tunnel_encap *encap) +{ +bool ret = false; + +memset (encap,0 ,sizeof (*encap)); + +if (!data) +return ret; + +if (data[IFLA_IPTUN_ENCAP_TYPE ]) { + ret = true; + encap->type =nla_get_u16 (data[IFLA_IPTUN_ENCAP_TYPE ]); + } + +if (data[IFLA_IPTUN_ENCAP_FLAGS ]) { + ret = true; + encap->flags =nla_get_u16 (data[IFLA_IPTUN_ENCAP_FLAGS ]); + } + +if (data[IFLA_IPTUN_ENCAP_SPORT ]) { + ret = true; + encap->sport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_SPORT ]); + } + +if (data[IFLA_IPTUN_ENCAP_DPORT ]) { + ret = true; + encap->dport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_DPORT ]); + } + +return ret; +} +EXPORT_SYMBOL_GPL (ip_tunnel_netlink_encap_parms);
net/ipv4/ipip.c +2 -36
@@ -446,40 +446,6 @@ static void ipip_netlink_parms(struct nlattr *data[], *fwmark =nla_get_u32 (data[IFLA_IPTUN_FWMARK ]); } -/* This function returns true when ENCAP attributes are present in the nl msg */ -static bool ipip_netlink_encap_parms (struct nlattr *data[], -struct ip_tunnel_encap *ipencap) -{ -bool ret = false; - -memset (ipencap,0 ,sizeof (*ipencap)); - -if (!data) -return ret; - -if (data[IFLA_IPTUN_ENCAP_TYPE ]) { - ret = true; - ipencap->type =nla_get_u16 (data[IFLA_IPTUN_ENCAP_TYPE ]); - } - -if (data[IFLA_IPTUN_ENCAP_FLAGS ]) { - ret = true; - ipencap->flags =nla_get_u16 (data[IFLA_IPTUN_ENCAP_FLAGS ]); - } - -if (data[IFLA_IPTUN_ENCAP_SPORT ]) { - ret = true; - ipencap->sport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_SPORT ]); - } - -if (data[IFLA_IPTUN_ENCAP_DPORT ]) { - ret = true; - ipencap->dport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_DPORT ]); - } - -return ret; -} -static int ipip_newlink (struct net *src_net,struct net_device *dev,struct nlattr *tb[],struct nlattr *data[],struct netlink_ext_ack *extack)
@@ -489,7 +455,7 @@ static int ipip_newlink(struct net *src_net, struct net_device *dev,struct ip_tunnel_encap ipencap;__u32 fwmark =0 ; -if (ipip_netlink_encap_parms (data, &ipencap)) { +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) {int err =ip_tunnel_encap_setup (t, &ipencap);if (err <0 )
@@ -510,7 +476,7 @@ static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],bool collect_md;__u32 fwmark = t->fwmark; -if (ipip_netlink_encap_parms (data, &ipencap)) { +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) {int err =ip_tunnel_encap_setup (t, &ipencap);if (err <0 )
net/ipv6/ip6_tunnel.c +2 -35
@@ -2034,39 +2034,6 @@ static void ip6_tnl_netlink_parms(struct nlattr *data[], parms->fwmark =nla_get_u32 (data[IFLA_IPTUN_FWMARK ]); } -static bool ip6_tnl_netlink_encap_parms (struct nlattr *data[], -struct ip_tunnel_encap *ipencap) -{ -bool ret = false; - -memset (ipencap,0 ,sizeof (*ipencap)); - -if (!data) -return ret; - -if (data[IFLA_IPTUN_ENCAP_TYPE ]) { - ret = true; - ipencap->type =nla_get_u16 (data[IFLA_IPTUN_ENCAP_TYPE ]); - } - -if (data[IFLA_IPTUN_ENCAP_FLAGS ]) { - ret = true; - ipencap->flags =nla_get_u16 (data[IFLA_IPTUN_ENCAP_FLAGS ]); - } - -if (data[IFLA_IPTUN_ENCAP_SPORT ]) { - ret = true; - ipencap->sport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_SPORT ]); - } - -if (data[IFLA_IPTUN_ENCAP_DPORT ]) { - ret = true; - ipencap->dport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_DPORT ]); - } - -return ret; -} -static int ip6_tnl_newlink (struct net *src_net,struct net_device *dev,struct nlattr *tb[],struct nlattr *data[],struct netlink_ext_ack *extack)
@@ -2079,7 +2046,7 @@ static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev, nt =netdev_priv (dev); -if (ip6_tnl_netlink_encap_parms (data, &ipencap)) { +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) { err =ip6_tnl_encap_setup (nt, &ipencap);if (err <0 )return err;
@@ -2116,7 +2083,7 @@ static int ip6_tnl_changelink(struct net_device *dev, struct nlattr *tb[],if (dev == ip6n->fb_tnl_dev)return -EINVAL ; -if (ip6_tnl_netlink_encap_parms (data, &ipencap)) { +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) {int err =ip6_tnl_encap_setup (t, &ipencap);if (err <0 )
net/ipv6/sit.c +2 -36
@@ -1536,40 +1536,6 @@ static void ipip6_netlink_parms(struct nlattr *data[], *fwmark =nla_get_u32 (data[IFLA_IPTUN_FWMARK ]); } -/* This function returns true when ENCAP attributes are present in the nl msg */ -static bool ipip6_netlink_encap_parms (struct nlattr *data[], -struct ip_tunnel_encap *ipencap) -{ -bool ret = false; - -memset (ipencap,0 ,sizeof (*ipencap)); - -if (!data) -return ret; - -if (data[IFLA_IPTUN_ENCAP_TYPE ]) { - ret = true; - ipencap->type =nla_get_u16 (data[IFLA_IPTUN_ENCAP_TYPE ]); - } - -if (data[IFLA_IPTUN_ENCAP_FLAGS ]) { - ret = true; - ipencap->flags =nla_get_u16 (data[IFLA_IPTUN_ENCAP_FLAGS ]); - } - -if (data[IFLA_IPTUN_ENCAP_SPORT ]) { - ret = true; - ipencap->sport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_SPORT ]); - } - -if (data[IFLA_IPTUN_ENCAP_DPORT ]) { - ret = true; - ipencap->dport =nla_get_be16 (data[IFLA_IPTUN_ENCAP_DPORT ]); - } - -return ret; -} -#ifdef CONFIG_IPV6_SIT_6RD /* This function returns true when 6RD attributes are present in the nl msg */ static bool ipip6_netlink_6rd_parms(struct nlattr *data[],
@@ -1621,7 +1587,7 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev, nt =netdev_priv (dev); -if (ipip6_netlink_encap_parms (data, &ipencap)) { +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) { err =ip_tunnel_encap_setup (nt, &ipencap);if (err <0 )return err;
@@ -1676,7 +1642,7 @@ static int ipip6_changelink(struct net_device *dev, struct nlattr *tb[],if (dev == sitn->fb_tunnel_dev)return -EINVAL ; -if (ipip6_netlink_encap_parms (data, &ipencap)) { +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) { err =ip_tunnel_encap_setup (t, &ipencap);if (err <0 )return err;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 net: ipip: require CAP_NET_ADMIN in the device netns for changelink
From: Maoyi Xie <[email protected]>
[ Upstream commit 8211a26324667980a463c069469a818e71207e02 ]
ipip_changelink() operates on at most two netns, dev_net(dev) and the tunnel link netns t->net. They differ once the device is created in or moved to a netns other than the one the request runs in. The rtnl changelink path checks CAP_NET_ADMIN only against dev_net(dev), so a caller privileged there but not in t->net can rewrite a tunnel that lives in t->net.
Gate ipip_changelink() on rtnl_dev_link_net_capable() at its top, before any attribute is parsed.
--- net/ipv4/ipip.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/ipip.c +3 -0
@@ -476,6 +476,9 @@ static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],bool collect_md;__u32 fwmark = t->fwmark; +if (!rtnl_dev_link_net_capable (dev, t->net)) +return -EPERM ; +if (ip_tunnel_netlink_encap_parms (data, &ipencap)) {int err =ip_tunnel_encap_setup (t, &ipencap);
Signature · 1 line
2.53.0