1. 29 5月, 2019 6 次提交
  2. 21 5月, 2019 1 次提交
  3. 17 4月, 2019 3 次提交
    • E
      fscrypt: clean up and improve dentry revalidation · 6cc24868
      Eric Biggers 提交于
      Make various improvements to fscrypt dentry revalidation:
      
      - Don't try to handle the case where the per-directory key is removed,
        as this can't happen without the inode (and dentries) being evicted.
      
      - Flag ciphertext dentries rather than plaintext dentries, since it's
        ciphertext dentries that need the special handling.
      
      - Avoid doing unnecessary work for non-ciphertext dentries.
      
      - When revalidating ciphertext dentries, try to set up the directory's
        i_crypt_info to make sure the key is really still absent, rather than
        invalidating all negative dentries as the previous code did.  An old
        comment suggested we can't do this for locking reasons, but AFAICT
        this comment was outdated and it actually works fine.
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      6cc24868
    • E
      fscrypt: use READ_ONCE() to access ->i_crypt_info · e37a784d
      Eric Biggers 提交于
      ->i_crypt_info starts out NULL and may later be locklessly set to a
      non-NULL value by the cmpxchg() in fscrypt_get_encryption_info().
      
      But ->i_crypt_info is used directly, which technically is incorrect.
      It's a data race, and it doesn't include the data dependency barrier
      needed to safely dereference the pointer on at least one architecture.
      
      Fix this by using READ_ONCE() instead.  Note: we don't need to use
      smp_load_acquire(), since dereferencing the pointer only requires a data
      dependency barrier, which is already included in READ_ONCE().  We also
      don't need READ_ONCE() in places where ->i_crypt_info is unconditionally
      dereferenced, since it must have already been checked.
      
      Also downgrade the cmpxchg() to cmpxchg_release(), since RELEASE
      semantics are sufficient on the write side.
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      e37a784d
    • E
      fscrypt: drop inode argument from fscrypt_get_ctx() · cd0265fc
      Eric Biggers 提交于
      The only reason the inode is being passed to fscrypt_get_ctx() is to
      verify that the encryption key is available.  However, all callers
      already ensure this because if we get as far as trying to do I/O to an
      encrypted file without the key, there's already a bug.
      
      Therefore, remove this unnecessary argument.
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      cd0265fc
  4. 06 1月, 2019 1 次提交
    • E
      fscrypt: add Adiantum support · 8094c3ce
      Eric Biggers 提交于
      Add support for the Adiantum encryption mode to fscrypt.  Adiantum is a
      tweakable, length-preserving encryption mode with security provably
      reducible to that of XChaCha12 and AES-256, subject to a security bound.
      It's also a true wide-block mode, unlike XTS.  See the paper
      "Adiantum: length-preserving encryption for entry-level processors"
      (https://eprint.iacr.org/2018/720.pdf) for more details.  Also see
      commit 059c2a4d ("crypto: adiantum - add Adiantum support").
      
      On sufficiently long messages, Adiantum's bottlenecks are XChaCha12 and
      the NH hash function.  These algorithms are fast even on processors
      without dedicated crypto instructions.  Adiantum makes it feasible to
      enable storage encryption on low-end mobile devices that lack AES
      instructions; currently such devices are unencrypted.  On ARM Cortex-A7,
      on 4096-byte messages Adiantum encryption is about 4 times faster than
      AES-256-XTS encryption; decryption is about 5 times faster.
      
      In fscrypt, Adiantum is suitable for encrypting both file contents and
      names.  With filenames, it fixes a known weakness: when two filenames in
      a directory share a common prefix of >= 16 bytes, with CTS-CBC their
      encrypted filenames share a common prefix too, leaking information.
      Adiantum does not have this problem.
      
      Since Adiantum also accepts long tweaks (IVs), it's also safe to use the
      master key directly for Adiantum encryption rather than deriving
      per-file keys, provided that the per-file nonce is included in the IVs
      and the master key isn't used for any other encryption mode.  This
      configuration saves memory and improves performance.  A new fscrypt
      policy flag is added to allow users to opt-in to this configuration.
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      8094c3ce
  5. 21 5月, 2018 5 次提交
  6. 03 5月, 2018 1 次提交
    • E
      fscrypt: allow synchronous bio decryption · 0cb8dae4
      Eric Biggers 提交于
      Currently, fscrypt provides fscrypt_decrypt_bio_pages() which decrypts a
      bio's pages asynchronously, then unlocks them afterwards.  But, this
      assumes that decryption is the last "postprocessing step" for the bio,
      so it's incompatible with additional postprocessing steps such as
      authenticity verification after decryption.
      
      Therefore, rename the existing fscrypt_decrypt_bio_pages() to
      fscrypt_enqueue_decrypt_bio().  Then, add fscrypt_decrypt_bio() which
      decrypts the pages in the bio synchronously without unlocking the pages,
      nor setting them Uptodate; and add fscrypt_enqueue_decrypt_work(), which
      enqueues work on the fscrypt_read_workqueue.  The new functions will be
      used by filesystems that support both fscrypt and fs-verity.
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      0cb8dae4
  7. 12 1月, 2018 1 次提交
  8. 03 11月, 2017 1 次提交
  9. 01 11月, 2017 1 次提交
    • E
      fscrypt: lock mutex before checking for bounce page pool · a0b3bc85
      Eric Biggers 提交于
      fscrypt_initialize(), which allocates the global bounce page pool when
      an encrypted file is first accessed, uses "double-checked locking" to
      try to avoid locking fscrypt_init_mutex.  However, it doesn't use any
      memory barriers, so it's theoretically possible for a thread to observe
      a bounce page pool which has not been fully initialized.  This is a
      classic bug with "double-checked locking".
      
      While "only a theoretical issue" in the latest kernel, in pre-4.8
      kernels the pointer that was checked was not even the last to be
      initialized, so it was easily possible for a crash (NULL pointer
      dereference) to happen.  This was changed only incidentally by the large
      refactor to use fs/crypto/.
      
      Solve both problems in a trivial way that can easily be backported: just
      always take the mutex.  It's theoretically less efficient, but it
      shouldn't be noticeable in practice as the mutex is only acquired very
      briefly once per encrypted file.
      
      Later I'd like to make this use a helper macro like DO_ONCE().  However,
      DO_ONCE() runs in atomic context, so we'd need to add a new macro that
      allows blocking.
      
      Cc: stable@vger.kernel.org # v4.1+
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      a0b3bc85
  10. 19 10月, 2017 1 次提交
  11. 24 6月, 2017 1 次提交
    • D
      fscrypt: add support for AES-128-CBC · b7e7cf7a
      Daniel Walter 提交于
      fscrypt provides facilities to use different encryption algorithms which
      are selectable by userspace when setting the encryption policy. Currently,
      only AES-256-XTS for file contents and AES-256-CBC-CTS for file names are
      implemented. This is a clear case of kernel offers the mechanism and
      userspace selects a policy. Similar to what dm-crypt and ecryptfs have.
      
      This patch adds support for using AES-128-CBC for file contents and
      AES-128-CBC-CTS for file name encryption. To mitigate watermarking
      attacks, IVs are generated using the ESSIV algorithm. While AES-CBC is
      actually slightly less secure than AES-XTS from a security point of view,
      there is more widespread hardware support. Using AES-CBC gives us the
      acceptable performance while still providing a moderate level of security
      for persistent storage.
      
      Especially low-powered embedded devices with crypto accelerators such as
      CAAM or CESA often only support AES-CBC. Since using AES-CBC over AES-XTS
      is basically thought of a last resort, we use AES-128-CBC over AES-256-CBC
      since it has less encryption rounds and yields noticeable better
      performance starting from a file size of just a few kB.
      Signed-off-by: NDaniel Walter <dwalter@sigma-star.at>
      [david@sigma-star.at: addressed review comments]
      Signed-off-by: NDavid Gstir <david@sigma-star.at>
      Reviewed-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      b7e7cf7a
  12. 16 3月, 2017 1 次提交
    • E
      fscrypt: remove broken support for detecting keyring key revocation · 1b53cf98
      Eric Biggers 提交于
      Filesystem encryption ostensibly supported revoking a keyring key that
      had been used to "unlock" encrypted files, causing those files to become
      "locked" again.  This was, however, buggy for several reasons, the most
      severe of which was that when key revocation happened to be detected for
      an inode, its fscrypt_info was immediately freed, even while other
      threads could be using it for encryption or decryption concurrently.
      This could be exploited to crash the kernel or worse.
      
      This patch fixes the use-after-free by removing the code which detects
      the keyring key having been revoked, invalidated, or expired.  Instead,
      an encrypted inode that is "unlocked" now simply remains unlocked until
      it is evicted from memory.  Note that this is no worse than the case for
      block device-level encryption, e.g. dm-crypt, and it still remains
      possible for a privileged user to evict unused pages, inodes, and
      dentries by running 'sync; echo 3 > /proc/sys/vm/drop_caches', or by
      simply unmounting the filesystem.  In fact, one of those actions was
      already needed anyway for key revocation to work even somewhat sanely.
      This change is not expected to break any applications.
      
      In the future I'd like to implement a real API for fscrypt key
      revocation that interacts sanely with ongoing filesystem operations ---
      waiting for existing operations to complete and blocking new operations,
      and invalidating and sanitizing key material and plaintext from the VFS
      caches.  But this is a hard problem, and for now this bug must be fixed.
      
      This bug affected almost all versions of ext4, f2fs, and ubifs
      encryption, and it was potentially reachable in any kernel configured
      with encryption support (CONFIG_EXT4_ENCRYPTION=y,
      CONFIG_EXT4_FS_ENCRYPTION=y, CONFIG_F2FS_FS_ENCRYPTION=y, or
      CONFIG_UBIFS_FS_ENCRYPTION=y).  Note that older kernels did not use the
      shared fs/crypto/ code, but due to the potential security implications
      of this bug, it may still be worthwhile to backport this fix to them.
      
      Fixes: b7236e21 ("ext4 crypto: reorganize how we store keys in the inode")
      Cc: stable@vger.kernel.org # v4.2+
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      Acked-by: NMichael Halcrow <mhalcrow@google.com>
      1b53cf98
  13. 02 1月, 2017 1 次提交
  14. 12 12月, 2016 8 次提交
  15. 14 11月, 2016 5 次提交
  16. 13 10月, 2016 1 次提交
    • E
      fscrypto: make XTS tweak initialization endian-independent · fb445437
      Eric Biggers 提交于
      The XTS tweak (or IV) was initialized differently on little endian and
      big endian systems.  Because the ciphertext depends on the XTS tweak, it
      was not possible to use an encrypted filesystem created by a little
      endian system on a big endian system and vice versa, even if they shared
      the same PAGE_SIZE.  Fix this by always using little endian.
      
      This will break hypothetical big endian users of ext4 or f2fs
      encryption.  However, all users we are aware of are little endian, and
      it's believed that "real" big endian users are unlikely to exist yet.
      So this might as well be fixed now before it's too late.
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      Cc: stable@vger.kernel.org
      fb445437
  17. 16 9月, 2016 2 次提交