From: Aaron Tomlin <atomlin@atomlin.com>
To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org,
namhyung@kernel.org
Cc: mark.rutland@arm.com, alexander.shishkin@linux.intel.com,
jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com,
james.clark@linaro.org, howardchu95@gmail.com,
atomlin@atomlin.com, neelx@suse.com, chjohnst@mail.com,
sean@ashe.io, steve@abita.co, rishil1999@outlook.com,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v3 perf-tools-next 0/7] perf trace: Validate payload bounds across augmented argument beautifiers
Date: Fri, 18 Sep 2026 20:55:23 -0400 [thread overview]
Message-ID: <20260919005530.728615-1-atomlin@atomlin.com> (raw)
When pretty-printing augmented syscall arguments in perf trace, raw payload
data captured from BPF programs is passed to various argument formatters
via struct syscall_arg.
However, when processing malformed, truncated, or untrusted perf.data
records (e.g. truncated reads in BPF ringbuffers, cross-architecture
replays, or crafted sample records), the payload can be shorter than
expected or contain invalid size fields:
1. Dereferencing augmented_arg fields before validating that
arg->augmented.size is at least sizeof(struct augmented_arg) can read
past the available buffer.
2. Passing augmented_arg->size to formatters or loop counters without
bounding it against the remaining buffer can cause out-of-bounds memory
reads.
3. In multi-argument syscalls (e.g. rename*), calculating consumed bytes
without 64-bit alignment advances arg->augmented.args to unaligned
addresses. Furthermore, calculating consumed offsets without bounds
checking can overflow signed integer bounds or cause arg->augmented.size
to underflow, advancing arg->augmented.args out of bounds and
corrupting the parsing state for all subsequent arguments.
4. Type/family-specific beautifiers (i.e. BTF struct dump, sockaddr,
timespec, perf_event_attr) can dereference structure fields without
verifying that the payload contains sufficient bytes for the target
type, or trust embedded size fields (such as attr->size) that exceed
the actual captured buffer.
This series adds comprehensive upper-bound and payload-size checks across
all augmented argument beautifiers in perf trace, enforces 64-bit pointer
alignment when consuming multi-argument payloads, and ensures extensible
dispatching for address family formatters. If validation fails in any
beautifier, it cleanly falls back to printing the raw pointer/hex value.
To facilitate clean, conflict-free backports across active LTS kernels,
each fix is isolated to its own commit.
Changes since v2:
- Expanded the series from 6 to 7 patches by splitting the string
beautifier pointer advancement and 64-bit alignment logic into a
dedicated patch
- Added a new patch to round up consumed payload bytes to 64-bit
boundaries using PERF_ALIGN(), matching the alignment produced by the
BPF tracepoint probes (sys_enter_rename*) in
augmented_raw_syscalls.bpf.c
- Reset arg->augmented on buffer overrun to prevent corrupted parsing
state from reading out of bounds on subsequent arguments
- Validated payload size directly against arg->augmented.size instead of
reading augmented_arg->size, which is unpopulated by the BPF tracer
(sys_enter_{clock_,}nanosleep) and contains stale per-CPU map data
- Refactored af_scnprintfs into a dispatch table associating each
formatter with its minimum required payload size (.min_size), preserving
extensibility for future address families without hardcoded conditionals
- Used offsetof(struct sockaddr_un, sun_path) + 1 for AF_LOCAL rather than
sizeof(struct sockaddr_un) to correctly accommodate variable-length
domain socket paths
- Validated payload size against arg->augmented.size and payload_size
rather than reading uninitialized augmented_arg->size
- Validated payload size directly against arg->augmented.size instead of
reading uninitialized augmented_arg->size, which is unpopulated by
sys_enter_perf_event_open()
- Verified that when attr->size is specified, it is at least
PERF_ATTR_SIZE_VER0 and does not exceed payload_size, preventing
out-of-bounds reads in perf_event_attr__fprintf() caused by malformed
records or TOCTOU mutations during trace capture
- Link to v2: https://lore.kernel.org/lkml/20260907015140.363076-1-atomlin@atomlin.com/
Changes since v1:
- Expanded the original single patch into a 6-patch series in response to
reviewer feedback from sashiko-bot regarding similar bounds check
omissions across other augmented formatters in perf trace
- Added new patch validating payload bounds and consumed offset
calculations in syscall_arg__scnprintf_augmented_string()
- Added new patch validating payload bounds before byte traversal in
syscall_arg__scnprintf_buf(), isolated to ensure an independent Fixes:
tag for stable backports
- Added new patch validating payload size against sizeof(struct timespec)
in syscall_arg__scnprintf_augmented_timespec()
- Added new patch validating payload bounds and family-specific lengths in
syscall_arg__scnprintf_augmented_sockaddr()
- Added new patch validating payload size against at least
PERF_ATTR_SIZE_VER0 in
syscall_arg__scnprintf_augmented_perf_event_attr()
- Link to v1: https://lore.kernel.org/all/20260906011132.279321-1-atomlin@atomlin.com/
Aaron Tomlin (7):
perf trace: Add upper bound checks for augmented BTF struct printing
perf trace: Validate payload bounds in augmented string beautifier
perf trace: Align pointer advance in augmented string beautifier
perf trace: Validate payload bounds in augmented buffer beautifier
perf trace beauty: Validate payload size in augmented timespec
beautifier
perf trace beauty: Validate payload size in augmented sockaddr
beautifier
perf trace beauty: Validate payload size in augmented perf_event_open
beautifier
tools/perf/builtin-trace.c | 45 +++++++++++++++++------
tools/perf/trace/beauty/perf_event_open.c | 23 ++++++++++--
tools/perf/trace/beauty/sockaddr.c | 35 +++++++++++++-----
tools/perf/trace/beauty/timespec.c | 15 ++++++--
4 files changed, 91 insertions(+), 27 deletions(-)
base-commit: 02f6847e1822714a4201b87e42f92b0d43e8549d
--
2.55.0
next reply other threads:[~2026-09-19 0:55 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-19 0:55 Aaron Tomlin [this message]
2026-09-19 0:55 ` [PATCH v3 perf-tools-next 1/7] perf trace: Add upper bound checks for augmented BTF struct printing Aaron Tomlin
2026-09-19 1:07 ` sashiko-bot
2026-09-19 0:55 ` [PATCH v3 perf-tools-next 2/7] perf trace: Validate payload bounds in augmented string beautifier Aaron Tomlin
2026-09-19 1:08 ` sashiko-bot
2026-09-19 0:55 ` [PATCH v3 perf-tools-next 3/7] perf trace: Align pointer advance " Aaron Tomlin
2026-09-19 1:08 ` sashiko-bot
2026-09-19 0:55 ` [PATCH v3 perf-tools-next 4/7] perf trace: Validate payload bounds in augmented buffer beautifier Aaron Tomlin
2026-09-19 1:09 ` sashiko-bot
2026-09-19 0:55 ` [PATCH v3 perf-tools-next 5/7] perf trace beauty: Validate payload size in augmented timespec beautifier Aaron Tomlin
2026-09-19 1:08 ` sashiko-bot
2026-09-19 0:55 ` [PATCH v3 perf-tools-next 6/7] perf trace beauty: Validate payload size in augmented sockaddr beautifier Aaron Tomlin
2026-09-19 1:05 ` sashiko-bot
2026-09-19 0:55 ` [PATCH v3 perf-tools-next 7/7] perf trace beauty: Validate payload size in augmented perf_event_open beautifier Aaron Tomlin
2026-09-19 1:04 ` sashiko-bot
2026-09-30 18:29 ` [PATCH v3 perf-tools-next 0/7] perf trace: Validate payload bounds across augmented argument beautifiers Aaron Tomlin
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=20260919005530.728615-1-atomlin@atomlin.com \
--to=atomlin@atomlin.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=chjohnst@mail.com \
--cc=howardchu95@gmail.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=neelx@suse.com \
--cc=peterz@infradead.org \
--cc=rishil1999@outlook.com \
--cc=sean@ashe.io \
--cc=steve@abita.co \
/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.