All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Borkmann <daniel@iogearbox.net>
To: Alexei Starovoitov <ast@fb.com>,
	"David S . Miller" <davem@davemloft.net>
Cc: Tobias Waldekranz <tobias@waldekranz.com>,
	Brendan Gregg <brendan.d.gregg@gmail.com>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel-team@fb.com
Subject: Re: [PATCH net-next] bpf: avoid copying junk bytes in bpf_get_current_comm()
Date: Fri, 11 Mar 2016 19:02:38 +0100	[thread overview]
Message-ID: <56E3083E.6010001@iogearbox.net> (raw)
In-Reply-To: <56E2FE44.7040904@fb.com>

On 03/11/2016 06:20 PM, Alexei Starovoitov wrote:
> On 3/11/16 2:24 AM, Daniel Borkmann wrote:
>> On 03/10/2016 05:02 AM, Alexei Starovoitov wrote:
>>> Lots of places in the kernel use memcpy(buf, comm, TASK_COMM_LEN); but
>>> the result is typically passed to print("%s", buf) and extra bytes
>>> after zero don't cause any harm.
>>> In bpf the result of bpf_get_current_comm() is used as the part of
>>> map key and was causing spurious hash map mismatches.
>>> Use strlcpy() to guarantee zero-terminated string.
>>> bpf verifier checks that output buffer is zero-initialized,
>>
>> Sorry for late reply, more below:
>>
>>> so even for short task names the output buffer don't have junk bytes.
>>> Note it's not a security concern, since kprobe+bpf is root only.
>>>
>>> Fixes: ffeedafbf023 ("bpf: introduce current->pid, tgid, uid, gid,
>>> comm accessors")
>>> Reported-by: Tobias Waldekranz <tobias@waldekranz.com>
>>> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
>> [...]
>>> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
>>> index 4504ca66118d..50da680c479f 100644
>>> --- a/kernel/bpf/helpers.c
>>> +++ b/kernel/bpf/helpers.c
>>> @@ -166,7 +166,7 @@ static u64 bpf_get_current_comm(u64 r1, u64 size,
>>> u64 r3, u64 r4, u64 r5)
>>>       if (!task)
>>>           return -EINVAL;
>>>
>>> -    memcpy(buf, task->comm, min_t(size_t, size, sizeof(task->comm)));
>>> +    strlcpy(buf, task->comm, min_t(size_t, size, sizeof(task->comm)));
>>
>> If I see this correctly, __set_task_comm() makes sure comm is always zero
>> terminated, so that seems good, but isn't it already sufficient when
>> switching
>> to strlcpy() to simply use:
>>
>>      strlcpy(buf, task->comm, size);
>>
>> The min_t() seems unnecessary work to me, why do we still need it? size
>> is guaranteed to be > 0 through the eBPF verifier, so strlcpy() should take
>> care of the rest.
>
> that's one clever optimization. yep. we can drop min_t.
> btw I wanted to add memset to __set_task_comm, keep memcpy in
> bpf_get_current_comm and optimize perf_event_comm_event
> (which doing: memset+strlcpy and can be replaced with memcpy),
> but figured that such 'fix' is not suitable for stable.
> I guess we can do in the next cycle? strlen is not cheap.
> Especially since it turned out that bpf_get_current_comm() is
> used very often in the hot path in bcc/tools.

Would strscpy() help in this case (see 30035e45753b ("string: provide
strscpy()"))?

> Also for the next cycle I'm planning to extend verifier to
> allow uninitialized stack to be passed to functions like
> bpf_get_current_comm() and they would have to zero it in
> error cases. Then we can save few more cycles from the programs.

That would be useful also for other helpers indeed.

  reply	other threads:[~2016-03-11 18:02 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-10  4:02 [PATCH net-next] bpf: avoid copying junk bytes in bpf_get_current_comm() Alexei Starovoitov
2016-03-10  4:28 ` David Miller
2016-03-11 10:24 ` Daniel Borkmann
2016-03-11 17:20   ` Alexei Starovoitov
2016-03-11 18:02     ` Daniel Borkmann [this message]
2016-03-11 18:35       ` Alexei Starovoitov

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=56E3083E.6010001@iogearbox.net \
    --to=daniel@iogearbox.net \
    --cc=ast@fb.com \
    --cc=brendan.d.gregg@gmail.com \
    --cc=davem@davemloft.net \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=tobias@waldekranz.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.