Re: [PATCH] selinux: fix the default socket labeling in sock_graft()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07/10/2014 11:37 AM, Paul Moore wrote:
> 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@xxxxxxxxxxxxxxx
> Signed-off-by: Paul Moore <pmoore@xxxxxxxxxx>
> Tested-by: Milan Broz <gmazyland@xxxxxxxxx>
> ---
>  security/selinux/hooks.c |   12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index 336f0a0..39f16d0 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -4499,9 +4499,17 @@ 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
> +		 * sock label so inherit the label from the parent socket */
> +		sksec->sid = isec->sid;
> +	}

Wait...why would we assign isec->sid from sksec->sid in the former case
but the reverse here?  Shouldn't we be setting isec->sid in all cases?
The hook documentation in include/linux/security.h unfortunately does
not describe the actual abstract behavior but rather describes the
implementation in the inet case.


>  	sksec->sclass = isec->sclass;
>  }
>  
> 
> _______________________________________________
> Selinux mailing list
> Selinux@xxxxxxxxxxxxx
> To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
> To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.
> 

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux