On October 24, 2024 2:14:57 AM EDT, Christoph Hellwig <h...@infradead.org> 
wrote:
>On Wed, Oct 23, 2024 at 10:52:06PM -0400, Adrian Vovk wrote:
>> > Why do you assume the encryption would happen twice?
>> 
>> I'm not assuming. That's the behavior of dm-crypt without passthrough.
>> It just encrypts everything that moves through it. If I stack two
>> layers of dm-crypt on top of each other my data is encrypted twice.
>
>Sure.  But why would you do that?

As mentioned earlier in the thread: I don't have a usecase specifically for 
this and it was an example of a situation where passthrough is necessary and no 
filesystem is involved at all. Though, as I also pointed out, a usecase where 
you're putting encrypted virtual partitions on an encrypted LVM setup isn't all 
that absurd.

In my real-world case, I'm putting encrypted loop devices on top of a 
filesystem that holds its own sensitive data. Each loop device has dm-crypt 
inside and uses a unique key, but the filesystem needs to be encrypted too 
(because, again, it has its own sensitive data outside of the loop devices). 
The loop devices cannot be put onto their own separate partition because 
there's no good way to know ahead of time how much space either of the 
partitions would need: sometimes the loop devices need to take up loads of 
space on the partition, and other times the non-loop-device data needs to take 
up that space. And to top it all off, the distribution of allocated space needs 
to change dynamically.

The current Linux kernel does not support this use-case without double 
encryption. The loop devices are encrypted once with their own dm-crypt 
instance. Then that same data is encrypted a second time over by the partition.

Actually this scenario is simplified. We actually want to use fscrypt inside of 
the loopback file too. So actually, without the passthrough mechanism some data 
would be encrypted three distinct times.

>> > No one knows that it actually is encryped.  The lower layer just knows
>> > the skip encryption flag was set, but it has zero assurance data
>> > actually was encrypted.
>> 
>> I think it makes sense to require that the data is actually encrypted
>> whenever the flag is set. Of course there's no way to enforce that
>> programmatically, but code that sets the flag without making sure the
>> data gets encrypted some other way wouldn't pass review.
>
>You have a lot of trusted in reviers. But even that doesn't help as
>the kernel can load code that never passed review.

Ultimately, I'm unsure what the concern is here.

It's a glaringly loud opt-in marker that encryption was already performed or is 
otherwise intentionally unnecessary. The flag existing isn't what punches 
through the security model. It's the use of the flag that does. I can't imagine 
anything setting the flag by accident. So what are you actually concerned 
about? How are you expecting this flag to actually be misused?

As for third party modules that might punch holes, so what? 3rd party modules 
aren't the kernel's responsibility or problem

>> Alternatively, if I recall correctly it should be possible to just
>> check if the bio has an attached encryption context. If it has one,
>> then just pass-through. If it doesn't, then attach your own. No flag
>> required this way, and dm-default-key would only add encryption iff
>> the data isn't already encrypted.
>
>That at least sounds a little better. 

Please see my follow up. This is actually not feasible because it doesn't work. 
Sometimes, fscrypt will just ask to move encrypted blocks around without 
providing an encryption context; the data doesn't need to be decrypted to be 
reshuffled on disk. This flag-less approach I describe would actually just 
break: it it would unintentionally encrypt that data during shuffling.

> But it still doesn't answer
>why we need this hack instead always encrypting at one layer instead
>of splitting it up.

In my loopback file scenario, what would be the one layer that could handle the 
encryption?

- the loopback files are just regular files that happen to have encrypted data 
inside of them. Doing it a different way changes the semantics: with a loopback 
file, I'm able to move it into a basic FAT filesystem and back without losing 
the encryption on the data

- the filesystem is completely unaware of any encryption. The loopback files 
are just files with random content inside. The filesystem itself is encrypted 
from below by the block layer. So, there's nothing for it to do.

- the underlying instance of dm-crypt is encrypting a single opaque blob of 
data, and so without explicit communication from above it cannot possibly know 
how to handle this.

Thus, I don't see a single layer that can handle this. The only solution is for 
upper layers to communicate downward.

Best,
Adrian

Reply via email to