On Wed, Mar 6, 2024 at 7:14 AM Christian Brauner <brauner@xxxxxxxxxx> wrote: > On Wed, Mar 06, 2024 at 12:21:28PM +0100, Christian Brauner wrote: > > On Wed, Mar 06, 2024 at 07:39:14AM +0000, Matt Bobrowski wrote: > > > G'day All, > > > > > > The original cover letter providing background context and motivating > > > factors around the needs for the BPF kfuncs introduced within this > > > patch series can be found here [0], so please do reference that if > > > need be. > > > > > > Notably, one of the main contention points within v1 of this patch > > > series was that we were effectively leaning on some preexisting > > > in-kernel APIs such as get_task_exe_file() and get_mm_exe_file() > > > within some of the newly introduced BPF kfuncs. As noted in my > > > response here [1] though, I struggle to understand the technical > > > reasoning behind why exposing such in-kernel helpers, specifically > > > only to BPF LSM program types in the form of BPF kfuncs, is inherently > > > a terrible idea. So, until someone provides me with a sound technical > > > explanation as to why this cannot or should not be done, I'll continue > > > to lean on them. The alternative is to reimplement the necessary > > > in-kernel APIs within the BPF kfuncs, but that's just nonsensical IMO. > > > > You may lean as much as you like. What I've reacted to is that you've > > (not you specifically, I'm sure) messed up. You've exposed d_path() to > > users without understanding that it wasn't safe apparently. > > > > And now we get patches that use the self-inflicted brokeness as an > > argument to expose a bunch of other low-level helpers to fix that. > > > > The fact that it's "just bpf LSM" programs doesn't alleviate any > > concerns whatsoever. Not just because that is just an entry vector but > > also because we have LSMs induced API abuse that we only ever get to see > > the fallout from when we refactor apis and then it causes pain for the vfs. Let's not start throwing stones at the in-tree, native LSM folks; instead let's just all admit that it's often a challenge working across subsystem lines, but we usually find a way because we all want the kernel to move forward. We've all got our grudges and scars, let's not start poking each other with sticks. > > I'll take another look at the proposed helpers you need as bpf kfuncs > > and I'll give my best not to be overly annoyed by all of this. I have no > > intention of not helping you quite the opposite but I'm annoyed that > > we're here in the first place. > > > > What I want is to stop this madness of exposing stuff to users without > > fully understanding it's semantics and required guarantees. > > So, looking at this series you're now asking us to expose: > > (1) mmgrab() > (2) mmput() > (3) fput() > (5) get_mm_exe_file() > (4) get_task_exe_file() > (7) get_task_fs_pwd() > (6) get_task_fs_root() > (8) path_get() > (9) path_put() > > in one go and the justification in all patches amounts to "This is > common in some BPF LSM programs". > > So, broken stuff got exposed to users or at least a broken BPF LSM > program was written somewhere out there that is susceptible to UAFs > becauase you didn't restrict bpf_d_path() to trusted pointer arguments. > So you're now scrambling to fix this by asking for a bunch of low-level > exports. > > What is the guarantee that you don't end up writing another BPF LSM that > abuses these exports in a way that causes even more issues and then > someone else comes back asking for the next round of bpf funcs to be > exposed to fix it. > > The difference between a regular LSM asking about this and a BPF LSM > program is that we can see in the hook implementation what the LSM > intends to do with this and we can judge whether that's safe or not. I wish things were different, but the current reality is that from a practical perspective BPF LSMs are not much different than out-of-tree, native LSMs. There is no requirement, or even convention, for BPF LSMs to post their designs, docs, or implementations on the LSM list for review like we do with other LSMs; maybe it has happened once or twice, but I can't remember the last time I saw a serious BPF LSM posted to the LSM list. Even if someone did do The Right Thing with their BPF LSM and proposed it for review just like a native LSM, there is no guarantee someone else couldn't fork that LSM and do something wrong (intentional or not). Unless something changes, I'm left to treat BPF LSMs the same as any other out-of-tree kernel code: I'm not going to make life difficult for a /out-of-tree/BPF/ LSM simply because it is /out-of-tree/BPF/, but I'm not going to do anything to negatively impact the current, or future, state of the in-tree LSMs simply to appease the /out-of-tree/BPF/ LSMs. -- paul-moore.com