From: Pablo Neira Ayuso <pablo@netfilter.org>
To: netfilter-devel@vger.kernel.org
Cc: davem@davemloft.net, netdev@vger.kernel.org
Subject: [PATCH 11/23] netfilter: Set /proc/net entries owner to root in namespace
Date: Fri, 18 Dec 2015 21:26:37 +0100 [thread overview]
Message-ID: <1450470409-31427-12-git-send-email-pablo@netfilter.org> (raw)
In-Reply-To: <1450470409-31427-1-git-send-email-pablo@netfilter.org>
From: Philip Whineray <phil@firehol.org>
Various files are owned by root with 0440 permission. Reading them is
impossible in an unprivileged user namespace, interfering with firewall
tools. For instance, iptables-save relies on /proc/net/ip_tables_names
contents to dump only loaded tables.
This patch assigned ownership of the following files to root in the
current namespace:
- /proc/net/*_tables_names
- /proc/net/*_tables_matches
- /proc/net/*_tables_targets
- /proc/net/nf_conntrack
- /proc/net/nf_conntrack_expect
- /proc/net/netfilter/nfnetlink_log
A mapping for root must be available, so this order should be followed:
unshare(CLONE_NEWUSER);
/* Setup the mapping */
unshare(CLONE_NEWNET);
Signed-off-by: Philip Whineray <phil@firehol.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/nf_conntrack_expect.c | 7 +++++++
net/netfilter/nf_conntrack_standalone.c | 7 +++++++
net/netfilter/nfnetlink_log.c | 15 +++++++++++++--
net/netfilter/x_tables.c | 12 ++++++++++++
4 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/net/netfilter/nf_conntrack_expect.c b/net/netfilter/nf_conntrack_expect.c
index acf5c7b..278927a 100644
--- a/net/netfilter/nf_conntrack_expect.c
+++ b/net/netfilter/nf_conntrack_expect.c
@@ -596,11 +596,18 @@ static int exp_proc_init(struct net *net)
{
#ifdef CONFIG_NF_CONNTRACK_PROCFS
struct proc_dir_entry *proc;
+ kuid_t root_uid;
+ kgid_t root_gid;
proc = proc_create("nf_conntrack_expect", 0440, net->proc_net,
&exp_file_ops);
if (!proc)
return -ENOMEM;
+
+ root_uid = make_kuid(net->user_ns, 0);
+ root_gid = make_kgid(net->user_ns, 0);
+ if (uid_valid(root_uid) && gid_valid(root_gid))
+ proc_set_user(proc, root_uid, root_gid);
#endif /* CONFIG_NF_CONNTRACK_PROCFS */
return 0;
}
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c
index 1fb3cac..0f1a45b 100644
--- a/net/netfilter/nf_conntrack_standalone.c
+++ b/net/netfilter/nf_conntrack_standalone.c
@@ -392,11 +392,18 @@ static const struct file_operations ct_cpu_seq_fops = {
static int nf_conntrack_standalone_init_proc(struct net *net)
{
struct proc_dir_entry *pde;
+ kuid_t root_uid;
+ kgid_t root_gid;
pde = proc_create("nf_conntrack", 0440, net->proc_net, &ct_file_ops);
if (!pde)
goto out_nf_conntrack;
+ root_uid = make_kuid(net->user_ns, 0);
+ root_gid = make_kgid(net->user_ns, 0);
+ if (uid_valid(root_uid) && gid_valid(root_gid))
+ proc_set_user(pde, root_uid, root_gid);
+
pde = proc_create("nf_conntrack", S_IRUGO, net->proc_net_stat,
&ct_cpu_seq_fops);
if (!pde)
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
index 740cce4..dea4676 100644
--- a/net/netfilter/nfnetlink_log.c
+++ b/net/netfilter/nfnetlink_log.c
@@ -1064,15 +1064,26 @@ static int __net_init nfnl_log_net_init(struct net *net)
{
unsigned int i;
struct nfnl_log_net *log = nfnl_log_pernet(net);
+#ifdef CONFIG_PROC_FS
+ struct proc_dir_entry *proc;
+ kuid_t root_uid;
+ kgid_t root_gid;
+#endif
for (i = 0; i < INSTANCE_BUCKETS; i++)
INIT_HLIST_HEAD(&log->instance_table[i]);
spin_lock_init(&log->instances_lock);
#ifdef CONFIG_PROC_FS
- if (!proc_create("nfnetlink_log", 0440,
- net->nf.proc_netfilter, &nful_file_ops))
+ proc = proc_create("nfnetlink_log", 0440,
+ net->nf.proc_netfilter, &nful_file_ops);
+ if (!proc)
return -ENOMEM;
+
+ root_uid = make_kuid(net->user_ns, 0);
+ root_gid = make_kgid(net->user_ns, 0);
+ if (uid_valid(root_uid) && gid_valid(root_gid))
+ proc_set_user(proc, root_uid, root_gid);
#endif
return 0;
}
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index d4aaad7..c8a0b7d 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -26,6 +26,7 @@
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/audit.h>
+#include <linux/user_namespace.h>
#include <net/net_namespace.h>
#include <linux/netfilter/x_tables.h>
@@ -1226,6 +1227,8 @@ int xt_proto_init(struct net *net, u_int8_t af)
#ifdef CONFIG_PROC_FS
char buf[XT_FUNCTION_MAXNAMELEN];
struct proc_dir_entry *proc;
+ kuid_t root_uid;
+ kgid_t root_gid;
#endif
if (af >= ARRAY_SIZE(xt_prefix))
@@ -1233,12 +1236,17 @@ int xt_proto_init(struct net *net, u_int8_t af)
#ifdef CONFIG_PROC_FS
+ root_uid = make_kuid(net->user_ns, 0);
+ root_gid = make_kgid(net->user_ns, 0);
+
strlcpy(buf, xt_prefix[af], sizeof(buf));
strlcat(buf, FORMAT_TABLES, sizeof(buf));
proc = proc_create_data(buf, 0440, net->proc_net, &xt_table_ops,
(void *)(unsigned long)af);
if (!proc)
goto out;
+ if (uid_valid(root_uid) && gid_valid(root_gid))
+ proc_set_user(proc, root_uid, root_gid);
strlcpy(buf, xt_prefix[af], sizeof(buf));
strlcat(buf, FORMAT_MATCHES, sizeof(buf));
@@ -1246,6 +1254,8 @@ int xt_proto_init(struct net *net, u_int8_t af)
(void *)(unsigned long)af);
if (!proc)
goto out_remove_tables;
+ if (uid_valid(root_uid) && gid_valid(root_gid))
+ proc_set_user(proc, root_uid, root_gid);
strlcpy(buf, xt_prefix[af], sizeof(buf));
strlcat(buf, FORMAT_TARGETS, sizeof(buf));
@@ -1253,6 +1263,8 @@ int xt_proto_init(struct net *net, u_int8_t af)
(void *)(unsigned long)af);
if (!proc)
goto out_remove_matches;
+ if (uid_valid(root_uid) && gid_valid(root_gid))
+ proc_set_user(proc, root_uid, root_gid);
#endif
return 0;
--
2.1.4
next prev parent reply other threads:[~2015-12-18 20:26 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-18 20:26 [PATCH 00/23] Netfilter updates for net-next Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 01/23] netfilter: ebtables: use __u64 from linux/types.h Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 02/23] netfilter: fix include files for compilation Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 03/23] netfilter-bridge: Cleanse indentation Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 04/23] netfilter-bridge: use netdev style comments Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 05/23] netfilter-bridge: brace placement Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 06/23] netfilter-bridge: layout of if statements Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 07/23] netfilter: nf_ct_sctp: move ip_ct_sctp away from UAPI Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 08/23] netfilter: remove duplicate include Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 09/23] netfilter: ipv6: nf_defrag: avoid/free clone operations Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 10/23] netfilter: ipv6: avoid nf_iterate recursion Pablo Neira Ayuso
2015-12-18 20:26 ` Pablo Neira Ayuso [this message]
2015-12-18 20:26 ` [PATCH 12/23] netfilter: nf_tables: remove unused struct members Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 13/23] netfilter: nft_payload: add packet mangling support Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 14/23] netfilter: nf_tables: extend tracing infrastructure Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 15/23] netfilter: nf_tables: wrap tracing with a static key Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 16/23] netfilter: ipv6: nf_defrag: fix NULL deref panic Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 17/23] netfilter: nfnetlink_log: Change setter functions to be void Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 18/23] netfilter: nf_tables: fix nf_log_trace based tracing Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 19/23] netfilter: cttimeout: add netns support Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 20/23] netfilter: prepare xt_cgroup for multi revisions Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 21/23] netfilter: implement xt_cgroup cgroup2 path match Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 22/23] nfnetlink: add nfnl_dereference_protected helper Pablo Neira Ayuso
2015-12-18 20:26 ` [PATCH 23/23] netfilter: meta: add support for setting skb->pkttype Pablo Neira Ayuso
2015-12-18 20:38 ` [PATCH 00/23] Netfilter updates for net-next David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1450470409-31427-12-git-send-email-pablo@netfilter.org \
--to=pablo@netfilter.org \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).