From: sashiko-bot@kernel.org
To: "Amery Hung" <ameryhung@gmail.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH bpf-next v4 02/15] bpf: Make struct_ops tasks_rcu grace period optional
Date: Thu, 17 Sep 2026 20:30:38 +0000 [thread overview]
Message-ID: <20260917203039.584D81F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260917200542.3689605-3-ameryhung@gmail.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] bpf: Use-After-Free of struct_ops map due to RCU ordering violation
--
commit c2c7b791d71f80e6fb709587eda6dfcc6d96d460
Author: Martin KaFai Lau <martin.lau@kernel.org>
bpf: Make struct_ops tasks_rcu grace period optional
bpf_struct_ops_map_free() currently waits for both a regular RCU grace
period and a tasks RCU grace period for every struct_ops map through
synchronize_rcu_mult(call_rcu, call_rcu_tasks).
Add a map_free_pre_rcu() callback so the struct_ops map can remove
ksyms before bpf_map_put() wait for the regular rcu grace period.
> diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c
> index 3935bf35a4237..7802859eac1ea 100644
> --- a/kernel/bpf/bpf_struct_ops.c
> +++ b/kernel/bpf/bpf_struct_ops.c
> @@ -1037,24 +1046,8 @@ static void bpf_struct_ops_map_free(struct bpf_map *map)
>
> bpf_struct_ops_map_dissoc_progs(st_map);
[Severity: Medium]
Since map->free_after_rcu_gp = true is now set in bpf_struct_ops_map_alloc(),
this function executes after the regular RCU grace period. This means
prog->aux->st_ops_assoc is only cleared after the grace period ends.
Does this violate the RCU 'remove before reclaim' invariant?
A BPF program executing after the RCU grace period (for example, via
bpf_prog_test_run()) can read the stale pointer in
bpf_prog_get_assoc_struct_ops():
kernel/bpf/bpf_struct_ops.c:bpf_prog_get_assoc_struct_ops() {
...
st_ops_assoc = rcu_dereference_check(aux->st_ops_assoc, bpf_rcu_lock_held());
...
}
Because the pointer hasn't been cleared yet, the program will read the stale
map pointer, leading to a Use-After-Free when this workqueue subsequently
frees the map.
Can this be exploited using bpf_dummy_ops by closing the map to
trigger the RCU grace period and calling bpf_prog_test_run(prog_fd) exactly
after the grace period ends?
> - bpf_struct_ops_map_del_ksyms(st_map);
> -
> - /* The struct_ops's function may switch to another struct_ops.
[ ... ]
> @@ -1163,6 +1156,7 @@ static struct bpf_map *bpf_struct_ops_map_alloc(union bpf_attr *attr)
>
> mutex_init(&st_map->lock);
> bpf_map_init_from_attr(map, attr);
> + map->free_after_rcu_gp = true;
[Severity: Medium]
Setting this flag shifts the RCU grace period to occur asynchronously before
the map free workqueue executes, which causes the aforementioned Use-After-Free
issue.
Should bpf_struct_ops_map_dissoc_progs() be called in
bpf_struct_ops_map_free_pre_rcu() instead to ensure the RCU pointer is
cleared before the grace period begins?
>
> return map;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260917200542.3689605-1-ameryhung@gmail.com?part=2
next prev parent reply other threads:[~2026-09-17 20:30 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-17 20:05 [PATCH bpf-next v4 00/15] bpf: A common way to attach struct_ops to a cgroup Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 01/15] bpf: Remove __rcu tagging in st_link->map Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 02/15] bpf: Make struct_ops tasks_rcu grace period optional Amery Hung
2026-09-17 20:30 ` sashiko-bot [this message]
2026-09-17 21:34 ` bot+bpf-ci
2026-09-17 20:05 ` [PATCH bpf-next v4 03/15] bpf: Add bpf_struct_ops accessor helpers Amery Hung
2026-09-17 20:18 ` sashiko-bot
2026-09-17 21:16 ` bot+bpf-ci
2026-09-17 20:05 ` [PATCH bpf-next v4 04/15] bpf: Remove unnecessary prog_list_prog() check Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 05/15] bpf: Replace prog_list_prog() check with direct pl->prog and pl->link check Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 06/15] bpf: Add prog_list_init_item(), prog_list_replace_item(), and prog_list_id() Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 07/15] bpf: Move LSM trampoline unlink into bpf_cgroup_link_auto_detach() Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 08/15] bpf: Add a few bpf_cgroup_array_* helper functions Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 09/15] bpf: Add infrastructure to support attaching struct_ops to cgroups Amery Hung
2026-09-17 21:34 ` bot+bpf-ci
2026-09-17 20:05 ` [PATCH bpf-next v4 10/15] bpf: Allow all struct_ops to use bpf_dynptr_from_skb() Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 11/15] bpf: tcp: Support selected sock_ops callbacks as struct_ops Amery Hung
2026-09-17 21:34 ` bot+bpf-ci
2026-09-17 20:05 ` [PATCH bpf-next v4 12/15] bpf: tcp: Support parse/len/write header option hooks in bpf_tcp_ops Amery Hung
2026-09-17 21:34 ` bot+bpf-ci
2026-09-17 20:05 ` [PATCH bpf-next v4 13/15] libbpf: Support attaching struct_ops to a cgroup Amery Hung
2026-09-17 20:05 ` [PATCH bpf-next v4 14/15] selftests/bpf: Test " Amery Hung
2026-09-17 20:23 ` sashiko-bot
2026-09-17 21:34 ` bot+bpf-ci
2026-09-17 20:05 ` [PATCH bpf-next v4 15/15] selftests/bpf: Add test for bpf_tcp_ops header option hooks Amery Hung
2026-09-19 5:40 ` [PATCH bpf-next v4 00/15] bpf: A common way to attach struct_ops to a cgroup patchwork-bot+netdevbpf
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=20260917203039.584D81F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=ameryhung@gmail.com \
--cc=bpf@vger.kernel.org \
--cc=sashiko-reviews@lists.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 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.