[PATCH 02/12] bpf: Update the bpf_prog_calc_tag to use SHA256

Alexei Starovoitov alexei.starovoitov at gmail.com
Mon Jun 9 17:46:09 UTC 2025


On Fri, Jun 6, 2025 at 4:29 PM KP Singh <kpsingh at kernel.org> wrote:
>
> Exclusive maps restrict map access to specific programs using a hash.
> The current hash used for this is SHA1, which is prone to collisions.
> This patch uses SHA256, which  is more resilient against
> collisions. This new hash is stored in bpf_prog and used by the verifier
> to determine if a program can access a given exclusive map.
>
> The original 64-bit tags are kept, as they are used by users as a short,
> possibly colliding program identifier for non-security purposes.
>
> Signed-off-by: KP Singh <kpsingh at kernel.org>
> ---
>  include/linux/bpf.h    |  8 ++++++-
>  include/linux/filter.h |  6 ------
>  kernel/bpf/core.c      | 49 ++++++------------------------------------
>  3 files changed, 14 insertions(+), 49 deletions(-)
>
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index d5ae43b36e68..77d62c74a4e7 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -31,6 +31,7 @@
>  #include <linux/memcontrol.h>
>  #include <linux/cfi.h>
>  #include <asm/rqspinlock.h>
> +#include <crypto/sha2.h>
>
>  struct bpf_verifier_env;
>  struct bpf_verifier_log;
> @@ -1669,7 +1670,12 @@ struct bpf_prog {
>         enum bpf_attach_type    expected_attach_type; /* For some prog types */
>         u32                     len;            /* Number of filter blocks */
>         u32                     jited_len;      /* Size of jited insns in bytes */
> -       u8                      tag[BPF_TAG_SIZE];
> +       union {
> +               u8 digest[SHA256_DIGEST_SIZE];
> +               struct {
> +                       u8 tag[BPF_TAG_SIZE];
> +               };
> +       };

Why extra anon struct ?
union {
  u8 digest[SHA256_DIGEST_SIZE];
  u8 tag[BPF_TAG_SIZE];
};
should work ?

>         struct bpf_prog_stats __percpu *stats;
>         int __percpu            *active;
>         unsigned int            (*bpf_func)(const void *ctx,
> diff --git a/include/linux/filter.h b/include/linux/filter.h
> index f5cf4d35d83e..3aa33e904a4e 100644
> --- a/include/linux/filter.h
> +++ b/include/linux/filter.h
> @@ -997,12 +997,6 @@ static inline u32 bpf_prog_insn_size(const struct bpf_prog *prog)
>         return prog->len * sizeof(struct bpf_insn);
>  }
>
> -static inline u32 bpf_prog_tag_scratch_size(const struct bpf_prog *prog)
> -{
> -       return round_up(bpf_prog_insn_size(prog) +
> -                       sizeof(__be64) + 1, SHA1_BLOCK_SIZE);
> -}

Nice that we don't need this roundup anymore.



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