From: Yonghong Song <yonghong.song@linux.dev>
To: sashiko-reviews@lists.linux.dev
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH bpf-next v9 19/23] libbpf: Let the static linker carry .bpf_cleanup relocations
Date: Thu, 8 Oct 2026 18:26:58 +0200 [thread overview]
Message-ID: <ad01cc17-7226-4d13-aaeb-741a772308d2@linux.dev> (raw)
In-Reply-To: <sashiko-outbox-163810@kernel.org>
On 10/8/26 10:14 AM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] libbpf: OOB array access in linker_append_elf_relos via malformed ELF symbol
> --
>
> commit c7a7a96d1dd021ce6e4bcaa13fd9ec618fb1f8cf
> Author: Yonghong Song <yonghong.song@linux.dev>
>
> libbpf: Let the static linker carry .bpf_cleanup relocations
>
> Each field of a .bpf_cleanup record is a byte offset into a code section: a
> 32-bit relocation against that section's symbol, with the offset as the
> implicit addend. The patch updates the linker to handle R_BPF_64_NODYLD32
> and R_BPF_64_ABS32 relocations against non-executable sections.
>
>> diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c
>> index f3f71c452f007..c607f51e3cb46 100644
>> --- a/tools/lib/bpf/linker.c
>> +++ b/tools/lib/bpf/linker.c
> [ ... ]
>
>> @@ -2297,6 +2299,39 @@ static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *ob
>> if (linker->swapped_endian)
>> off = bswap_64(off);
>> memcpy(ptr, &off, sizeof(off));
>> + } else if ((sym_type == R_BPF_64_NODYLD32 ||
>> + sym_type == R_BPF_64_ABS32) &&
>> + (sec->shdr->sh_flags & SHF_EXECINSTR)) {
> [Severity: Medium]
> Could this result in an out-of-bounds memory access?
>
> If an ELF file contains a malformed STT_SECTION symbol with an st_shndx
We should not care this since the elf file is *malformed*.
> value >= SHN_LORESERVE (such as SHN_ABS), it bypasses the bounds check against
> obj->sec_cnt in linker_sanity_check_elf_symtab():
>
> if (sym->st_shndx < SHN_LORESERVE && sym->st_shndx >= obj->sec_cnt) { ... }
>
> When processing relocations against this symbol, linker_append_elf_relos()
> indexes the obj->secs array using this out-of-bounds st_shndx:
>
> struct src_sec *sec = &obj->secs[src_sym->st_shndx];
>
> The newly added relocation handling branch for R_BPF_64_NODYLD32 and
> R_BPF_64_ABS32 then directly dereferences the out-of-bounds sec->shdr and
> sec->dst_off pointers. Can this lead to an out-of-bounds read and a
> segmentation fault when linking an untrusted ELF file?
>
>> + /*
>> + * A byte offset into a code section,
>> + * stored in place. LLVM spells this
>> + * relocation NODYLD32 and GNU as
>> + * spells it ABS32; being bytes, the
>> + * section's new start goes in as it
>> + * is, not scaled the way a call's
>> + * instruction index is above.
>> + *
>> + * r_offset is checked only for an
>> + * executable section, and SHT_NOBITS
>> + * has no raw_data, so bound it here --
>> + * subtracting, so it cannot wrap.
>> + */
>> + if (!dst_linked_sec->raw_data ||
>> + dst_linked_sec->sec_sz < (int)sizeof(*val) ||
>> + dst_rel->r_offset % sizeof(*val) ||
>> + dst_rel->r_offset >
>> + (size_t)dst_linked_sec->sec_sz - sizeof(*val)) {
>> + pr_warn("ELF relo #%d in section #%zu points outside the data of section '%s' in %s\n",
>> + j, src_sec->sec_idx,
>> + dst_linked_sec->sec_name,
>> + obj->filename);
>> + return -EINVAL;
>> + }
>> + val = dst_linked_sec->raw_data + dst_rel->r_offset;
>> + if (linker->swapped_endian)
>> + *val = bswap_32(bswap_32(*val) + sec->dst_off);
>> + else
>> + *val += sec->dst_off;
>> } else {
>> pr_warn("relocation against STT_SECTION in non-exec section is not supported!\n");
>> return -EINVAL;
next prev parent reply other threads:[~2026-10-08 16:27 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-08 7:49 [PATCH bpf-next v9 00/23] bpf: Run exception cleanup landing pads when bpf_unwind() unwinds Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 01/23] bpf: Pack bpf_insn_aux_data flags into bit fields Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 02/23] bpf: Accept the compiler's exception cleanup table at program load Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 03/23] bpf: Add the bpf_unwind() and bpf_unwind_resume() kfuncs Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 04/23] bpf: Keep a call site's landing pad in insn_aux_data, add lookups Yonghong Song
2026-10-08 8:01 ` sashiko-bot
2026-10-08 15:58 ` Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 05/23] bpf: Mark covered call sites and check a program can take a table Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 06/23] bpf: Make exception landing pads reachable in the CFG Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 07/23] bpf: Verify an unwind through landing pads and epilogues Yonghong Song
2026-10-08 8:57 ` bot+bpf-ci
2026-10-08 16:07 ` Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 08/23] bpf: Refuse a landing pad that does not resume Yonghong Song
2026-10-08 8:57 ` bot+bpf-ci
2026-10-08 16:11 ` Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 09/23] bpf: Do not use a private stack for a program that can unwind Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 10/23] bpf: Prepare JITed programs for dispatching cleanup pads Yonghong Song
2026-10-08 7:50 ` [PATCH bpf-next v9 11/23] bpf: Dispatch cleanup pads by rewriting return addresses Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 12/23] bpf: Refuse a trampoline that calls a subprog that can unwind Yonghong Song
2026-10-08 8:14 ` sashiko-bot
2026-10-08 16:19 ` Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 13/23] bpf, x86: Dispatch exception cleanup pads at run time Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 14/23] bpf, arm64: " Yonghong Song
2026-10-08 8:39 ` bot+bpf-ci
2026-10-08 16:23 ` Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 15/23] libbpf: Resolve the compiler's _Unwind_Resume to the kernel's kfunc Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 16/23] libbpf: Add cleanup_info to bpf_prog_load_opts Yonghong Song
2026-10-08 8:12 ` sashiko-bot
2026-10-08 16:25 ` Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 17/23] libbpf: Collect .bpf_cleanup records and pass them to the kernel Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 18/23] libbpf: Carry the exception cleanup table through the light skeleton Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 19/23] libbpf: Let the static linker carry .bpf_cleanup relocations Yonghong Song
2026-10-08 8:14 ` sashiko-bot
2026-10-08 16:26 ` Yonghong Song [this message]
2026-10-08 7:51 ` [PATCH bpf-next v9 20/23] selftests/bpf: Add end-to-end and negative .bpf_cleanup exception tests Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 21/23] selftests/bpf: Add __set_global() and __ret_global() test tags Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 22/23] selftests/bpf: Cover more accepted .bpf_cleanup exception shapes Yonghong Song
2026-10-08 7:51 ` [PATCH bpf-next v9 23/23] selftests/bpf: Load an exception cleanup program from a light skeleton Yonghong Song
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=ad01cc17-7226-4d13-aaeb-741a772308d2@linux.dev \
--to=yonghong.song@linux.dev \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox