The dynptr probe-read kfuncs are registered as common kfuncs. That lets a
program with the generic kfunc privilege gate call
bpf_probe_read_kernel_dynptr(), while the legacy bpf_probe_read_kernel()
helper is exposed only with CAP_PERFMON and is blocked by kernel-read
lockdown.
Gate the four nofault probe-read dynptr kfuncs with CAP_PERFMON, and apply
the existing LOCKDOWN_BPF_READ_KERNEL policy to the kernel-read dynptr
variants. Add focused selftests that expect CAP_BPF without CAP_PERFMON
to be insufficient for bpf_probe_read_user_dynptr(),
bpf_probe_read_kernel_dynptr(), bpf_probe_read_user_str_dynptr(), and
bpf_probe_read_kernel_str_dynptr().
Bounded impact:
- Requires privileged BPF program loading with CAP_BPF.
- No unprivileged trigger, arbitrary disclosure primitive, memory
corruption, privilege escalation, CVE, embargo, or security escalation is
claimed.
Validation:
- The focused dynptr selftest loader exercises the CAP_BPF-only program load
boundary for bpf_probe_read_user_dynptr(),
bpf_probe_read_kernel_dynptr(), bpf_probe_read_user_str_dynptr(), and
bpf_probe_read_kernel_str_dynptr().
- Unpatched bpf at 8496d9020ff37 ("Merge branch 'arena_direct_access'"):
FAIL as expected because all four programs still load with CAP_BPF and
without CAP_PERFMON.
- Patched with this series: PASS because all four same programs are rejected
with -EACCES when loaded with CAP_BPF and without CAP_PERFMON.
Fixes: a498ee7576de ("bpf: Implement dynptr copy kfuncs")
Signed-off-by: Nuoqi Gui <[email protected]>
---
Nuoqi Gui (2):
bpf: Gate dynptr probe-read kfuncs like helpers
selftests/bpf: Cover dynptr probe-read kfunc capability gate
kernel/bpf/helpers.c | 32 +++++++++
tools/testing/selftests/bpf/prog_tests/dynptr.c | 66 +++++++++++++++++++
tools/testing/selftests/bpf/progs/dynptr_success.c | 75 ++++++++++++++++++++++
3 files changed, 173 insertions(+)
---
base-commit: 8496d9020ff37a33c2a7b2fc84350fd03ffbde78
change-id: 20260615-f01-07-dynptr-probe-read-cap-4dee7066bf5f
Best regards,
--
Nuoqi Gui <[email protected]>