diff options
author | Andrew Lutomirski <luto@amacapital.net> | 2014-04-17 00:41:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-22 12:49:39 -0400 |
commit | 78541c1dc60b65ecfce5a6a096fc260219d6784e (patch) | |
tree | 45afae9a1e20fbd72426404b1d110aef9cfd6104 /net | |
parent | b0bda3853266121363a5ad8c786fa82d233538c1 (diff) |
net: Fix ns_capable check in sock_diag_put_filterinfo
The caller needs capabilities on the namespace being queried, not on
their own namespace. This is a security bug, although it likely has
only a minor impact.
Cc: stable@vger.kernel.org
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/sock_diag.c | 4 | ||||
-rw-r--r-- | net/packet/diag.c | 2 |
2 files changed, 3 insertions, 3 deletions
diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c index d7af18859322..9deb6abd6cf6 100644 --- a/net/core/sock_diag.c +++ b/net/core/sock_diag.c | |||
@@ -49,7 +49,7 @@ int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attrtype) | |||
49 | } | 49 | } |
50 | EXPORT_SYMBOL_GPL(sock_diag_put_meminfo); | 50 | EXPORT_SYMBOL_GPL(sock_diag_put_meminfo); |
51 | 51 | ||
52 | int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, | 52 | int sock_diag_put_filterinfo(struct sock *sk, |
53 | struct sk_buff *skb, int attrtype) | 53 | struct sk_buff *skb, int attrtype) |
54 | { | 54 | { |
55 | struct sock_fprog_kern *fprog; | 55 | struct sock_fprog_kern *fprog; |
@@ -58,7 +58,7 @@ int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, | |||
58 | unsigned int flen; | 58 | unsigned int flen; |
59 | int err = 0; | 59 | int err = 0; |
60 | 60 | ||
61 | if (!ns_capable(user_ns, CAP_NET_ADMIN)) { | 61 | if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) { |
62 | nla_reserve(skb, attrtype, 0); | 62 | nla_reserve(skb, attrtype, 0); |
63 | return 0; | 63 | return 0; |
64 | } | 64 | } |
diff --git a/net/packet/diag.c b/net/packet/diag.c index 533ce4ff108a..435ff99ba8c7 100644 --- a/net/packet/diag.c +++ b/net/packet/diag.c | |||
@@ -172,7 +172,7 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, | |||
172 | goto out_nlmsg_trim; | 172 | goto out_nlmsg_trim; |
173 | 173 | ||
174 | if ((req->pdiag_show & PACKET_SHOW_FILTER) && | 174 | if ((req->pdiag_show & PACKET_SHOW_FILTER) && |
175 | sock_diag_put_filterinfo(user_ns, sk, skb, PACKET_DIAG_FILTER)) | 175 | sock_diag_put_filterinfo(sk, skb, PACKET_DIAG_FILTER)) |
176 | goto out_nlmsg_trim; | 176 | goto out_nlmsg_trim; |
177 | 177 | ||
178 | return nlmsg_end(skb, nlh); | 178 | return nlmsg_end(skb, nlh); |