76 lines
2.9 KiB
Diff
76 lines
2.9 KiB
Diff
|
Bugzilla: 1115120
|
||
|
Upstream-status: sent for 3.16
|
||
|
|
||
|
From 4da6daf4d3df5a977e4623963f141a627fd2efce Mon Sep 17 00:00:00 2001
|
||
|
From: Paul Moore <pmoore@redhat.com>
|
||
|
Date: Thu, 10 Jul 2014 10:17:48 -0400
|
||
|
Subject: [PATCH] selinux: fix the default socket labeling in sock_graft()
|
||
|
|
||
|
The sock_graft() hook has special handling for AF_INET, AF_INET, and
|
||
|
AF_UNIX sockets as those address families have special hooks which
|
||
|
label the sock before it is attached its associated socket.
|
||
|
Unfortunately, the sock_graft() hook was missing a default approach
|
||
|
to labeling sockets which meant that any other address family which
|
||
|
made use of connections or the accept() syscall would find the
|
||
|
returned socket to be in an "unlabeled" state. This was recently
|
||
|
demonstrated by the kcrypto/AF_ALG subsystem and the newly released
|
||
|
cryptsetup package (cryptsetup v1.6.5 and later).
|
||
|
|
||
|
This patch preserves the special handling in selinux_sock_graft(),
|
||
|
but adds a default behavior - setting the sock's label equal to the
|
||
|
associated socket - which resolves the problem with AF_ALG and
|
||
|
presumably any other address family which makes use of accept().
|
||
|
|
||
|
Cc: stable@vger.kernel.org
|
||
|
Signed-off-by: Paul Moore <pmoore@redhat.com>
|
||
|
Tested-by: Milan Broz <gmazyland@gmail.com>
|
||
|
---
|
||
|
include/linux/security.h | 5 ++++-
|
||
|
security/selinux/hooks.c | 13 +++++++++++--
|
||
|
2 files changed, 15 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/include/linux/security.h b/include/linux/security.h
|
||
|
index 6478ce3..794be73 100644
|
||
|
--- a/include/linux/security.h
|
||
|
+++ b/include/linux/security.h
|
||
|
@@ -987,7 +987,10 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
|
||
|
* Retrieve the LSM-specific secid for the sock to enable caching of network
|
||
|
* authorizations.
|
||
|
* @sock_graft:
|
||
|
- * Sets the socket's isec sid to the sock's sid.
|
||
|
+ * This hook is called in response to a newly created sock struct being
|
||
|
+ * grafted onto an existing socket and allows the security module to
|
||
|
+ * perform whatever security attribute management is necessary for both
|
||
|
+ * the sock and socket.
|
||
|
* @inet_conn_request:
|
||
|
* Sets the openreq's sid to socket's sid with MLS portion taken from peer sid.
|
||
|
* @inet_csk_clone:
|
||
|
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
|
||
|
index 336f0a0..b3a6754 100644
|
||
|
--- a/security/selinux/hooks.c
|
||
|
+++ b/security/selinux/hooks.c
|
||
|
@@ -4499,9 +4499,18 @@ static void selinux_sock_graft(struct sock *sk, struct socket *parent)
|
||
|
struct inode_security_struct *isec = SOCK_INODE(parent)->i_security;
|
||
|
struct sk_security_struct *sksec = sk->sk_security;
|
||
|
|
||
|
- if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
|
||
|
- sk->sk_family == PF_UNIX)
|
||
|
+ switch (sk->sk_family) {
|
||
|
+ case PF_INET:
|
||
|
+ case PF_INET6:
|
||
|
+ case PF_UNIX:
|
||
|
isec->sid = sksec->sid;
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ /* by default there is no special labeling mechanism for the
|
||
|
+ * sksec label so inherit the label from the parent socket */
|
||
|
+ BUG_ON(sksec->sid != SECINITSID_UNLABELED);
|
||
|
+ sksec->sid = isec->sid;
|
||
|
+ }
|
||
|
sksec->sclass = isec->sclass;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
1.9.3
|
||
|
|