[PATCH v3 06/12] bpf: Return hashes of maps in BPF_OBJ_GET_INFO_BY_FD

Andrii Nakryiko andrii.nakryiko at gmail.com
Thu Aug 14 18:46:29 UTC 2025


On Wed, Aug 13, 2025 at 1:55 PM KP Singh <kpsingh at kernel.org> wrote:
>
> Currently only array maps are supported, but the implementation can be
> extended for other maps and objects. The hash is memoized only for
> exclusive and frozen maps as their content is stable until the exclusive
> program modifies the map.
>
> This is required  for BPF signing, enabling a trusted loader program to
> verify a map's integrity. The loader retrieves
> the map's runtime hash from the kernel and compares it against an
> expected hash computed at build time.
>
> Signed-off-by: KP Singh <kpsingh at kernel.org>
> ---
>  include/linux/bpf.h                           |  3 +++
>  include/uapi/linux/bpf.h                      |  2 ++
>  kernel/bpf/arraymap.c                         | 13 +++++++++++
>  kernel/bpf/syscall.c                          | 23 +++++++++++++++++++
>  tools/include/uapi/linux/bpf.h                |  2 ++
>  .../selftests/bpf/progs/verifier_map_ptr.c    |  7 ++++--
>  6 files changed, 48 insertions(+), 2 deletions(-)
>

[...]

>  struct bpf_btf_info {
> diff --git a/tools/testing/selftests/bpf/progs/verifier_map_ptr.c b/tools/testing/selftests/bpf/progs/verifier_map_ptr.c
> index 11a079145966..e2767d27d8aa 100644
> --- a/tools/testing/selftests/bpf/progs/verifier_map_ptr.c
> +++ b/tools/testing/selftests/bpf/progs/verifier_map_ptr.c
> @@ -70,10 +70,13 @@ __naked void bpf_map_ptr_write_rejected(void)
>         : __clobber_all);
>  }
>
> +/* The first element of struct bpf_map is a SHA256 hash of 32 bytes, accessing
> + * into this array is valid. The opts field is now at offset 33.
> + */

Does hash have to be at the beginning of struct bpf_map? why not just
put it at the end and not have to adjust any tests?.. (which now will
fail on older kernel for no good reason, unless I miss something)


>  SEC("socket")
>  __description("bpf_map_ptr: read non-existent field rejected")
>  __failure
> -__msg("cannot access ptr member ops with moff 0 in struct bpf_map with off 1 size 4")
> +__msg("cannot access ptr member ops with moff 32 in struct bpf_map with off 33 size 4")
>  __failure_unpriv
>  __msg_unpriv("access is allowed only to CAP_PERFMON and CAP_SYS_ADMIN")
>  __flag(BPF_F_ANY_ALIGNMENT)
> @@ -82,7 +85,7 @@ __naked void read_non_existent_field_rejected(void)
>         asm volatile ("                                 \
>         r6 = 0;                                         \
>         r1 = %[map_array_48b] ll;                       \
> -       r6 = *(u32*)(r1 + 1);                           \
> +       r6 = *(u32*)(r1 + 33);                          \
>         r0 = 1;                                         \
>         exit;                                           \
>  "      :
> --
> 2.43.0
>



More information about the Linux-security-module-archive mailing list