From: sashiko-bot@kernel.org
To: "Jens Remus" <jremus@linux.ibm.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH v15 12/20] unwind_user/sframe: Add .sframe validation option
Date: Wed, 20 May 2026 16:15:30 +0000 [thread overview]
Message-ID: <20260520161541.690781F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260520154004.3845823-13-jremus@linux.ibm.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
New issues:
- [High] Missing cond_resched() or fatal signal checking in the nested loops of sframe_validate_section() allows an unprivileged local attacker to trigger a CPU soft lockup.
- [Low] The validation logic in sframe_validate_section() incorrectly rejects a valid .sframe section if the first function is located at virtual address 0.
Pre-existing issues:
- [High] sframe_find() handles read failures by calling sframe_remove_section(), which acquires a lock inside NMI or IRQ context, leading to deadlocks or PREEMPT_RT panics.
--
commit 07d74be031cf9fade2b9ddd98bfdd8f52c38c2da
Author: Josh Poimboeuf <jpoimboe@kernel.org>
unwind_user/sframe: Add .sframe validation option
This commit introduces a debugging feature to optionally validate the
entire .sframe section upon loading, rather than checking on-demand.
It uses user_read_access_begin/end to read FDEs and FREs to verify their
formatting and sorting.
> diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c
> --- a/kernel/unwind/sframe.c
> +++ b/kernel/unwind/sframe.c
[ ... ]
> int sframe_find(unsigned long ip, struct unwind_user_frame *frame)
> {
[ ... ]
> ret = __find_fre(sec, &fde, ip, frame);
> end_uaccess:
> user_read_access_end();
>
> end:
> if (ret && ret != -ENOENT) {
> dbg_sec("removing bad .sframe section\n");
> WARN_ON_ONCE(sframe_remove_section(sec->sframe_start));
> }
>
> return ret;
> }
[Severity: High]
This isn't a bug introduced by this patch, but does calling
sframe_remove_section() here risk a deadlock or panic on PREEMPT_RT?
If a page fault occurs during user memory access, unsafe_copy_from_user()
returns -EFAULT to prevent sleeping.
However, sframe_find() handles any error other than -ENOENT by calling
sframe_remove_section(), which in turn calls mtree_erase().
Since mtree_erase() takes an internal spinlock, doing this in NMI context
(where sframe_find() is often called) can deadlock or panic a PREEMPT_RT
kernel, while also permanently deleting a valid unwind section due to
transient memory pressure.
[ ... ]
> +#ifdef CONFIG_SFRAME_VALIDATION
[ ... ]
> +static int sframe_validate_section(struct sframe_section *sec)
> +{
> + unsigned long prev_ip = 0;
> + unsigned int i;
> +
> + for (i = 0; i < sec->num_fdes; i++) {
> + struct sframe_fre_internal *fre, *prev_fre = NULL;
> + unsigned long ip, fre_addr;
> + struct sframe_fde_internal fde;
> + struct sframe_fre_internal fres[2];
> + bool which = false;
> + unsigned int j;
> + int ret;
> +
> + ret = safe_read_fde(sec, i, &fde);
> + if (ret) {
> + dbg_sec("safe_read_fde(%u) failed\n", i);
> + return ret;
> + }
> +
> + ip = fde.func_addr;
> + if (ip <= prev_ip) {
[Severity: Low]
Does this check accidentally reject valid sections where the first
function is located at virtual address 0?
Since prev_ip is initialized to 0, validating the first FDE when ip is 0
will cause this check to evaluate to true, falsely triggering an -EINVAL.
Valid executables can map their text section at 0 if vm.mmap_min_addr is
set to 0.
> + dbg_sec("FDE %u not sorted\n", i);
> + return -EINVAL;
> + }
> + prev_ip = ip;
> +
> + fre_addr = sec->fres_start + fde.fres_off;
> + for (j = 0; j < fde.fres_num; j++) {
[ ... ]
> + fre_addr += fre->size;
> +
> + if (prev_fre && fre->ip_off <= prev_fre->ip_off) {
> + dbg_sec("FDE %u: FRE %u not sorted\n", i, j);
> + return -EINVAL;
> + }
> +
> + prev_fre = fre;
> + }
[Severity: High]
Could a malicious user exploit these loops to trigger a CPU soft lockup?
The variables sec->num_fdes and fde.fres_num are user-controlled and
bounded only by the VMA size.
Without a cond_resched() or fatal signal check, an attacker could supply
large counts and cause these loops to run for seconds without yielding.
On non-preemptible kernels, this monopolizes the CPU and triggers the soft
lockup watchdog, resulting in a local denial of service.
> + }
> +
> + return 0;
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260520154004.3845823-1-jremus@linux.ibm.com?part=12
next prev parent reply other threads:[~2026-05-20 16:15 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-20 15:39 [PATCH v15 00/20] unwind_deferred: Implement sframe handling Jens Remus
2026-05-20 15:39 ` [PATCH v15 01/20] unwind_user: Add generic and arch-specific headers to MAINTAINERS Jens Remus
2026-05-20 15:39 ` [PATCH v15 02/20] unwind_user/sframe: Add support for reading .sframe headers Jens Remus
2026-05-20 16:02 ` sashiko-bot
2026-05-21 7:58 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 03/20] unwind_user/sframe: Store .sframe section data in per-mm maple tree Jens Remus
2026-05-20 16:29 ` sashiko-bot
2026-05-21 9:39 ` Jens Remus
2026-05-21 16:08 ` Steven Rostedt
2026-05-20 15:39 ` [PATCH v15 04/20] x86/uaccess: Add unsafe_copy_from_user() implementation Jens Remus
2026-05-20 16:13 ` sashiko-bot
2026-05-20 15:39 ` [PATCH v15 05/20] unwind_user/sframe: Add support for reading .sframe contents Jens Remus
2026-05-20 16:33 ` sashiko-bot
2026-05-21 9:40 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 06/20] unwind_user/sframe: Detect .sframe sections in executables Jens Remus
2026-05-20 15:39 ` [PATCH v15 07/20] unwind_user/sframe: Wire up unwind_user to sframe Jens Remus
2026-05-20 16:23 ` sashiko-bot
2026-05-21 10:44 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 08/20] unwind_user: Stop when reaching an outermost frame Jens Remus
2026-05-20 16:01 ` sashiko-bot
2026-05-21 10:45 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 09/20] unwind_user/sframe: Add support for outermost frame indication Jens Remus
2026-05-20 16:01 ` sashiko-bot
2026-05-21 10:46 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 10/20] unwind_user/sframe: Remove .sframe section on detected corruption Jens Remus
2026-05-20 16:26 ` sashiko-bot
2026-05-20 15:39 ` [PATCH v15 11/20] unwind_user/sframe: Show file name in debug output Jens Remus
2026-05-20 16:14 ` sashiko-bot
2026-05-21 10:55 ` Jens Remus
2026-05-21 16:20 ` Steven Rostedt
2026-05-20 15:39 ` [PATCH v15 12/20] unwind_user/sframe: Add .sframe validation option Jens Remus
2026-05-20 16:15 ` sashiko-bot [this message]
2026-05-21 12:51 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 13/20] unwind_user: Enable archs that pass RA in a register Jens Remus
2026-05-20 16:21 ` sashiko-bot
2026-05-21 13:00 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 14/20] unwind_user: Flexible FP/RA recovery rules Jens Remus
2026-05-20 15:39 ` [PATCH v15 15/20] unwind_user: Flexible CFA " Jens Remus
2026-05-20 16:22 ` sashiko-bot
2026-05-21 11:33 ` Jens Remus
2026-05-20 15:40 ` [PATCH v15 16/20] unwind_user/sframe: Add support for SFrame V3 flexible FDEs Jens Remus
2026-05-20 17:04 ` sashiko-bot
2026-05-21 11:58 ` Jens Remus
2026-05-20 15:40 ` [PATCH v15 17/20] unwind_user/sframe: Separate reading of FRE from reading of FRE data words Jens Remus
2026-05-20 16:48 ` sashiko-bot
2026-05-20 15:40 ` [PATCH v15 18/20] unwind_user/sframe: Duplicate registered .sframe section data on clone/fork Jens Remus
2026-05-20 17:01 ` sashiko-bot
2026-05-21 12:05 ` Jens Remus
2026-05-20 15:40 ` [PATCH v15 19/20] unwind_user/sframe/x86: Enable sframe unwinding on x86 Jens Remus
2026-05-20 15:40 ` [PATCH v15 20/20] unwind_user/sframe: Add prctl() interface for registering .sframe sections Jens Remus
2026-05-20 16:52 ` sashiko-bot
2026-05-21 12:08 ` Jens Remus
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=20260520161541.690781F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=jremus@linux.ibm.com \
--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.