BPF List
 help / color / mirror / Atom feed
* [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