Re: fscrypt request_module() deadlock

From: Eric Biggers
Date: Tue Jul 18 2017 - 19:17:54 EST


On Tue, Jul 18, 2017 at 02:13:51PM +0800, Herbert Xu wrote:
> On Fri, Jun 30, 2017 at 05:27:34PM +0200, Richard Weinberger wrote:
> > Hi!
> >
> > David and I faced a deadlock with switch_root when fscrypt was in use.
> > When /sbin/modprobe is encrypted using fscrypt and no other kernel component
> > requested an AES cipher before, first access to an encrypted file will trigger the
> > module_request() function, which will execute usermode helper /sbin/modprobe.
> > Is /sbin/modprobe also encrypted the kernel will deadlock because executing
> > it will again enter the module_request() path...
> >
> > As workaround we currently do something like "ls /new_root > /dev/null" in our
> > initramfs to make request_module() happen before we change the root directory
> > to /new_root.
> >
> > While this workaround is legit we think that this could be handled better.
> > Is there a way to request these ciphers before first usage? Herbert?
> > e.g. such that the filesystem can request them upon mount time.
> >
> > Btw: This happens even when AES modules are builtins.
>
> I think you're running into the problem because of templates, where
> the first instantiation will always be preceded by a request_module.
>
> We should be able to fix this by doing two template probes instead
> of one. So instead of the current order:
>
> 1. Look up registered algorithms.
> 2. Request module.
> 3. Find templates (may request module).
>
> We can do
>
> 1. Look up registered algorithms.
> 2. Find templates without loading modules.
> 3. Request module.
> 4. Find templates (may request module).
>

While that should solve the problem, isn't it possible to actually have a module
which supplies an algorithm like "xts(aes)"? In that case it wouldn't be
desirable to instantiate the generic "xts" template.

Eric