BPF List
 help / color / mirror / Atom feed
From: Puranjay Mohan <puranjay@kernel.org>
To: bpf@vger.kernel.org
Cc: Puranjay Mohan <puranjay@kernel.org>,
	Puranjay Mohan <puranjay12@gmail.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Andrii Nakryiko <andrii@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Martin KaFai Lau <martin.lau@kernel.org>,
	Eduard Zingerman <eddyz87@gmail.com>,
	Kumar Kartikeya Dwivedi <memxor@gmail.com>,
	"Emil Tsalapatis" <emil@etsalapatis.com>,
	kernel-team@meta.com
Subject: [PATCH bpf-next v3 00/10] bpf: Make KF_TRUSTED_ARGS default
Date: Fri,  2 Jan 2026 10:00:26 -0800	[thread overview]
Message-ID: <20260102180038.2708325-1-puranjay@kernel.org> (raw)

v2: https://lore.kernel.org/all/20251231171118.1174007-1-puranjay@kernel.org/
Changes in v2->v3:
- Fix documentation: add a new section for kfunc parameters (Eduard)
- Remove all occurances of KF_TRUSTED from comments, etc. (Eduard)
- Fix the netfilter kfuncs to drop dead NULL checks.
- Fix selftest for netfilter kfuncs to check for verification failures
  and remove the runtime failure that are not possible after this
  changes

v1: https://lore.kernel.org/all/20251224192448.3176531-1-puranjay@kernel.org/
Changes in v1->v2:
- Update kfunc_dynptr_param selftest to use a real pointer that is not
  ptr_to_stack and not CONST_PTR_TO_DYNPTR rather than casting 1
  (Alexei)
- Thoroughly review all kfuncs in the to find regressions or missing
  annotations. (Eduard)
- Fix kfuncs found from the above step.

This series makes trusted arguments the default requirement for all BPF
kfuncs, inverting the current opt-in model. Instead of requiring
explicit KF_TRUSTED_ARGS flags, kfuncs now require trusted arguments by
default and must explicitly opt-out using __nullable/__opt annotations
or the KF_RCU flag.

This improves security and type safety by preventing BPF programs from
passing untrusted or NULL pointers to kernel functions at verification
time, while maintaining flexibility for the small number of kfuncs that
legitimately need to accept NULL or RCU pointers.

MOTIVATION

The current opt-in model is error-prone and inconsistent. Most kfuncs already
require trusted pointers from sources like KF_ACQUIRE, struct_ops callbacks, or
tracepoints. Making trusted arguments the default:

- Prevents NULL pointer dereferences at verification time
- Reduces defensive NULL checks in kernel code
- Provides better error messages for invalid BPF programs
- Aligns with existing patterns (context pointers, struct_ops already trusted)

IMPACT ANALYSIS

Comprehensive analysis of all 304+ kfuncs across 37 kernel files found:
- Most kfuncs (299/304) are already safe and require no changes
- Only 4 kfuncs required fixes (all included in this series)
- 0 regressions found in independent verification

All bpf selftests are passing. The hid_bpf tests are also passing:
# PASSED: 20 / 20 tests passed.
# Totals: pass:20 fail:0 xfail:0 xpass:0 skip:0 error:0

bpf programs in drivers/hid/bpf/progs/ show no regression as shown by
veristat:

Done. Processed 24 files, 62 programs. Skipped 0 files, 0 programs.

TECHNICAL DETAILS

The verifier now validates kfunc arguments in this order:
1. NULL check (runs first): Rejects NULL unless parameter has __nullable/__opt
2. Trusted check: Rejects untrusted pointers unless kfunc has KF_RCU

Special cases that bypass trusted checking:
- Context pointers (xdp_md, __sk_buff): Handled via KF_ARG_PTR_TO_CTX
- Struct_ops callbacks: Pre-marked as PTR_TRUSTED during initialization
- KF_RCU kfuncs: Have separate validation path for RCU pointers

BACKWARD COMPATIBILITY

This affects BPF program verification, not runtime:
- Valid programs passing trusted pointers: Continue to work
- Programs with bugs: May now fail verification (preventing runtime crashes)

This series introduces two intentional breaking changes to the BPF
verifier's kfunc handling:

1. NULL pointer rejection timing: Kfuncs that previously accepted NULL
pointers without KF_TRUSTED_ARGS will now reject NULL at verification
time instead of returning runtime errors. This affects netfilter
connection tracking functions (bpf_xdp_ct_lookup, bpf_skb_ct_lookup,
bpf_xdp_ct_alloc, bpf_skb_ct_alloc), which now enforce their documented
"Cannot be NULL" requirements at load time rather than returning -EINVAL
at runtime.

