Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1293379

Re: net: heap-out-of-bounds in sock_setsockopt

From Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Newsgroups linux.kernel
Subject Re: net: heap-out-of-bounds in sock_setsockopt
Date 2015-12-17 00:00 +0100
Message-ID <qGtd8-7St-5@gated-at.bofh.it> (permalink)
References <qGq5A-5XV-7@gated-at.bofh.it> <qGqRY-6vM-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


>
> Hmm, we should exclude the raw socket case, something like the
> following, but I am not sure if the check is too strict or not, also
> not sure if we should return an error for this raw socket case.

No, SOF_TIMESTAMPING_OPT_ID with SOCK_RAW/IPPROTO_TCP
is legitimate. It should fall through to initializing sk->sk_tskey to zero.
Only stream sockets should use the special case where numbering
is bytestream and computed by subtracting the seqno from the seqno
at the time that the option is enabled.

>
> diff --git a/net/core/sock.c b/net/core/sock.c
> index 765be83..c26e80a 100644
> --- a/net/core/sock.c
> +++ b/net/core/sock.c
> @@ -872,7 +872,7 @@ int sock_setsockopt(struct socket *sock, int
> level, int optname,
>
>                 if (val & SOF_TIMESTAMPING_OPT_ID &&
>                     !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) {
> -                       if (sk->sk_protocol == IPPROTO_TCP) {
> +                       if (sk->sk_protocol == IPPROTO_TCP &&
> sk->sk_type == SOCK_STREAM) {
>                                 if (sk->sk_state != TCP_ESTABLISHED) {
>                                         ret = -EINVAL;
>                                         break;

I made the same error when later returning the tskey in
__skb_tstamp_tx:

        if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) {
                serr->ee.ee_data = skb_shinfo(skb)->tskey;
                if (sk->sk_protocol == IPPROTO_TCP)
                        serr->ee.ee_data -= sk->sk_tskey;
        }

This has no effect if sk->sk_tskey is initialized to 0 with your patch. Still,
it should not treat SOCK_RAW as a TCP sock here, either. Please
add this if you're about to send the patch. Or I can send it separately,
if you prefer. Thanks for the quick fix.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Find similar | Unroll thread


Thread

net: heap-out-of-bounds in sock_setsockopt Dmitry Vyukov <dvyukov@google.com> - 2015-12-16 20:40 +0100
  Re: net: heap-out-of-bounds in sock_setsockopt Cong Wang <cwang@twopensource.com> - 2015-12-16 21:30 +0100
    Re: net: heap-out-of-bounds in sock_setsockopt Eric Dumazet <edumazet@google.com> - 2015-12-16 22:10 +0100
    Re: net: heap-out-of-bounds in sock_setsockopt Willem de Bruijn <willemdebruijn.kernel@gmail.com> - 2015-12-17 00:00 +0100

csiph-web