linux/fs/crypto/hooks.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * fs/crypto/hooks.c
   4 *
   5 * Encryption hooks for higher-level filesystem operations.
   6 */
   7
   8#include "fscrypt_private.h"
   9
  10/**
  11 * fscrypt_file_open - prepare to open a possibly-encrypted regular file
  12 * @inode: the inode being opened
  13 * @filp: the struct file being set up
  14 *
  15 * Currently, an encrypted regular file can only be opened if its encryption key
  16 * is available; access to the raw encrypted contents is not supported.
  17 * Therefore, we first set up the inode's encryption key (if not already done)
  18 * and return an error if it's unavailable.
  19 *
  20 * We also verify that if the parent directory (from the path via which the file
  21 * is being opened) is encrypted, then the inode being opened uses the same
  22 * encryption policy.  This is needed as part of the enforcement that all files
  23 * in an encrypted directory tree use the same encryption policy, as a
  24 * protection against certain types of offline attacks.  Note that this check is
  25 * needed even when opening an *unencrypted* file, since it's forbidden to have
  26 * an unencrypted file in an encrypted directory.
  27 *
  28 * Return: 0 on success, -ENOKEY if the key is missing, or another -errno code
  29 */
  30int fscrypt_file_open(struct inode *inode, struct file *filp)
  31{
  32        int err;
  33        struct dentry *dir;
  34
  35        err = fscrypt_require_key(inode);
  36        if (err)
  37                return err;
  38
  39        dir = dget_parent(file_dentry(filp));
  40        if (IS_ENCRYPTED(d_inode(dir)) &&
  41            !fscrypt_has_permitted_context(d_inode(dir), inode)) {
  42                fscrypt_warn(inode,
  43                             "Inconsistent encryption context (parent directory: %lu)",
  44                             d_inode(dir)->i_ino);
  45                err = -EPERM;
  46        }
  47        dput(dir);
  48        return err;
  49}
  50EXPORT_SYMBOL_GPL(fscrypt_file_open);
  51
  52int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,
  53                           struct dentry *dentry)
  54{
  55        int err;
  56
  57        err = fscrypt_require_key(dir);
  58        if (err)
  59                return err;
  60
  61        /* ... in case we looked up ciphertext name before key was added */
  62        if (dentry->d_flags & DCACHE_ENCRYPTED_NAME)
  63                return -ENOKEY;
  64
  65        if (!fscrypt_has_permitted_context(dir, inode))
  66                return -EXDEV;
  67
  68        return 0;
  69}
  70EXPORT_SYMBOL_GPL(__fscrypt_prepare_link);
  71
  72int __fscrypt_prepare_rename(struct inode *old_dir, struct dentry *old_dentry,
  73                             struct inode *new_dir, struct dentry *new_dentry,
  74                             unsigned int flags)
  75{
  76        int err;
  77
  78        err = fscrypt_require_key(old_dir);
  79        if (err)
  80                return err;
  81
  82        err = fscrypt_require_key(new_dir);
  83        if (err)
  84                return err;
  85
  86        /* ... in case we looked up ciphertext name(s) before key was added */
  87        if ((old_dentry->d_flags | new_dentry->d_flags) &
  88            DCACHE_ENCRYPTED_NAME)
  89                return -ENOKEY;
  90
  91        if (old_dir != new_dir) {
  92                if (IS_ENCRYPTED(new_dir) &&
  93                    !fscrypt_has_permitted_context(new_dir,
  94                                                   d_inode(old_dentry)))
  95                        return -EXDEV;
  96
  97                if ((flags & RENAME_EXCHANGE) &&
  98                    IS_ENCRYPTED(old_dir) &&
  99                    !fscrypt_has_permitted_context(old_dir,
 100                                                   d_inode(new_dentry)))
 101                        return -EXDEV;
 102        }
 103        return 0;
 104}
 105EXPORT_SYMBOL_GPL(__fscrypt_prepare_rename);
 106
 107int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
 108                             struct fscrypt_name *fname)
 109{
 110        int err = fscrypt_setup_filename(dir, &dentry->d_name, 1, fname);
 111
 112        if (err && err != -ENOENT)
 113                return err;
 114
 115        if (fname->is_ciphertext_name) {
 116                spin_lock(&dentry->d_lock);
 117                dentry->d_flags |= DCACHE_ENCRYPTED_NAME;
 118                spin_unlock(&dentry->d_lock);
 119                d_set_d_op(dentry, &fscrypt_d_ops);
 120        }
 121        return err;
 122}
 123EXPORT_SYMBOL_GPL(__fscrypt_prepare_lookup);
 124
 125int __fscrypt_prepare_symlink(struct inode *dir, unsigned int len,
 126                              unsigned int max_len,
 127                              struct fscrypt_str *disk_link)
 128{
 129        int err;
 130
 131        /*
 132         * To calculate the size of the encrypted symlink target we need to know
 133         * the amount of NUL padding, which is determined by the flags set in
 134         * the encryption policy which will be inherited from the directory.
 135         * The easiest way to get access to this is to just load the directory's
 136         * fscrypt_info, since we'll need it to create the dir_entry anyway.
 137         *
 138         * Note: in test_dummy_encryption mode, @dir may be unencrypted.
 139         */
 140        err = fscrypt_get_encryption_info(dir);
 141        if (err)
 142                return err;
 143        if (!fscrypt_has_encryption_key(dir))
 144                return -ENOKEY;
 145
 146        /*
 147         * Calculate the size of the encrypted symlink and verify it won't
 148         * exceed max_len.  Note that for historical reasons, encrypted symlink
 149         * targets are prefixed with the ciphertext length, despite this
 150         * actually being redundant with i_size.  This decreases by 2 bytes the
 151         * longest symlink target we can accept.
 152         *
 153         * We could recover 1 byte by not counting a null terminator, but
 154         * counting it (even though it is meaningless for ciphertext) is simpler
 155         * for now since filesystems will assume it is there and subtract it.
 156         */
 157        if (!fscrypt_fname_encrypted_size(dir, len,
 158                                          max_len - sizeof(struct fscrypt_symlink_data),
 159                                          &disk_link->len))
 160                return -ENAMETOOLONG;
 161        disk_link->len += sizeof(struct fscrypt_symlink_data);
 162
 163        disk_link->name = NULL;
 164        return 0;
 165}
 166EXPORT_SYMBOL_GPL(__fscrypt_prepare_symlink);
 167
 168int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,
 169                              unsigned int len, struct fscrypt_str *disk_link)
 170{
 171        int err;
 172        struct qstr iname = QSTR_INIT(target, len);
 173        struct fscrypt_symlink_data *sd;
 174        unsigned int ciphertext_len;
 175
 176        err = fscrypt_require_key(inode);
 177        if (err)
 178                return err;
 179
 180        if (disk_link->name) {
 181                /* filesystem-provided buffer */
 182                sd = (struct fscrypt_symlink_data *)disk_link->name;
 183        } else {
 184                sd = kmalloc(disk_link->len, GFP_NOFS);
 185                if (!sd)
 186                        return -ENOMEM;
 187        }
 188        ciphertext_len = disk_link->len - sizeof(*sd);
 189        sd->len = cpu_to_le16(ciphertext_len);
 190
 191        err = fname_encrypt(inode, &iname, sd->encrypted_path, ciphertext_len);
 192        if (err)
 193                goto err_free_sd;
 194
 195        /*
 196         * Null-terminating the ciphertext doesn't make sense, but we still
 197         * count the null terminator in the length, so we might as well
 198         * initialize it just in case the filesystem writes it out.
 199         */
 200        sd->encrypted_path[ciphertext_len] = '\0';
 201
 202        /* Cache the plaintext symlink target for later use by get_link() */
 203        err = -ENOMEM;
 204        inode->i_link = kmemdup(target, len + 1, GFP_NOFS);
 205        if (!inode->i_link)
 206                goto err_free_sd;
 207
 208        if (!disk_link->name)
 209                disk_link->name = (unsigned char *)sd;
 210        return 0;
 211
 212err_free_sd:
 213        if (!disk_link->name)
 214                kfree(sd);
 215        return err;
 216}
 217EXPORT_SYMBOL_GPL(__fscrypt_encrypt_symlink);
 218
 219/**
 220 * fscrypt_get_symlink - get the target of an encrypted symlink
 221 * @inode: the symlink inode
 222 * @caddr: the on-disk contents of the symlink
 223 * @max_size: size of @caddr buffer
 224 * @done: if successful, will be set up to free the returned target if needed
 225 *
 226 * If the symlink's encryption key is available, we decrypt its target.
 227 * Otherwise, we encode its target for presentation.
 228 *
 229 * This may sleep, so the filesystem must have dropped out of RCU mode already.
 230 *
 231 * Return: the presentable symlink target or an ERR_PTR()
 232 */
 233const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
 234                                unsigned int max_size,
 235                                struct delayed_call *done)
 236{
 237        const struct fscrypt_symlink_data *sd;
 238        struct fscrypt_str cstr, pstr;
 239        bool has_key;
 240        int err;
 241
 242        /* This is for encrypted symlinks only */
 243        if (WARN_ON(!IS_ENCRYPTED(inode)))
 244                return ERR_PTR(-EINVAL);
 245
 246        /* If the decrypted target is already cached, just return it. */
 247        pstr.name = READ_ONCE(inode->i_link);
 248        if (pstr.name)
 249                return pstr.name;
 250
 251        /*
 252         * Try to set up the symlink's encryption key, but we can continue
 253         * regardless of whether the key is available or not.
 254         */
 255        err = fscrypt_get_encryption_info(inode);
 256        if (err)
 257                return ERR_PTR(err);
 258        has_key = fscrypt_has_encryption_key(inode);
 259
 260        /*
 261         * For historical reasons, encrypted symlink targets are prefixed with
 262         * the ciphertext length, even though this is redundant with i_size.
 263         */
 264
 265        if (max_size < sizeof(*sd))
 266                return ERR_PTR(-EUCLEAN);
 267        sd = caddr;
 268        cstr.name = (unsigned char *)sd->encrypted_path;
 269        cstr.len = le16_to_cpu(sd->len);
 270
 271        if (cstr.len == 0)
 272                return ERR_PTR(-EUCLEAN);
 273
 274        if (cstr.len + sizeof(*sd) - 1 > max_size)
 275                return ERR_PTR(-EUCLEAN);
 276
 277        err = fscrypt_fname_alloc_buffer(inode, cstr.len, &pstr);
 278        if (err)
 279                return ERR_PTR(err);
 280
 281        err = fscrypt_fname_disk_to_usr(inode, 0, 0, &cstr, &pstr);
 282        if (err)
 283                goto err_kfree;
 284
 285        err = -EUCLEAN;
 286        if (pstr.name[0] == '\0')
 287                goto err_kfree;
 288
 289        pstr.name[pstr.len] = '\0';
 290
 291        /*
 292         * Cache decrypted symlink targets in i_link for later use.  Don't cache
 293         * symlink targets encoded without the key, since those become outdated
 294         * once the key is added.  This pairs with the READ_ONCE() above and in
 295         * the VFS path lookup code.
 296         */
 297        if (!has_key ||
 298            cmpxchg_release(&inode->i_link, NULL, pstr.name) != NULL)
 299                set_delayed_call(done, kfree_link, pstr.name);
 300
 301        return pstr.name;
 302
 303err_kfree:
 304        kfree(pstr.name);
 305        return ERR_PTR(err);
 306}
 307EXPORT_SYMBOL_GPL(fscrypt_get_symlink);
 308