On Fri, Jun 30, 2023 at 1:16 AM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > > Andrii Nakryiko <andrii@xxxxxxxxxx> writes: > > > This patch set introduces new BPF object, BPF token, which allows to delegate > > a subset of BPF functionality from privileged system-wide daemon (e.g., > > systemd or any other container manager) to a *trusted* unprivileged > > application. Trust is the key here. This functionality is not about allowing > > unconditional unprivileged BPF usage. Establishing trust, though, is > > completely up to the discretion of respective privileged application that > > would create a BPF token, as different production setups can and do achieve it > > through a combination of different means (signing, LSM, code reviews, etc), > > and it's undesirable and infeasible for kernel to enforce any particular way > > of validating trustworthiness of particular process. > > > > The main motivation for BPF token is a desire to enable containerized > > BPF applications to be used together with user namespaces. This is currently > > impossible, as CAP_BPF, required for BPF subsystem usage, cannot be namespaced > > or sandboxed, as a general rule. E.g., tracing BPF programs, thanks to BPF > > helpers like bpf_probe_read_kernel() and bpf_probe_read_user() can safely read > > arbitrary memory, and it's impossible to ensure that they only read memory of > > processes belonging to any given namespace. This means that it's impossible to > > have namespace-aware CAP_BPF capability, and as such another mechanism to > > allow safe usage of BPF functionality is necessary. BPF token and delegation > > of it to a trusted unprivileged applications is such mechanism. Kernel makes > > no assumption about what "trusted" constitutes in any particular case, and > > it's up to specific privileged applications and their surrounding > > infrastructure to decide that. What kernel provides is a set of APIs to create > > and tune BPF token, and pass it around to privileged BPF commands that are > > creating new BPF objects like BPF programs, BPF maps, etc. > > So a colleague pointed out today that the Seccomp Notify functionality > would be a way to achieve your stated goal of allowing unprivileged > containers to (selectively) perform bpf() syscall operations. Christian > Brauner has a pretty nice writeup of the functionality here: > https://people.kernel.org/brauner/the-seccomp-notifier-new-frontiers-in-unprivileged-container-development > > In fact he even mentions allowing unprivileged access to bpf() as a > possible use case (in the second-to-last paragraph). > > AFAICT this would enable your use case without adding any new kernel > functionality or changing the BPF-using applications, while allowing the > privileged userspace daemon to make case-by-case decisions on each > operation instead of granting blanket capabilities (which is my main > objection to the token proposal, as we discussed on the last iteration > of the series). > > So I'm curious whether you considered this as an alternative to > BPF_TOKEN? And if so, what your reason was for rejecting it? The Seccomp notifier is an answer 1. to special device nodes (or arguably to simple cases...) , 2. a quick solution without changing infrastructure and how the kernel deals with device nodes (doesn't solve the root problem where this BPF series at least tries...), 3. relies on Seccomp and would inherit its same limitation. It clashes with BPF! BPF is not mknod, and most of its use cases are *transparent to the workload*, they can't use Seccomp and are not interested in it... Fd delegation is good design and applies to *all* BPF use cases, all tools can take advantage of it, it is not restricted to a special tool or daemon X. Going further, hiding behind Seccomp notifier and such prevents BPF from solving current and future problems.