Re: [PATCH bpf-next v4 3/8] bpf: lsm: provide attachment points for BPF LSM programs
From: Alexei Starovoitov
Date: Sun Feb 23 2020 - 17:08:41 EST
On Fri, Feb 21, 2020 at 08:22:59PM -0800, Kees Cook wrote:
>
> If I'm understanding this correctly, there are two issues:
>
> 1- BPF needs to be run last due to fexit trampolines (?)
no.
The placement of nop call can be anywhere.
BPF trampoline is automagically converting nop call into a sequence
of directly invoked BPF programs.
No link list traversals and no indirect calls in run-time.
> 2- BPF hooks don't know what may be attached at any given time, so
> ALL LSM hooks need to be universally hooked. THIS turns out to create
> a measurable performance problem in that the cost of the indirect call
> on the (mostly/usually) empty BPF policy is too high.
also no.
> So, trying to avoid the indirect calls is, as you say, an optimization,
> but it might be a needed one due to the other limitations.
I'm convinced that avoiding the cost of retpoline in critical path is a
requirement for any new infrastructure in the kernel.
Not only for security, but for any new infra.
Networking stack converted all such places to conditional calls.
In BPF land we converted indirect calls to direct jumps and direct calls.
It took two years to do so. Adding new indirect calls is not an option.
I'm eagerly waiting for Peter's static_call patches to land to convert
a lot more indirect calls. May be existing LSMs will take advantage
of static_call patches too, but static_call is not an option for BPF.
That's why we introduced BPF trampoline in the last kernel release.
> b) Would there actually be a global benefit to using the static keys
> optimization for other LSMs?
Yes. Just compiling with CONFIG_SECURITY adds "if (hlist_empty)" check
for every hook. Some of those hooks are in critical path. This load+cmp
can be avoided with static_key optimization. I think it's worth doing.
> If static keys are justified for KRSI
I really like that KRSI costs absolutely zero when it's not enabled.
Attaching BPF prog to one hook preserves zero cost for all other hooks.
And when one hook is BPF powered it's using direct call instead of
super expensive retpoline.
Overall this patch set looks good to me. There was a minor issue with prog
accounting. I expect only that bit to be fixed in v5.