Re: [RFC PATCH bpf-next seccomp 00/12] eBPF seccomp filters
From: Andy Lutomirski <luto@kernel.org>
Date: 2021-05-10 17:47:41
Also in:
bpf
On Mon, May 10, 2021 at 10:22 AM YiFei Zhu [off-list ref] wrote:
From: YiFei Zhu <redacted> Based on: https://lists.linux-foundation.org/pipermail/containers/2018-February/038571.html This patchset enables seccomp filters to be written in eBPF. Supporting eBPF filters has been proposed a few times in the past. The main concerns were (1) use cases and (2) security. We have identified many use cases that can benefit from advanced eBPF filters, such as:
I haven't reviewed this carefully, but I think we need to distinguish a few things: 1. Using the eBPF *language*. 2. Allowing the use of stateful / non-pure eBPF features. 3. Allowing the eBPF programs to read the target process' memory. I'm generally in favor of (1). I'm not at all sure about (2), and I'm even less convinced by (3).
* exec-only-once filter / apply filter after exec
This is (2). I'm not sure it's a good idea.
* syscall logging (eg. via maps)
This is (2). Probably useful, but doesn't obviously belong in seccomp, or at least not as part of the same seccomp feature as regular filtering.
* expressiveness & better tooling (no need for DSLs like easyseccomp)
(1). Sounds good.
* contained syscall fault injection
(2)? We can already do this with notifiers.
For security, for an unprivileged caller, our implementation is as restrictive as user notifier + ptrace, in regards to capabilities. eBPF helpers follow the privilege model of original eBPF helpers.
eBPF doesn't really have a privilege model yet. There was a long and disappointing thread about this awhile back.
Moreover, a mechanism for reading user memory is added. The same
prototypes of bpf_probe_read_user{,str} from tracing are used. However,
when the loader of bpf program does not have CAP_PTRACE, the helper
will return -EPERM if the task under seccomp filter is non-dumpable.
The reason for this is that if we perform reduction from seccomp-eBPF
to user notifier + ptrace, ptrace requires CAP_PTRACE to read from
a non-dumpable process. However, eBPF does not solve the TOCTOU problem
of user notifier, so users should not use this to enforce a policy
based on memory contents.What is this for?