* [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers
@ 2025-07-01 19:47 Paul Chaignon
2025-07-01 19:48 ` [PATCH bpf v2 2/2] selftests/bpf: Add negative test cases for snprintf Paul Chaignon
2025-07-01 22:40 ` [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers patchwork-bot+netdevbpf
0 siblings, 2 replies; 3+ messages in thread
From: Paul Chaignon @ 2025-07-01 19:47 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Florent Revest, Yonghong Song
static const char fmt[] = "%p%";
bpf_trace_printk(fmt, sizeof(fmt));
The above BPF program isn't rejected and causes a kernel warning at
runtime:
Please remove unsupported %\x00 in format string
WARNING: CPU: 1 PID: 7244 at lib/vsprintf.c:2680 format_decode+0x49c/0x5d0
This happens because bpf_bprintf_prepare skips over the second %,
detected as punctuation, while processing %p. This patch fixes it by
not skipping over punctuation. %\x00 is then processed in the next
iteration and rejected.
Reported-by: syzbot+e2c932aec5c8a6e1d31c@syzkaller.appspotmail.com
Fixes: 48cac3f4a96d ("bpf: Implement formatted output helpers with bstr_printf")
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Signed-off-by: Paul Chaignon <paul.chaignon@gmail.com>
---
Changes in v2:
- Rebased.
kernel/bpf/helpers.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index b71e428ad936..ad6df48b540c 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c
@@ -884,6 +884,13 @@ int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args,
if (fmt[i] == 'p') {
sizeof_cur_arg = sizeof(long);
+ if (fmt[i + 1] == 0 || isspace(fmt[i + 1]) ||
+ ispunct(fmt[i + 1])) {
+ if (tmp_buf)
+ cur_arg = raw_args[num_spec];
+ goto nocopy_fmt;
+ }
+
if ((fmt[i + 1] == 'k' || fmt[i + 1] == 'u') &&
fmt[i + 2] == 's') {
fmt_ptype = fmt[i + 1];
@@ -891,11 +898,9 @@ int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args,
goto fmt_str;
}
- if (fmt[i + 1] == 0 || isspace(fmt[i + 1]) ||
- ispunct(fmt[i + 1]) || fmt[i + 1] == 'K' ||
+ if (fmt[i + 1] == 'K' ||
fmt[i + 1] == 'x' || fmt[i + 1] == 's' ||
fmt[i + 1] == 'S') {
- /* just kernel pointers */
if (tmp_buf)
cur_arg = raw_args[num_spec];
i++;
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH bpf v2 2/2] selftests/bpf: Add negative test cases for snprintf
2025-07-01 19:47 [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers Paul Chaignon
@ 2025-07-01 19:48 ` Paul Chaignon
2025-07-01 22:40 ` [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: Paul Chaignon @ 2025-07-01 19:48 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Florent Revest, Yonghong Song
This patch adds a couple negative test cases with a trailing % at the
end of the format string. The %p% case was fixed by the previous commit,
whereas the %s% case was already successfully rejected before.
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Signed-off-by: Paul Chaignon <paul.chaignon@gmail.com>
---
Changes in v2:
- Clarified %s% test case already worked without the previous patch,
per Yonghong's review.
- Rebased.
tools/testing/selftests/bpf/prog_tests/snprintf.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/snprintf.c b/tools/testing/selftests/bpf/prog_tests/snprintf.c
index 4be6fdb78c6a..594441acb707 100644
--- a/tools/testing/selftests/bpf/prog_tests/snprintf.c
+++ b/tools/testing/selftests/bpf/prog_tests/snprintf.c
@@ -116,6 +116,8 @@ static void test_snprintf_negative(void)
ASSERT_ERR(load_single_snprintf("%llc"), "invalid specifier 7");
ASSERT_ERR(load_single_snprintf("\x80"), "non ascii character");
ASSERT_ERR(load_single_snprintf("\x1"), "non printable character");
+ ASSERT_ERR(load_single_snprintf("%p%"), "invalid specifier 8");
+ ASSERT_ERR(load_single_snprintf("%s%"), "invalid specifier 9");
}
void test_snprintf(void)
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers
2025-07-01 19:47 [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers Paul Chaignon
2025-07-01 19:48 ` [PATCH bpf v2 2/2] selftests/bpf: Add negative test cases for snprintf Paul Chaignon
@ 2025-07-01 22:40 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-07-01 22:40 UTC (permalink / raw)
To: Paul Chaignon; +Cc: bpf, ast, daniel, andrii, revest, yonghong.song
Hello:
This series was applied to bpf/bpf.git (master)
by Alexei Starovoitov <ast@kernel.org>:
On Tue, 1 Jul 2025 21:47:30 +0200 you wrote:
> static const char fmt[] = "%p%";
> bpf_trace_printk(fmt, sizeof(fmt));
>
> The above BPF program isn't rejected and causes a kernel warning at
> runtime:
>
> Please remove unsupported %\x00 in format string
> WARNING: CPU: 1 PID: 7244 at lib/vsprintf.c:2680 format_decode+0x49c/0x5d0
>
> [...]
Here is the summary with links:
- [bpf,v2,1/2] bpf: Reject %p% format string in bprintf-like helpers
https://git.kernel.org/bpf/bpf/c/f8242745871f
- [bpf,v2,2/2] selftests/bpf: Add negative test cases for snprintf
https://git.kernel.org/bpf/bpf/c/bf4807c89d8f
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-07-01 22:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-01 19:47 [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers Paul Chaignon
2025-07-01 19:48 ` [PATCH bpf v2 2/2] selftests/bpf: Add negative test cases for snprintf Paul Chaignon
2025-07-01 22:40 ` [PATCH bpf v2 1/2] bpf: Reject %p% format string in bprintf-like helpers patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox