diff mbox series

[v2] selinux: do not report error on connect(AF_UNSPEC)

Message ID 34870696b95f9cf48b5436df46e27dddd054858c.1557492319.git.pabeni@redhat.com (mailing list archive)
State Superseded
Headers show
Series [v2] selinux: do not report error on connect(AF_UNSPEC) | expand

Commit Message

Paolo Abeni May 10, 2019, 1:47 p.m. UTC
calling connect(AF_UNSPEC) on an already connected TCP socket is an
established way to disconnect() such socket. After commit 68741a8adab9
("selinux: Fix ltp test connect-syscall failure") it no longer works
and, in the above scenario connect() fails with EAFNOSUPPORT.

Fix the above skipping the checks when the address family is not
AF_INET{4,6} - we don't have any port to validate, but leave the
SCTP code path untouched, as it has specific constraints.

Fixes: 68741a8adab9 ("selinux: Fix ltp test connect-syscall failure")
Reported-by: Tom Deseyn <tdeseyn@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
v1 -> v2:
 - avoid validation for AF_UNSPEC
---
 security/selinux/hooks.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Paul Moore May 10, 2019, 3:32 p.m. UTC | #1
On Fri, May 10, 2019 at 9:49 AM Paolo Abeni <pabeni@redhat.com> wrote:
>
> calling connect(AF_UNSPEC) on an already connected TCP socket is an
> established way to disconnect() such socket. After commit 68741a8adab9
> ("selinux: Fix ltp test connect-syscall failure") it no longer works
> and, in the above scenario connect() fails with EAFNOSUPPORT.
>
> Fix the above skipping the checks when the address family is not
> AF_INET{4,6} - we don't have any port to validate, but leave the
> SCTP code path untouched, as it has specific constraints.
>
> Fixes: 68741a8adab9 ("selinux: Fix ltp test connect-syscall failure")
> Reported-by: Tom Deseyn <tdeseyn@redhat.com>
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
> v1 -> v2:
>  - avoid validation for AF_UNSPEC
> ---
>  security/selinux/hooks.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)

What was wrong with explicitly checking for AF_UNSPEC as I mentioned
in my last email?

> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index c61787b15f27..bccc4b3e6f57 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -4674,12 +4674,13 @@ static int selinux_socket_connect_helper(struct socket *sock,
>                         break;
>                 default:
>                         /* Note that SCTP services expect -EINVAL, whereas
> -                        * others expect -EAFNOSUPPORT.
> +                        * others must handle this at the protocol level:
> +                        * connect(AF_UNSPEC) on a connected socket is
> +                        * a documented way disconnect the socket
>                          */
>                         if (sksec->sclass == SECCLASS_SCTP_SOCKET)
>                                 return -EINVAL;
> -                       else
> -                               return -EAFNOSUPPORT;
> +                       return 0;
>                 }
>
>                 err = sel_netport_sid(sk->sk_protocol, snum, &sid);
> --
> 2.20.1
Paolo Abeni May 10, 2019, 3:51 p.m. UTC | #2
On Fri, 2019-05-10 at 11:32 -0400, Paul Moore wrote:
> On Fri, May 10, 2019 at 9:49 AM Paolo Abeni <pabeni@redhat.com> wrote:
> > calling connect(AF_UNSPEC) on an already connected TCP socket is an
> > established way to disconnect() such socket. After commit 68741a8adab9
> > ("selinux: Fix ltp test connect-syscall failure") it no longer works
> > and, in the above scenario connect() fails with EAFNOSUPPORT.
> > 
> > Fix the above skipping the checks when the address family is not
> > AF_INET{4,6} - we don't have any port to validate, but leave the
> > SCTP code path untouched, as it has specific constraints.
> > 
> > Fixes: 68741a8adab9 ("selinux: Fix ltp test connect-syscall failure")
> > Reported-by: Tom Deseyn <tdeseyn@redhat.com>
> > Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> > ---
> > v1 -> v2:
> >  - avoid validation for AF_UNSPEC
> > ---
> >  security/selinux/hooks.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> What was wrong with explicitly checking for AF_UNSPEC as I mentioned
> in my last email?

Whoops sorry, I missed a relevant part of that email.

Reading it now.

To me, the 2 options look quite similar, and I have a slighter
preference for this one, being a smaller change possibly more suited to
a stable fix.

But if you have strong different opinions I can post the code you
suggested. I don't see any performance related issue with that.

Cheers,

Paolo
Paul Moore May 10, 2019, 4:09 p.m. UTC | #3
On Fri, May 10, 2019 at 11:52 AM Paolo Abeni <pabeni@redhat.com> wrote:
> On Fri, 2019-05-10 at 11:32 -0400, Paul Moore wrote:
> > On Fri, May 10, 2019 at 9:49 AM Paolo Abeni <pabeni@redhat.com> wrote:
> > > calling connect(AF_UNSPEC) on an already connected TCP socket is an
> > > established way to disconnect() such socket. After commit 68741a8adab9
> > > ("selinux: Fix ltp test connect-syscall failure") it no longer works
> > > and, in the above scenario connect() fails with EAFNOSUPPORT.
> > >
> > > Fix the above skipping the checks when the address family is not
> > > AF_INET{4,6} - we don't have any port to validate, but leave the
> > > SCTP code path untouched, as it has specific constraints.
> > >
> > > Fixes: 68741a8adab9 ("selinux: Fix ltp test connect-syscall failure")
> > > Reported-by: Tom Deseyn <tdeseyn@redhat.com>
> > > Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> > > ---
> > > v1 -> v2:
> > >  - avoid validation for AF_UNSPEC
> > > ---
> > >  security/selinux/hooks.c | 7 ++++---
> > >  1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > What was wrong with explicitly checking for AF_UNSPEC as I mentioned
> > in my last email?
>
> Whoops sorry, I missed a relevant part of that email.
>
> Reading it now.
>
> To me, the 2 options look quite similar, and I have a slighter
> preference for this one, being a smaller change possibly more suited to
> a stable fix.
>
> But if you have strong different opinions I can post the code you
> suggested. I don't see any performance related issue with that.

My thinking is that this patch affects address families other than
AF_UNSPEC, whereas the fix I suggested only affects AF_UNSPEC.  Given
the compatibility problems we have had with this code recently, I
would prefer what I suggested since it has the least impact to
userspace.  It also has the benefit of solving AF_UNSPEC regardless of
the SELinux socket class and moving the addrlen check higher up the
function; these things alone aren't really a big deal, but they are
nice side effects.
diff mbox series

Patch

diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index c61787b15f27..bccc4b3e6f57 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -4674,12 +4674,13 @@  static int selinux_socket_connect_helper(struct socket *sock,
 			break;
 		default:
 			/* Note that SCTP services expect -EINVAL, whereas
-			 * others expect -EAFNOSUPPORT.
+			 * others must handle this at the protocol level:
+			 * connect(AF_UNSPEC) on a connected socket is
+			 * a documented way disconnect the socket
 			 */
 			if (sksec->sclass == SECCLASS_SCTP_SOCKET)
 				return -EINVAL;
-			else
-				return -EAFNOSUPPORT;
+			return 0;
 		}
 
 		err = sel_netport_sid(sk->sk_protocol, snum, &sid);