From: sashiko-bot@kernel.org
To: "Yonghong Song" <yonghong.song@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, 08 Oct 2026 08:14:14 +0000 [thread overview]
Message-ID: <sashiko-outbox-163810@kernel.org> (raw)
In-Reply-To: <20261008075136.3008537-1-yonghong.song@linux.dev>
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
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;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261008074959.2993751-1-yonghong.song@linux.dev?part=19
next prev parent reply other threads:[~2026-10-08 8:14 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 [this message]
2026-10-08 16:26 ` Yonghong Song
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=sashiko-outbox-163810@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=yonghong.song@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