2. Fentry/fexit program restrictions: BPF programs using fentry/fexit
attachment points can no longer pass their callback arguments directly
to kfuncs, as these arguments are not marked as trusted by default.
Programs requiring trusted argument semantics should migrate to tp_btf
(tracepoint with BTF) attachment points where arguments are guaranteed
trusted by the verifier.

Both changes strengthen the verifier's safety guarantees by catching
errors earlier in the development cycle and are accompanied by
comprehensive test updates demonstrating the new expected behaviors.

Puranjay Mohan (10):
  bpf: Make KF_TRUSTED_ARGS the default for all kfuncs
  bpf: Remove redundant KF_TRUSTED_ARGS flag from all kfuncs
  bpf: net: netfilter: drop dead NULL checks
  bpf: xfrm: drop dead NULL check in bpf_xdp_get_xfrm_state()
  HID: bpf: drop dead NULL checks in kfuncs
  selftests: bpf: Update kfunc_param_nullable test for new error message
  selftests: bpf: Update failure message for rbtree_fail
  selftests: bpf: fix test_kfunc_dynptr_param
  selftests: bpf: fix cgroup_hierarchical_stats
  selftests: bpf: Fix test_bpf_nf for trusted args becoming default

 Documentation/bpf/kfuncs.rst                  | 184 +++++++++---------
 drivers/hid/bpf/hid_bpf_dispatch.c            |   5 +-
 fs/bpf_fs_kfuncs.c                            |  23 +--
 fs/verity/measure.c                           |   2 +-
 include/linux/bpf.h                           |   2 +-
 include/linux/btf.h                           |   3 +-
 kernel/bpf/arena.c                            |   6 +-
 kernel/bpf/cpumask.c                          |   2 +-
 kernel/bpf/helpers.c                          |  20 +-
 kernel/bpf/map_iter.c                         |   2 +-
 kernel/bpf/verifier.c                         |  16 +-
 kernel/sched/ext.c                            |   8 +-
 mm/bpf_memcontrol.c                           |  10 +-
 net/core/filter.c                             |  10 +-
 net/core/xdp.c                                |   2 +-
 net/netfilter/nf_conntrack_bpf.c              |  22 +--
 net/netfilter/nf_flow_table_bpf.c             |   2 +-
 net/netfilter/nf_nat_bpf.c                    |   2 +-
 net/sched/bpf_qdisc.c                         |  12 +-
 net/xfrm/xfrm_state_bpf.c                     |   2 +-
 .../testing/selftests/bpf/prog_tests/bpf_nf.c |   5 +-
 .../bpf/progs/cgroup_hierarchical_stats.c     |   6 +-
 .../selftests/bpf/progs/cpumask_failure.c     |   2 +-
 .../testing/selftests/bpf/progs/rbtree_fail.c |   2 +-
 .../testing/selftests/bpf/progs/test_bpf_nf.c |   7 -
 .../selftests/bpf/progs/test_bpf_nf_fail.c    |  57 ++++++
 .../bpf/progs/test_kfunc_dynptr_param.c       |   5 +-
 .../bpf/progs/test_kfunc_param_nullable.c     |   2 +-
 .../selftests/bpf/test_kmods/bpf_testmod.c    |  20 +-
 29 files changed, 234 insertions(+), 207 deletions(-)


base-commit: c286e7e9d1f1f3d90ad11c37e896f582b02d19c4
-- 
2.47.3


             reply	other threads:[~2026-01-02 18:00 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-02 18:00 Puranjay Mohan [this message]
2026-01-02 18:00 ` [PATCH bpf-next v3 01/10] bpf: Make KF_TRUSTED_ARGS the default for all kfuncs Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 02/10] bpf: Remove redundant KF_TRUSTED_ARGS flag from " Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 03/10] bpf: net: netfilter: drop dead NULL checks Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 04/10] bpf: xfrm: drop dead NULL check in bpf_xdp_get_xfrm_state() Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 05/10] HID: bpf: drop dead NULL checks in kfuncs Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 06/10] selftests: bpf: Update kfunc_param_nullable test for new error message Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 07/10] selftests: bpf: Update failure message for rbtree_fail Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 08/10] selftests: bpf: fix test_kfunc_dynptr_param Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 09/10] selftests: bpf: fix cgroup_hierarchical_stats Puranjay Mohan
2026-01-02 18:00 ` [PATCH bpf-next v3 10/10] selftests: bpf: Fix test_bpf_nf for trusted args becoming default Puranjay Mohan
2026-01-02 20:20 ` [PATCH bpf-next v3 00/10] bpf: Make KF_TRUSTED_ARGS default patchwork-bot+netdevbpf

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=20260102180038.2708325-1-puranjay@kernel.org \
    --to=puranjay@kernel.org \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=emil@etsalapatis.com \
    --cc=kernel-team@meta.com \
    --cc=martin.lau@kernel.org \
    --cc=memxor@gmail.com \
    --cc=puranjay12@gmail.com \
    /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