> On Thu, Jan 23, 2020 at 7:25 AM KP Singh <kpsingh@xxxxxxxxxxxx> wrote: > > > > From: KP Singh <kpsingh@xxxxxxxxxx> > > > > * Add functionality in libbpf to attach eBPF program to LSM hooks > > * Lookup the index of the LSM hook in security_hook_heads and pass it in > > attr->lsm_hook_idx > > > > Signed-off-by: KP Singh <kpsingh@xxxxxxxxxx> > > Reviewed-by: Brendan Jackman <jackmanb@xxxxxxxxxx> > > Reviewed-by: Florent Revest <revest@xxxxxxxxxx> > > Reviewed-by: Thomas Garnier <thgarnie@xxxxxxxxxx> > > --- > > Looks good, but see few nits below. > > Acked-by: Andrii Nakryiko <andriin@xxxxxx> Thanks! > > > tools/lib/bpf/bpf.c | 6 ++- > > tools/lib/bpf/bpf.h | 1 + > > tools/lib/bpf/libbpf.c | 104 +++++++++++++++++++++++++++++++++++++-- > > tools/lib/bpf/libbpf.h | 4 ++ > > tools/lib/bpf/libbpf.map | 3 ++ > > 5 files changed, 114 insertions(+), 4 deletions(-) > > > > [...] > > > @@ -5084,6 +5099,8 @@ __bpf_object__open(const char *path, const void *obj_buf, size_t obj_buf_sz, > > if (prog->type != BPF_PROG_TYPE_UNSPEC) > > continue; > > > > + > > + > > why these extra lines? Ah this might have crept in my latest rebase. Will remove these. > > > err = libbpf_prog_type_by_name(prog->section_name, &prog_type, > > &attach_type); > > if (err == -ESRCH) > > @@ -6160,6 +6177,7 @@ bool bpf_program__is_##NAME(const struct bpf_program *prog) \ > > } \ > > > > BPF_PROG_TYPE_FNS(socket_filter, BPF_PROG_TYPE_SOCKET_FILTER); > > +BPF_PROG_TYPE_FNS(lsm, BPF_PROG_TYPE_LSM); > > BPF_PROG_TYPE_FNS(kprobe, BPF_PROG_TYPE_KPROBE); > > BPF_PROG_TYPE_FNS(sched_cls, BPF_PROG_TYPE_SCHED_CLS); > > BPF_PROG_TYPE_FNS(sched_act, BPF_PROG_TYPE_SCHED_ACT); > > @@ -6226,6 +6244,8 @@ static struct bpf_link *attach_raw_tp(const struct bpf_sec_def *sec, > > struct bpf_program *prog); > > static struct bpf_link *attach_trace(const struct bpf_sec_def *sec, > > struct bpf_program *prog); > > +static struct bpf_link *attach_lsm(const struct bpf_sec_def *sec, > > + struct bpf_program *prog); > > > > struct bpf_sec_def { > > const char *sec; > > @@ -6272,6 +6292,9 @@ static const struct bpf_sec_def section_defs[] = { > > SEC_DEF("freplace/", EXT, > > .is_attach_btf = true, > > .attach_fn = attach_trace), > > + SEC_DEF("lsm/", LSM, > > + .expected_attach_type = BPF_LSM_MAC, > > curious, will there be non-MAC LSM programs? if yes, how they are > going to be different and which prefix will we use then? One can think BPF_LSM_AUDIT programs which will only be used to log information from the LSM hooks and not enforce a policy. Currently, one can sort of do that by disabling CONFIG_SECURITY_BPF_ENFORCE but that's an all or none hammer. > > > + .attach_fn = attach_lsm), > > BPF_PROG_SEC("xdp", BPF_PROG_TYPE_XDP), > > BPF_PROG_SEC("perf_event", BPF_PROG_TYPE_PERF_EVENT), > > BPF_PROG_SEC("lwt_in", BPF_PROG_TYPE_LWT_IN), > > @@ -6533,6 +6556,44 @@ static int bpf_object__collect_struct_ops_map_reloc(struct bpf_object *obj, > > return -EINVAL; > > } > > > > +static __s32 find_lsm_hook_idx(struct bpf_program *prog) > > nit: I'd stick to int for return result, we barely ever use __s32 in libbpf.c Sure. Changed to int. - KP > > [...]