Re: [PATCH 4/4] module: Add hook for security_kernel_post_read_file()

Mimi Zohar
2020-07-08T13:48:24Z

On Tue, 2020-07-07 at 20:10 -0700, Kees Cook wrote:
> On Tue, Jul 07, 2020 at 08:47:20PM -0400, Mimi Zohar wrote:
> > On Tue, 2020-07-07 at 01:19 -0700, Kees Cook wrote:
> > > Calls to security_kernel_load_data() should be paired with a call to
> > > security_kernel_post_read_file() with a NULL file argument. Add the
> > > missing call so the module contents are visible to the LSMs interested
> > > in measuring the module content. (This also paves the way for moving
> > > module signature checking out of the module core and into an LSM.)
> > >
> > > Cc: Jessica Yu <jeyu@kernel.org>
> > > Fixes: c77b8cdf745d ("module: replace the existing LSM hook in init_module")
> > > Signed-off-by: Kees Cook <keescook@chromium.org>
> > > ---
> > > kernel/module.c | 7 ++++++-
> > > 1 file changed, 6 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/kernel/module.c b/kernel/module.c
> > > index 0c6573b98c36..af9679f8e5c6 100644
> > > --- a/kernel/module.c
> > > +++ b/kernel/module.c
> > > @@ -2980,7 +2980,12 @@ static int copy_module_from_user(const void __user *umod, unsigned long len,
> > > return -EFAULT;
> > > }
> > >
> > > - return 0;
> > > + err = security_kernel_post_read_file(NULL, (char *)info->hdr,
> > > + info->len, READING_MODULE);
> >
> > There was a lot of push back on calling security_kernel_read_file()
> > with a NULL file descriptor here.[1]  The result was defining a new
> > security hook - security_kernel_load_data - and enumeration -
> > LOADING_MODULE.  I would prefer calling the same pre and post security
> > hook.
> >
> > Mimi
> >
> > [1] http://kernsec.org/pipermail/linux-security-module-archive/2018-May/007110.html
>
> Ah yes, thanks for the pointer to the discussion.
>
> I think we have four cases then, for differing LSM hooks:
>
> - no "file", no contents
> e.g. init_module() before copying user buffer
> security_kernel_load_data()
> - only a "file" available, no contents
> e.g. kernel_read_file() before actually reading anything
> security_kernel_read_file()
> - "file" and contents
> e.g. kernel_read_file() after reading
> security_kernel_post_read_file()
> - no "file" available, just the contents
> e.g. firmware platform fallback from EFI space (no "file")
> unimplemented!
>
> If an LSM wants to be able to examine the contents of firmware, modules,
> kexec, etc, it needs either a "file" or the full contents.
>
> The "file" methods all pass through the kernel_read_file()-family. The
> others happen via blobs coming from userspace or (more recently) the EFI
> universe.
>
> So, if a NULL file is unreasonable, we need, perhaps,
> security_kernel_post_load_data()
>
> ?

Agreed.

Mimi