linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Borkmann <daniel@iogearbox.net>
To: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Cc: Dongseok Yi <dseok.yi@samsung.com>,
	"David S. Miller" <davem@davemloft.net>,
	Willem de Bruijn <willemb@google.com>,
	Jakub Kicinski <kuba@kernel.org>,
	Miaohe Lin <linmiaohe@huawei.com>,
	Paolo Abeni <pabeni@redhat.com>, Florian Westphal <fw@strlen.de>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Guillaume Nault <gnault@redhat.com>,
	Yunsheng Lin <linyunsheng@huawei.com>,
	Steffen Klassert <steffen.klassert@secunet.com>,
	Yadu Kishore <kyk.segfault@gmail.com>,
	Marco Elver <elver@google.com>,
	Network Development <netdev@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	namkyu78.kim@samsung.com
Subject: Re: [PATCH net v2] net: fix use-after-free when UDP GRO with shared fraglist
Date: Fri, 8 Jan 2021 11:32:17 +0100	[thread overview]
Message-ID: <f03df7ae-cb1f-8775-2302-51785c0761c2@iogearbox.net> (raw)
In-Reply-To: <CAF=yD-+bqps5PQLzuVtPgVAPDrk6ZjA0sk+gyj8JTd9BPYozWw@mail.gmail.com>

On 1/7/21 3:44 PM, Willem de Bruijn wrote:
> On Thu, Jan 7, 2021 at 8:33 AM Daniel Borkmann <daniel@iogearbox.net> wrote:
>> On 1/7/21 2:05 PM, Willem de Bruijn wrote:
>>> On Thu, Jan 7, 2021 at 7:52 AM Daniel Borkmann <daniel@iogearbox.net> wrote:
>>>> On 1/7/21 12:40 PM, Dongseok Yi wrote:
>>>>> On 2021-01-07 20:05, Daniel Borkmann wrote:
>>>>>> On 1/7/21 1:39 AM, Dongseok Yi wrote:
[...]
>>>>> PF_PACKET handles untouched fraglist. To modify the payload only
>>>>> for udp_rcv_segment, skb_unclone is necessary.
>>>>
>>>> I don't parse this last sentence here, please elaborate in more detail on why
>>>> it is necessary.
>>>>
>>>> For example, if tc layer would modify mark on the skb, then __copy_skb_header()
>>>> in skb_segment_list() will propagate it. If tc layer would modify payload, the
>>>> skb_ensure_writable() will take care of that internally and if needed pull in
>>>> parts from fraglist into linear section to make it private. The purpose of the
>>>> skb_clone() above iff shared is to make the struct itself private (to safely
>>>> modify its struct members). What am I missing?
>>>
>>> If tc writes, it will call skb_make_writable and thus pskb_expand_head
>>> to create a private linear section for the head_skb.
>>>
>>> skb_segment_list overwrites part of the skb linear section of each
>>> fragment itself. Even after skb_clone, the frag_skbs share their
>>> linear section with their clone in pf_packet, so we need a
>>> pskb_expand_head here, too.
>>
>> Ok, got it, thanks for the explanation. Would be great to have it in the v3 commit
>> log as well as that was more clear than the above. Too bad in that case (otoh
>> the pf_packet situation could be considered corner case ...); ether way, fix makes
>> sense then.
> 
> Thanks for double checking the tricky logic. Pf_packet + BPF is indeed
> a peculiar corner case. But there are perhaps more, like raw sockets,
> and other BPF hooks that can trigger an skb_make_writable.
> 
> Come to think of it, the no touching shared data rule is also violated
> without a BPF program? Then there is nothing in the frag_skbs
> themselves signifying that they are shared, but the head_skb is
> cloned, so its data may still not be modified.

The skb_ensure_writable() is used in plenty of places from bpf, ovs, netfilter
to core stack (e.g. vlan, mpls, icmp), but either way there should be nothing
wrong with that as it's making sure to pull the data into its linear section
before modification. Uncareful use of skb_store_bits() with offset into skb_frags
for example could defeat that, but I don't see any in-tree occurrence that would
be problematic at this point..

> This modification happens to be safe in practice, as the pf_packet
> clones don't access the bytes before skb->data where this path inserts
> headers. But still.

  reply	other threads:[~2021-01-08 10:33 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20210104085750epcas2p1a5b22559d87df61ef3c8215ae0b470b5@epcas2p1.samsung.com>
2021-01-04  8:46 ` [PATCH net] net: fix use-after-free when UDP GRO with shared fraglist Dongseok Yi
2021-01-04 21:03   ` Willem de Bruijn
2021-01-06  1:29     ` Dongseok Yi
2021-01-06  3:07       ` Willem de Bruijn
2021-01-06  3:32         ` Dongseok Yi
2021-01-06 17:13           ` Willem de Bruijn
2021-04-17  3:44           ` Yunsheng Lin
2021-04-19  0:35             ` Dongseok Yi
2021-04-21  9:42               ` Yunsheng Lin
2021-04-21 11:04                 ` Dongseok Yi
     [not found]   ` <CGME20210107005028epcas2p35dfa745fd92e31400024874f54243556@epcas2p3.samsung.com>
2021-01-07  0:39     ` [PATCH net v2] " Dongseok Yi
2021-01-07 11:05       ` Daniel Borkmann
2021-01-07 11:40         ` Dongseok Yi
2021-01-07 12:49           ` Daniel Borkmann
2021-01-07 13:05             ` Willem de Bruijn
2021-01-07 13:33               ` Daniel Borkmann
2021-01-07 14:44                 ` Willem de Bruijn
2021-01-08 10:32                   ` Daniel Borkmann [this message]
     [not found]       ` <CGME20210108024017epcas2p455fe96b8483880f9b7a654dbcf600b20@epcas2p4.samsung.com>
2021-01-08  2:28         ` [PATCH net v3] " Dongseok Yi
2021-01-08 10:18           ` Daniel Borkmann
2021-01-09  3:14             ` Jakub Kicinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f03df7ae-cb1f-8775-2302-51785c0761c2@iogearbox.net \
    --to=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=dseok.yi@samsung.com \
    --cc=elver@google.com \
    --cc=fw@strlen.de \
    --cc=gnault@redhat.com \
    --cc=kuba@kernel.org \
    --cc=kyk.segfault@gmail.com \
    --cc=linmiaohe@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linyunsheng@huawei.com \
    --cc=namkyu78.kim@samsung.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=steffen.klassert@secunet.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willemb@google.com \
    --cc=willemdebruijn.kernel@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).