On Fri, May 4, 2018 at 12:56 PM, Luis R. Rodriguez <mcgrof@xxxxxxxxxx> wrote: > What a mighty short list of reviewers. Adding some more. My review below. > I'd appreciate a Cc on future versions of these patches. Me too, please. And likely linux-security-module@ and Jessica too. > On Wed, May 02, 2018 at 09:36:01PM -0700, Alexei Starovoitov wrote: >> Introduce helper: >> int fork_usermode_blob(void *data, size_t len, struct umh_info *info); >> struct umh_info { >> struct file *pipe_to_umh; >> struct file *pipe_from_umh; >> pid_t pid; >> }; >> >> that GPLed kernel modules (signed or unsigned) can use it to execute part >> of its own data as swappable user mode process. >> >> The kernel will do: >> - mount "tmpfs" >> - allocate a unique file in tmpfs >> - populate that file with [data, data + len] bytes >> - user-mode-helper code will do_execve that file and, before the process >> starts, the kernel will create two unix pipes for bidirectional >> communication between kernel module and umh >> - close tmpfs file, effectively deleting it >> - the fork_usermode_blob will return zero on success and populate >> 'struct umh_info' with two unix pipes and the pid of the user process I'm trying to think how LSMs can successfully reason about the resulting exec(). In the past, we've replaced "blob" style interfaces with file-based interfaces (e.g. init_module() -> finit_module(), kexec_load() -> kexec_file_load()) to better let the kernel understand the origin of executable content. Here the intent is fine: we're getting the exec from an already-loaded module, etc, etc. I'm trying to think specifically about the interface. How can the ultimate exec get tied back to the kernel module in a way that the LSM can query? Right now the hooks hit during exec are: kernel_read_file() and kernel_post_read_file() of tmpfs file, bprm_set_creds(), bprm_check(), bprm_commiting_creds(), bprm_commited_creds(). It seems silly to me for an LSM to perform these checks at all since I would expect the _meaningful_ check to be finit_module() of the module itself. Having a way for an LSM to know the exec is tied to a kernel module would let them skip the nonsense checks. Since the process for doing the usermode_blob is defined by the kernel module build/link/objcopy process, could we tighten the fork_usermode_blob() interface to point to the kernel module itself, rather than leaving it an open-ended "blob" interface? Given our history of needing to replace blob interfaces with file interfaces, I'm cautious to add a new blob interface. Maybe just pull all the blob-finding/loading into the interface, and just make it something like fork_usermode_kmod(struct module *mod, struct umh_info *info) ? -Kees -- Kees Cook Pixel Security