BPF List
 help / color / mirror / Atom feed
From: Martin Kelly <martin.kelly@crowdstrike.com>
To: Yonghong Song <yonghong.song@linux.dev>, <bpf@vger.kernel.org>
Cc: Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>
Subject: Re: Memory corruption in out_batch parameter of batch lookup APIs
Date: Tue, 20 Feb 2024 17:02:27 -0800	[thread overview]
Message-ID: <5293d90d-7bed-40e6-9f53-7524a9877fd5@crowdstrike.com> (raw)
In-Reply-To: <0aa59bdf-b443-4a56-bdec-368c958c9629@linux.dev>

On 2/19/24 17:22, Yonghong Song wrote:
>
> On 2/16/24 4:24 PM, Martin Kelly wrote:
>> Hi, I noticed there's a subtlety to to the batch APIs 
>> (bpf_map_lookup_batch and bpf_map_lookup_and_delete_batch) that can 
>> lead to bugs if callers are not careful, and I'm wondering about the 
>> best way to document or address it.
>>
>> Specifically, the size of the data pointed to by in_batch/out_batch 
>> is not clear, and if it's too small, the caller can see memory/stack 
>> corruption. The function documentation isn't super clear about this, 
>> calling in_batch "address of the first element in batch to read", so 
>> a caller might reasonably assume that a pointer size is fine. 
>> However, the right size actually depends on the map type.
>>
>> For hash and array maps, out_batch will be u32 (as the parameter is 
>> used as an index). But for LPM trie, it will be the size of the key 
>> (in the case of LPM trie, I think that's 260 bytes). If a caller 
>> passes a pointer to memory smaller the key size, the kernel will 
>> overwrite past that memory and corrupt the stack (or wherever 
>> out_batch points). This is because of the copy_to_user(uobatch, 
>> prev_key, map->key_size) at the end of generic_map_lookup_batch.
>>
>> It seems to me that we could add documentation to these functions 
>> indicating that out_batch should be able to hold at least one key to 
>> be safe. This is simple but overly strict (at the moment) for all map 
>> types other than LPM trie. However, if we specifically call out LPM 
>> trie as needing key-sized width while other map types need 4 bytes, 
>> then this documentation could easily become out-of-date as new map 
>> types are added.
>>
>> We could alternatively add a statement like "out_batch should 
>> generally point to memory large enough to hold a single key, but for 
>> some map implementations a smaller type is possible". This gives more 
>> information but might be too vague for many API users, and it means 
>> future kernels could be tied to this implementation to avoid breaking 
>> users.
>>
>> Any thoughts/preferences on how best to handle this? I'm happy to 
>> send a patch clarifying the documentation, but I'd like to get a 
>> general consensus on the best way to proceed first.
>
> For in_batch/out_batch, the only exception is hashmap which has 
> in_batch/out_batch memory size to be 32.
> For all other supported maps, in_batch/out_batch memory size should be 
> equal to their corresponding key size.
> Maybe you can clarify this in include/uapi/linux/bpf.h?
>
> We can update the documentation later if there are any exceptions to 
> the above rule.
That sounds reasonable; I sent a patch for this. Thanks!
>
>>
>> Thanks,
>>
>> Martin
>>

      reply	other threads:[~2024-02-21  1:02 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-17  0:24 Memory corruption in out_batch parameter of batch lookup APIs Martin Kelly
2024-02-20  1:22 ` Yonghong Song
2024-02-21  1:02   ` Martin Kelly [this message]

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=5293d90d-7bed-40e6-9f53-7524a9877fd5@crowdstrike.com \
    --to=martin.kelly@crowdstrike.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=yonghong.song@linux.dev \
    /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