Re: [RFC PATCH v2] selinux: Fix a problem with socket labels and the TUN driver

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

 



On Mon, 2009-07-06 at 16:43 -0400, Paul Moore wrote:
> On Monday 06 July 2009 08:58:45 am Stephen Smalley wrote:
> > On Thu, 2009-07-02 at 17:27 -0400, Paul Moore wrote:
> > > There is a problem where packets being sent by the TUN driver are not
> > > correctly handled by SELinux in the postrouting code.  The issue is that
> > > the SELinux network access controls rely on a packet's associated sock,
> > > when present, for it's security label.  The TUN driver does create a sock
> > > to send network traffic but it only calls into the LSM/SELinux code once
> > > via the security_sk_alloc() hook which never fully initializes the sock's
> > > label.  This patch attempts to correct this problem by adding the normal
> > > LSM socket creation hooks to the TUN driver.
> > >
> > > NOTE: this is an RFC patch intended to demonstrate a possible solution
> > > completely different from the v1 patch, but it is still crude, untested
> > > and not fully hashed out just yet.  Please take a look and see if this
> > > approach is even worth pursuing ... thanks.
> 
> [I'm replying out of order here since your last comment seemed most important]
> 
> > > @@ -987,6 +991,12 @@ static int tun_set_iff(struct net *net, struct file
> > > *file, struct ifreq *ifr) tun->sk = sk;
> > >  		container_of(sk, struct tun_sock, sk)->tun = tun;
> > >
> > > +		/* XXX - correct placement? */
> > > +		err = security_socket_post_create(tun->socket,
> > > +						  AF_UNSPEC, SOCK_RAW, 0, 0);
> > > +		if (err < 0)
> > > +			goto err_free_sk;
> > > +
> >
> > Current socket_post_create() hook presumes that the socket has an inode
> > with an allocated security struct, which I don't think we have here.
> >
> > Wondering if it ought to just call sock_create_lite(), although that
> > will mark it as a kernel socket.  How do we actually want the socket
> > labeled - based on creating process or as a kernel-private socket?
> 
> I've been working under the assumption that we want the socket labeled based 
> on the creating process as that would ensure that any traffic coming from that 
> process through the TUN driver would be treated as if it had come from the 
> creating process.  Labeling the socket as a kernel socket robs us of the 
> ability to provide decent access control and labeling for traffic passing 
> through the TUN driver.
> 
> Unfortunately, this gets a little sticky with persistent TUN/TAP devices but 
> the problem should be solvable with some additional access checks when 
> attaching to existing TUN/TAP devices.
> 
> > > @@ -946,6 +946,10 @@ static int tun_set_iff(struct net *net, struct file
> > > *file, struct ifreq *ifr) if (!capable(CAP_NET_ADMIN))
> > >  			return -EPERM;
> > >
> > > +		err = security_socket_create(AF_UNSPEC, SOCK_RAW, 0, 0);
> > > +		if (err < 0)
> > > +			return err;
> > > +
> >
> > This is a permission checking hook only, so it isn't necessary to
> > setting up the socket security state, and it is questionable as to
> > whether we can add such a check unconditionally (it may cause denial
> > under existing policies that would have previously been allowed), or
> > whether it is necessary given that the process must have net_admin
> > capability.
> 
> My thinking was that a permission check might not be a bad thing here since we 
> may want the ability to restrict the creation of TUN/TAP devices to certain 
> domains.  True, you could do that to some extent with the /dev/tun file but 
> that is pretty coarse.

Ok.  Well, what if sock_create_lite() took a kern flag like
__sock_create() does - could we then use it here to set up the tun
socket?

-- 
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

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

  Powered by Linux