Re: new seccomp mode aims to improve performance
From: Lennart Poettering <hidden>
Date: 2020-06-02 12:53:26
Also in:
bpf
On Mo, 01.06.20 08:32, Paul Moore (paul@paul-moore.com) wrote:
In situations where the calling application creates multiple per-ABI filters, the seccomp_merge(3) function can be used to merge the filters into one. There are some limitations (same byte ordering, filter attributes, etc.) but in general it should work without problem when merging x86_64, x32, and x86.
Hmm, so we currently only use seccomp_rule_add_exact() to build an individual filter and finally seccomp_load() to install it. Which tells us exactly what works and what does not. If we now would use seccomp_rule_add_exact() to build the filters, but then use seccomp_merge() to merge them all, and then only do a single seccomp_load(), will this give us the same info? i.e. will seccomp_merge() give us the same errors seccomp_load() currently gives us when something cannot work?
quoted
If we wanted to optimize that in userspace, then libseccomp would have to be improved quite substantially to let us know exactly what works and what doesn't, and to have sane fallback both when building whitelists and blacklists.It has been quite a while since we last talked about systemd's use of libseccomp, but the upcoming v2.5.0 release (no date set yet, but think weeks not months) finally takes a first step towards defining proper return values on error for the API, no more "negative values on error". I'm sure there are other things, but I recall this as being one of the bigger systemd wants.
Yes, we care about error codes a lot.
As an aside, it is always going to be difficult to allow fine grained control when you have a single libseccomp filter that includes multiple ABIs; the different ABI oddities are just too great (see comments above). If you need exacting control of the filter, or ABI specific handling, then the recommended way is to create those filters independently and merge them together before loading them into the kernel or applying any common rules.
Hmm, so not sure I got this. But are you saying that when using seccomp_merge() am I supposed to merge filters for different archs into one megafilter, or are you saying the opposite: am I supposed not to do that? I.e. in an ideal world, should we come to a situation where per service on x86-64 we will have exactly one filter installed, or should we come to a situation where we'll have exactly three installed, once for each ABI? Lennart -- Lennart Poettering, Berlin