]> git.baikalelectronics.ru Git - kernel.git/commitdiff
netfilter: rpfilter/fib: Set ->flowic_uid correctly for user namespaces.
authorGuillaume Nault <gnault@redhat.com>
Thu, 13 Oct 2022 14:37:47 +0000 (16:37 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 19 Oct 2022 06:46:48 +0000 (08:46 +0200)
Currently netfilter's rpfilter and fib modules implicitely initialise
->flowic_uid with 0. This is normally the root UID. However, this isn't
the case in user namespaces, where user ID 0 is mapped to a different
kernel UID. By initialising ->flowic_uid with sock_net_uid(), we get
the root UID of the user namespace, thus keeping the same behaviour
whether or not we're running in a user namepspace.

Note, this is similar to commit 2c60e25dfd8b ("ipv4: add missing
initialization for flowi4_uid"), which fixed the rp_filter sysctl.

Fixes: 8bf45a9d52d2 ("net: core: add UID to flows, rules, and routes")
Signed-off-by: Guillaume Nault <gnault@redhat.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/ipv4/netfilter/ipt_rpfilter.c
net/ipv4/netfilter/nft_fib_ipv4.c
net/ipv6/netfilter/ip6t_rpfilter.c
net/ipv6/netfilter/nft_fib_ipv6.c

index ff85db52b2e56ecef625511ad51b6bf9b866c341..ded5bef02f771163b80b4ce1b2265443d7d6674e 100644 (file)
@@ -78,6 +78,7 @@ static bool rpfilter_mt(const struct sk_buff *skb, struct xt_action_param *par)
        flow.flowi4_tos = iph->tos & IPTOS_RT_MASK;
        flow.flowi4_scope = RT_SCOPE_UNIVERSE;
        flow.flowi4_l3mdev = l3mdev_master_ifindex_rcu(xt_in(par));
+       flow.flowi4_uid = sock_net_uid(xt_net(par), NULL);
 
        return rpfilter_lookup_reverse(xt_net(par), &flow, xt_in(par), info->flags) ^ invert;
 }
index e886147eed11d22992525b0c1a41ae6532daa631..fc65d69f23e16784a9a4913618e57d53dcca0203 100644 (file)
@@ -65,6 +65,7 @@ void nft_fib4_eval(const struct nft_expr *expr, struct nft_regs *regs,
        struct flowi4 fl4 = {
                .flowi4_scope = RT_SCOPE_UNIVERSE,
                .flowi4_iif = LOOPBACK_IFINDEX,
+               .flowi4_uid = sock_net_uid(nft_net(pkt), NULL),
        };
        const struct net_device *oif;
        const struct net_device *found;
index 69d86b040a6afe649f3c5d9e2bca235e95a689db..a01d9b842bd07a2c8914b9dd6e873fa63a750700 100644 (file)
@@ -40,6 +40,7 @@ static bool rpfilter_lookup_reverse6(struct net *net, const struct sk_buff *skb,
                .flowi6_l3mdev = l3mdev_master_ifindex_rcu(dev),
                .flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK,
                .flowi6_proto = iph->nexthdr,
+               .flowi6_uid = sock_net_uid(net, NULL),
                .daddr = iph->saddr,
        };
        int lookup_flags;
index 91faac610e03dbdc659202e0404177c242a3563b..36dc14b34388c8ff49ee621d9aa4ddd1df1d2727 100644 (file)
@@ -66,6 +66,7 @@ static u32 __nft_fib6_eval_type(const struct nft_fib *priv,
        struct flowi6 fl6 = {
                .flowi6_iif = LOOPBACK_IFINDEX,
                .flowi6_proto = pkt->tprot,
+               .flowi6_uid = sock_net_uid(nft_net(pkt), NULL),
        };
        u32 ret = 0;
 
@@ -163,6 +164,7 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs,
        struct flowi6 fl6 = {
                .flowi6_iif = LOOPBACK_IFINDEX,
                .flowi6_proto = pkt->tprot,
+               .flowi6_uid = sock_net_uid(nft_net(pkt), NULL),
        };
        struct rt6_info *rt;
        int lookup_flags;