dm crypt: reject key strings containing whitespace chars
authorOndrej Kozina <okozina@redhat.com>
Thu, 1 Dec 2016 17:20:52 +0000 (18:20 +0100)
committerMike Snitzer <snitzer@redhat.com>
Thu, 8 Dec 2016 19:13:16 +0000 (14:13 -0500)
commit027c431ccfcc89f7398d9f3e9bc2eb60e6cc57ad
treecd90793a833d9db7cd3d844eaacdf997e6c86ce5
parentb446396b7482938c859bfaa42320026d158616ae
dm crypt: reject key strings containing whitespace chars

Unfortunately key_string may theoretically contain whitespace even after
it's processed by dm_split_args().  The reason for this is DM core
supports escaping of almost all chars including any whitespace.

If userspace passes a key to the kernel in format ":32:logon:my_prefix:my\ key"
dm-crypt will look up key "my_prefix:my key" in kernel keyring service.
So far everything's fine.

Unfortunately if userspace later calls DM_TABLE_STATUS ioctl, it will not
receive back expected ":32:logon:my_prefix:my\ key" but the unescaped version
instead.  Also userpace (most notably cryptsetup) is not ready to parse
single target argument containing (even escaped) whitespace chars and any
whitespace is simply taken as delimiter of another argument.

This effect is mitigated by the fact libdevmapper curently performs
double escaping of '\' char.  Any user input in format "x\ x" is
transformed into "x\\ x" before being passed to the kernel.  Nonetheless
dm-crypt may be used without libdevmapper.  Therefore the near-term
solution to this is to reject any key string containing whitespace.

Signed-off-by: Ondrej Kozina <okozina@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-crypt.c