bpf: fix use-after-free in bpf_uprobe_multi_link_attach()
Subsystems (5)
PATCH 1/1 bpf: fix use-after-free in bpf_uprobe_multi_link_attach()
If bpf_link_prime() fails, bpf_uprobe_multi_link_attach() goes to the error_free label and frees the array of bpf_uprobe's without calling bpf_uprobe_unregister().
This leaks bpf_uprobe->uprobe and worse, this frees bpf_uprobe->consumer without removing it from the uprobe->consumers list.
--- kernel/trace/bpf_trace.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
kernel/trace/bpf_trace.c +6 -3
@@ -3484,17 +3484,20 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr &uprobes[i].consumer);if (IS_ERR (uprobes[i].uprobe)) { err =PTR_ERR (uprobes[i].uprobe); -bpf_uprobe_unregister (uprobes, i); - goto error_free; + link->cnt = i; + goto error_unregister; } } err =bpf_link_prime (&link->link, &link_primer);if (err) - goto error_free; + goto error_unregister;return bpf_link_settle (&link_primer); +error_unregister: +bpf_uprobe_unregister (uprobes, link->cnt); + error_free:kvfree (uprobes);kfree (link);
Signature · 1 line
2.25.1.362.g51ebf55
Quoted 7 lines · Oleg Nesterov
If
bpf_link_prime()fails,bpf_uprobe_multi_link_attach()goes to theerror_freelabel and frees the array of bpf_uprobe's without callingbpf_uprobe_unregister().This leaks
bpf_uprobe->uprobeand worse, this freesbpf_uprobe->consumerwithout removing it from theuprobe->consumerslist.
Quoted 7 lines
Fixes 89ae89f53d20 ("bpf: Add multi uprobe link")Reported-by [email protected]Tested-by [email protected]Acked-by Andrii Nakryiko <[email protected]>Signed-off-by Oleg Nesterov <[email protected]>
thanks for fixing this
jirka
Quoted 36 lines
--- kernel/trace/bpf_trace.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)kernel/trace/bpf_trace.c +6
-3@@ -3484,17 +3484,20 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr &uprobes[i].consumer);if (IS_ERR (uprobes[i].uprobe)) { err =PTR_ERR (uprobes[i].uprobe); -bpf_uprobe_unregister (uprobes, i); - goto error_free; + link->cnt = i; + goto error_unregister; } } err =bpf_link_prime (&link->link, &link_primer);if (err) - goto error_free; + goto error_unregister;return bpf_link_settle (&link_primer); +error_unregister: +bpf_uprobe_unregister (uprobes, link->cnt); + error_free:kvfree (uprobes);kfree (link);Signature · 1 line
2.25.1.362.g51ebf55
[tip: perf/core] bpf: Fix use-after-free in bpf_uprobe_multi_link_attach()
In reply to Oleg NesterovThe following commit has been merged into the perf/core branch of tip:
The following commit has been merged into the perf/core branch of tip:
Commit-ID: 5fe6e308abaea082c20fbf2aa5df8e14495622cf Gitweb: https://git.kernel.org/tip/5fe6e308abaea082c20fbf2aa5df8e14495622cf Author: Oleg Nesterov <[email protected]> AuthorDate: Tue, 13 Aug 2024 17:25:24 +02:00 Committer: Peter Zijlstra <[email protected]> CommitterDate: Thu, 05 Sep 2024 16:56:13 +02:00
bpf: Fix use-after-free in bpf_uprobe_multi_link_attach()
If bpf_link_prime() fails, bpf_uprobe_multi_link_attach() goes to the error_free label and frees the array of bpf_uprobe's without calling bpf_uprobe_unregister().
This leaks bpf_uprobe->uprobe and worse, this frees bpf_uprobe->consumer without removing it from the uprobe->consumers list.
--- kernel/trace/bpf_trace.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
kernel/trace/bpf_trace.c +6 -3
@@ -3484,17 +3484,20 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr &uprobes[i].consumer);if (IS_ERR (uprobes[i].uprobe)) { err =PTR_ERR (uprobes[i].uprobe); -bpf_uprobe_unregister (uprobes, i); - goto error_free; + link->cnt = i; + goto error_unregister; } } err =bpf_link_prime (&link->link, &link_primer);if (err) - goto error_free; + goto error_unregister;return bpf_link_settle (&link_primer); +error_unregister: +bpf_uprobe_unregister (uprobes, link->cnt); + error_free:kvfree (uprobes);kfree (link);