On Wed, Nov 01, 2023 at 05:23:12PM +0100, Jann Horn wrote: > On Wed, Nov 1, 2023 at 11:57 AM Mickaël Salaün <mic@xxxxxxxxxxx> wrote: > > On Tue, Oct 31, 2023 at 09:40:59PM +0100, Stefan Bavendiek wrote: > > > On Tue, Oct 24, 2023 at 11:07:14AM -0500, Serge E. Hallyn wrote: > > > > In 2005, before namespaces were upstreamed, I posted the 'bsdjail' LSM, > > > > which briefly made it into the -mm kernel, but was eventually rejected as > > > > being an abuse of the LSM interface for OS level virtualization :) > > > > > > > > It's not 100% clear to me whether Stefan only wants isolation, or > > > > wants something closer to virtualization. > > > > > > > > Stefan, would an LSM allowing you to isolate certain processes from > > > > some abstract unix socket paths (or by label, whatever0 suffice for you? > > > > > > > > > > My intention was to find a clean way to isolate abstract sockets in network > > > applications without adding dependencies like LSMs. However the entire approach > > > of using namespaces for this is something I have mostly abandoned. LSMs like > > > Apparmor and SELinux would work fine for process isolation when you can control > > > the target system, but for general deployment of sandboxed processes, I found it > > > to be significantly easier (and more effective) to build this into the > > > application itself by using a multi process approach with seccomp (Basically how > > > OpenSSH did it) > > > > I agree that for sandbox use cases embedding such security policy into > > the application itself makes sense. Landlock works the same way as > > seccomp but it sandboxes applications according to the kernel semantic > > (e.g. process, socket). The LSM framework is just a kernel > > implementation detail. ;) > > (Related, it might be nice if Landlock had a way to completely deny > access to abstract unix sockets, I think it would make more sense to scope access to abstract unix sockets: https://lore.kernel.org/all/20231025.eecai4uGh5Ie@xxxxxxxxxxx/ A complementary approach would be to restrict socket creation according to their properties: https://lore.kernel.org/all/b8a2045a-e7e8-d141-7c01-bf47874c7930@xxxxxxxxxxx/ > and a way to restrict filesystem unix > sockets with filesystem rules... LANDLOCK_ACCESS_FS_MAKE_SOCK exists > for restricting bind(), but I don't think there's an analogous > permission for connect(). I agree. It should not be too difficult to add a new LSM path hook for connect (and sendmsg) to named unix socket with the related access rights. We should be careful about the impact on sendmsg calls though. > > Currently, when you try to sandbox an application with Landlock, you > have to use seccomp to completely block access to unix domain sockets, > or alternatively use something like the seccomp_unotify feature to > interactively filter connect() calls. > > On the other hand, maybe such a feature would be a bit superfluous > when we have seccomp_unotify already... idk.) seccomp_unotify enables user space to emulate syscalls, which requires a service per sandbox. seccomp is useful but will always be delicate to use and to maintain the related filters for sandboxing use cases: https://www.ndss-symposium.org/ndss2003/traps-and-pitfalls-practical-problems-system-call-interposition-based-security-tools/ Anyway, I'd be happy to help improve Landlock with new access control types. FYI, TCP connect and bind access control should be part of Linux 6.7: https://lore.kernel.org/all/20231102131354.263678-1-mic@xxxxxxxxxxx/