Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1 | ===================================== |
| 2 | Filesystem-level encryption (fscrypt) |
| 3 | ===================================== |
| 4 | |
| 5 | Introduction |
| 6 | ============ |
| 7 | |
| 8 | fscrypt is a library which filesystems can hook into to support |
| 9 | transparent encryption of files and directories. |
| 10 | |
| 11 | Note: "fscrypt" in this document refers to the kernel-level portion, |
| 12 | implemented in ``fs/crypto/``, as opposed to the userspace tool |
| 13 | `fscrypt <https://github.com/google/fscrypt>`_. This document only |
| 14 | covers the kernel-level portion. For command-line examples of how to |
| 15 | use encryption, see the documentation for the userspace tool `fscrypt |
| 16 | <https://github.com/google/fscrypt>`_. Also, it is recommended to use |
| 17 | the fscrypt userspace tool, or other existing userspace tools such as |
| 18 | `fscryptctl <https://github.com/google/fscryptctl>`_ or `Android's key |
| 19 | management system |
| 20 | <https://source.android.com/security/encryption/file-based>`_, over |
| 21 | using the kernel's API directly. Using existing tools reduces the |
| 22 | chance of introducing your own security bugs. (Nevertheless, for |
| 23 | completeness this documentation covers the kernel's API anyway.) |
| 24 | |
| 25 | Unlike dm-crypt, fscrypt operates at the filesystem level rather than |
| 26 | at the block device level. This allows it to encrypt different files |
| 27 | with different keys and to have unencrypted files on the same |
| 28 | filesystem. This is useful for multi-user systems where each user's |
| 29 | data-at-rest needs to be cryptographically isolated from the others. |
| 30 | However, except for filenames, fscrypt does not encrypt filesystem |
| 31 | metadata. |
| 32 | |
| 33 | Unlike eCryptfs, which is a stacked filesystem, fscrypt is integrated |
| 34 | directly into supported filesystems --- currently ext4, F2FS, and |
| 35 | UBIFS. This allows encrypted files to be read and written without |
| 36 | caching both the decrypted and encrypted pages in the pagecache, |
| 37 | thereby nearly halving the memory used and bringing it in line with |
| 38 | unencrypted files. Similarly, half as many dentries and inodes are |
| 39 | needed. eCryptfs also limits encrypted filenames to 143 bytes, |
| 40 | causing application compatibility issues; fscrypt allows the full 255 |
| 41 | bytes (NAME_MAX). Finally, unlike eCryptfs, the fscrypt API can be |
| 42 | used by unprivileged users, with no need to mount anything. |
| 43 | |
| 44 | fscrypt does not support encrypting files in-place. Instead, it |
| 45 | supports marking an empty directory as encrypted. Then, after |
| 46 | userspace provides the key, all regular files, directories, and |
| 47 | symbolic links created in that directory tree are transparently |
| 48 | encrypted. |
| 49 | |
| 50 | Threat model |
| 51 | ============ |
| 52 | |
| 53 | Offline attacks |
| 54 | --------------- |
| 55 | |
| 56 | Provided that userspace chooses a strong encryption key, fscrypt |
| 57 | protects the confidentiality of file contents and filenames in the |
| 58 | event of a single point-in-time permanent offline compromise of the |
| 59 | block device content. fscrypt does not protect the confidentiality of |
| 60 | non-filename metadata, e.g. file sizes, file permissions, file |
| 61 | timestamps, and extended attributes. Also, the existence and location |
| 62 | of holes (unallocated blocks which logically contain all zeroes) in |
| 63 | files is not protected. |
| 64 | |
| 65 | fscrypt is not guaranteed to protect confidentiality or authenticity |
| 66 | if an attacker is able to manipulate the filesystem offline prior to |
| 67 | an authorized user later accessing the filesystem. |
| 68 | |
| 69 | Online attacks |
| 70 | -------------- |
| 71 | |
| 72 | fscrypt (and storage encryption in general) can only provide limited |
| 73 | protection, if any at all, against online attacks. In detail: |
| 74 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 75 | Side-channel attacks |
| 76 | ~~~~~~~~~~~~~~~~~~~~ |
| 77 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 78 | fscrypt is only resistant to side-channel attacks, such as timing or |
| 79 | electromagnetic attacks, to the extent that the underlying Linux |
| 80 | Cryptographic API algorithms are. If a vulnerable algorithm is used, |
| 81 | such as a table-based implementation of AES, it may be possible for an |
| 82 | attacker to mount a side channel attack against the online system. |
| 83 | Side channel attacks may also be mounted against applications |
| 84 | consuming decrypted data. |
| 85 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 86 | Unauthorized file access |
| 87 | ~~~~~~~~~~~~~~~~~~~~~~~~ |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 88 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 89 | After an encryption key has been added, fscrypt does not hide the |
| 90 | plaintext file contents or filenames from other users on the same |
| 91 | system. Instead, existing access control mechanisms such as file mode |
| 92 | bits, POSIX ACLs, LSMs, or namespaces should be used for this purpose. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 93 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 94 | (For the reasoning behind this, understand that while the key is |
| 95 | added, the confidentiality of the data, from the perspective of the |
| 96 | system itself, is *not* protected by the mathematical properties of |
| 97 | encryption but rather only by the correctness of the kernel. |
| 98 | Therefore, any encryption-specific access control checks would merely |
| 99 | be enforced by kernel *code* and therefore would be largely redundant |
| 100 | with the wide variety of access control mechanisms already available.) |
| 101 | |
| 102 | Kernel memory compromise |
| 103 | ~~~~~~~~~~~~~~~~~~~~~~~~ |
| 104 | |
| 105 | An attacker who compromises the system enough to read from arbitrary |
| 106 | memory, e.g. by mounting a physical attack or by exploiting a kernel |
| 107 | security vulnerability, can compromise all encryption keys that are |
| 108 | currently in use. |
| 109 | |
| 110 | However, fscrypt allows encryption keys to be removed from the kernel, |
| 111 | which may protect them from later compromise. |
| 112 | |
| 113 | In more detail, the FS_IOC_REMOVE_ENCRYPTION_KEY ioctl (or the |
| 114 | FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS ioctl) can wipe a master |
| 115 | encryption key from kernel memory. If it does so, it will also try to |
| 116 | evict all cached inodes which had been "unlocked" using the key, |
| 117 | thereby wiping their per-file keys and making them once again appear |
| 118 | "locked", i.e. in ciphertext or encrypted form. |
| 119 | |
| 120 | However, these ioctls have some limitations: |
| 121 | |
| 122 | - Per-file keys for in-use files will *not* be removed or wiped. |
| 123 | Therefore, for maximum effect, userspace should close the relevant |
| 124 | encrypted files and directories before removing a master key, as |
| 125 | well as kill any processes whose working directory is in an affected |
| 126 | encrypted directory. |
| 127 | |
| 128 | - The kernel cannot magically wipe copies of the master key(s) that |
| 129 | userspace might have as well. Therefore, userspace must wipe all |
| 130 | copies of the master key(s) it makes as well; normally this should |
| 131 | be done immediately after FS_IOC_ADD_ENCRYPTION_KEY, without waiting |
| 132 | for FS_IOC_REMOVE_ENCRYPTION_KEY. Naturally, the same also applies |
| 133 | to all higher levels in the key hierarchy. Userspace should also |
| 134 | follow other security precautions such as mlock()ing memory |
| 135 | containing keys to prevent it from being swapped out. |
| 136 | |
| 137 | - In general, decrypted contents and filenames in the kernel VFS |
| 138 | caches are freed but not wiped. Therefore, portions thereof may be |
| 139 | recoverable from freed memory, even after the corresponding key(s) |
| 140 | were wiped. To partially solve this, you can set |
| 141 | CONFIG_PAGE_POISONING=y in your kernel config and add page_poison=1 |
| 142 | to your kernel command line. However, this has a performance cost. |
| 143 | |
| 144 | - Secret keys might still exist in CPU registers, in crypto |
| 145 | accelerator hardware (if used by the crypto API to implement any of |
| 146 | the algorithms), or in other places not explicitly considered here. |
| 147 | |
| 148 | Limitations of v1 policies |
| 149 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 150 | |
| 151 | v1 encryption policies have some weaknesses with respect to online |
| 152 | attacks: |
| 153 | |
| 154 | - There is no verification that the provided master key is correct. |
| 155 | Therefore, a malicious user can temporarily associate the wrong key |
| 156 | with another user's encrypted files to which they have read-only |
| 157 | access. Because of filesystem caching, the wrong key will then be |
| 158 | used by the other user's accesses to those files, even if the other |
| 159 | user has the correct key in their own keyring. This violates the |
| 160 | meaning of "read-only access". |
| 161 | |
| 162 | - A compromise of a per-file key also compromises the master key from |
| 163 | which it was derived. |
| 164 | |
| 165 | - Non-root users cannot securely remove encryption keys. |
| 166 | |
| 167 | All the above problems are fixed with v2 encryption policies. For |
| 168 | this reason among others, it is recommended to use v2 encryption |
| 169 | policies on all new encrypted directories. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 170 | |
| 171 | Key hierarchy |
| 172 | ============= |
| 173 | |
| 174 | Master Keys |
| 175 | ----------- |
| 176 | |
| 177 | Each encrypted directory tree is protected by a *master key*. Master |
| 178 | keys can be up to 64 bytes long, and must be at least as long as the |
| 179 | greater of the key length needed by the contents and filenames |
| 180 | encryption modes being used. For example, if AES-256-XTS is used for |
| 181 | contents encryption, the master key must be 64 bytes (512 bits). Note |
| 182 | that the XTS mode is defined to require a key twice as long as that |
| 183 | required by the underlying block cipher. |
| 184 | |
| 185 | To "unlock" an encrypted directory tree, userspace must provide the |
| 186 | appropriate master key. There can be any number of master keys, each |
| 187 | of which protects any number of directory trees on any number of |
| 188 | filesystems. |
| 189 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 190 | Master keys must be real cryptographic keys, i.e. indistinguishable |
| 191 | from random bytestrings of the same length. This implies that users |
| 192 | **must not** directly use a password as a master key, zero-pad a |
| 193 | shorter key, or repeat a shorter key. Security cannot be guaranteed |
| 194 | if userspace makes any such error, as the cryptographic proofs and |
| 195 | analysis would no longer apply. |
| 196 | |
| 197 | Instead, users should generate master keys either using a |
| 198 | cryptographically secure random number generator, or by using a KDF |
| 199 | (Key Derivation Function). The kernel does not do any key stretching; |
| 200 | therefore, if userspace derives the key from a low-entropy secret such |
| 201 | as a passphrase, it is critical that a KDF designed for this purpose |
| 202 | be used, such as scrypt, PBKDF2, or Argon2. |
| 203 | |
| 204 | Key derivation function |
| 205 | ----------------------- |
| 206 | |
| 207 | With one exception, fscrypt never uses the master key(s) for |
| 208 | encryption directly. Instead, they are only used as input to a KDF |
| 209 | (Key Derivation Function) to derive the actual keys. |
| 210 | |
| 211 | The KDF used for a particular master key differs depending on whether |
| 212 | the key is used for v1 encryption policies or for v2 encryption |
| 213 | policies. Users **must not** use the same key for both v1 and v2 |
| 214 | encryption policies. (No real-world attack is currently known on this |
| 215 | specific case of key reuse, but its security cannot be guaranteed |
| 216 | since the cryptographic proofs and analysis would no longer apply.) |
| 217 | |
| 218 | For v1 encryption policies, the KDF only supports deriving per-file |
| 219 | encryption keys. It works by encrypting the master key with |
| 220 | AES-128-ECB, using the file's 16-byte nonce as the AES key. The |
| 221 | resulting ciphertext is used as the derived key. If the ciphertext is |
| 222 | longer than needed, then it is truncated to the needed length. |
| 223 | |
| 224 | For v2 encryption policies, the KDF is HKDF-SHA512. The master key is |
| 225 | passed as the "input keying material", no salt is used, and a distinct |
| 226 | "application-specific information string" is used for each distinct |
| 227 | key to be derived. For example, when a per-file encryption key is |
| 228 | derived, the application-specific information string is the file's |
| 229 | nonce prefixed with "fscrypt\\0" and a context byte. Different |
| 230 | context bytes are used for other types of derived keys. |
| 231 | |
| 232 | HKDF-SHA512 is preferred to the original AES-128-ECB based KDF because |
| 233 | HKDF is more flexible, is nonreversible, and evenly distributes |
| 234 | entropy from the master key. HKDF is also standardized and widely |
| 235 | used by other software, whereas the AES-128-ECB based KDF is ad-hoc. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 236 | |
Eric Biggers | f592efe | 2020-01-20 14:31:58 -0800 | [diff] [blame] | 237 | Per-file encryption keys |
| 238 | ------------------------ |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 239 | |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 240 | Since each master key can protect many files, it is necessary to |
| 241 | "tweak" the encryption of each file so that the same plaintext in two |
| 242 | files doesn't map to the same ciphertext, or vice versa. In most |
| 243 | cases, fscrypt does this by deriving per-file keys. When a new |
| 244 | encrypted inode (regular file, directory, or symlink) is created, |
| 245 | fscrypt randomly generates a 16-byte nonce and stores it in the |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 246 | inode's encryption xattr. Then, it uses a KDF (as described in `Key |
| 247 | derivation function`_) to derive the file's key from the master key |
| 248 | and nonce. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 249 | |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 250 | Key derivation was chosen over key wrapping because wrapped keys would |
| 251 | require larger xattrs which would be less likely to fit in-line in the |
| 252 | filesystem's inode table, and there didn't appear to be any |
| 253 | significant advantages to key wrapping. In particular, currently |
| 254 | there is no requirement to support unlocking a file with multiple |
| 255 | alternative master keys or to support rotating master keys. Instead, |
| 256 | the master keys may be wrapped in userspace, e.g. as is done by the |
| 257 | `fscrypt <https://github.com/google/fscrypt>`_ tool. |
| 258 | |
Eric Biggers | b103fb7 | 2019-10-24 14:54:36 -0700 | [diff] [blame] | 259 | DIRECT_KEY policies |
| 260 | ------------------- |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 261 | |
| 262 | The Adiantum encryption mode (see `Encryption modes and usage`_) is |
| 263 | suitable for both contents and filenames encryption, and it accepts |
| 264 | long IVs --- long enough to hold both an 8-byte logical block number |
| 265 | and a 16-byte per-file nonce. Also, the overhead of each Adiantum key |
| 266 | is greater than that of an AES-256-XTS key. |
| 267 | |
| 268 | Therefore, to improve performance and save memory, for Adiantum a |
| 269 | "direct key" configuration is supported. When the user has enabled |
| 270 | this by setting FSCRYPT_POLICY_FLAG_DIRECT_KEY in the fscrypt policy, |
Eric Biggers | f592efe | 2020-01-20 14:31:58 -0800 | [diff] [blame] | 271 | per-file encryption keys are not used. Instead, whenever any data |
| 272 | (contents or filenames) is encrypted, the file's 16-byte nonce is |
| 273 | included in the IV. Moreover: |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 274 | |
| 275 | - For v1 encryption policies, the encryption is done directly with the |
| 276 | master key. Because of this, users **must not** use the same master |
| 277 | key for any other purpose, even for other v1 policies. |
| 278 | |
| 279 | - For v2 encryption policies, the encryption is done with a per-mode |
| 280 | key derived using the KDF. Users may use the same master key for |
| 281 | other v2 encryption policies. |
| 282 | |
Eric Biggers | b103fb7 | 2019-10-24 14:54:36 -0700 | [diff] [blame] | 283 | IV_INO_LBLK_64 policies |
| 284 | ----------------------- |
| 285 | |
| 286 | When FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 is set in the fscrypt policy, |
| 287 | the encryption keys are derived from the master key, encryption mode |
| 288 | number, and filesystem UUID. This normally results in all files |
| 289 | protected by the same master key sharing a single contents encryption |
| 290 | key and a single filenames encryption key. To still encrypt different |
| 291 | files' data differently, inode numbers are included in the IVs. |
| 292 | Consequently, shrinking the filesystem may not be allowed. |
| 293 | |
| 294 | This format is optimized for use with inline encryption hardware |
Eric Biggers | e3b1078 | 2020-05-15 13:41:41 -0700 | [diff] [blame] | 295 | compliant with the UFS standard, which supports only 64 IV bits per |
| 296 | I/O request and may have only a small number of keyslots. |
| 297 | |
| 298 | IV_INO_LBLK_32 policies |
| 299 | ----------------------- |
| 300 | |
| 301 | IV_INO_LBLK_32 policies work like IV_INO_LBLK_64, except that for |
| 302 | IV_INO_LBLK_32, the inode number is hashed with SipHash-2-4 (where the |
| 303 | SipHash key is derived from the master key) and added to the file |
| 304 | logical block number mod 2^32 to produce a 32-bit IV. |
| 305 | |
| 306 | This format is optimized for use with inline encryption hardware |
| 307 | compliant with the eMMC v5.2 standard, which supports only 32 IV bits |
| 308 | per I/O request and may have only a small number of keyslots. This |
| 309 | format results in some level of IV reuse, so it should only be used |
| 310 | when necessary due to hardware limitations. |
Eric Biggers | b103fb7 | 2019-10-24 14:54:36 -0700 | [diff] [blame] | 311 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 312 | Key identifiers |
| 313 | --------------- |
| 314 | |
| 315 | For master keys used for v2 encryption policies, a unique 16-byte "key |
| 316 | identifier" is also derived using the KDF. This value is stored in |
| 317 | the clear, since it is needed to reliably identify the key itself. |
| 318 | |
Daniel Rosenberg | aa408f8 | 2020-01-20 14:31:57 -0800 | [diff] [blame] | 319 | Dirhash keys |
| 320 | ------------ |
| 321 | |
| 322 | For directories that are indexed using a secret-keyed dirhash over the |
| 323 | plaintext filenames, the KDF is also used to derive a 128-bit |
| 324 | SipHash-2-4 key per directory in order to hash filenames. This works |
| 325 | just like deriving a per-file encryption key, except that a different |
| 326 | KDF context is used. Currently, only casefolded ("case-insensitive") |
| 327 | encrypted directories use this style of hashing. |
| 328 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 329 | Encryption modes and usage |
| 330 | ========================== |
| 331 | |
| 332 | fscrypt allows one encryption mode to be specified for file contents |
| 333 | and one encryption mode to be specified for filenames. Different |
| 334 | directory trees are permitted to use different encryption modes. |
| 335 | Currently, the following pairs of encryption modes are supported: |
| 336 | |
| 337 | - AES-256-XTS for contents and AES-256-CTS-CBC for filenames |
| 338 | - AES-128-CBC for contents and AES-128-CTS-CBC for filenames |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 339 | - Adiantum for both contents and filenames |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 340 | |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 341 | If unsure, you should use the (AES-256-XTS, AES-256-CTS-CBC) pair. |
| 342 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 343 | AES-128-CBC was added only for low-powered embedded devices with |
Eric Biggers | adbd9b4 | 2019-06-20 11:15:05 -0700 | [diff] [blame] | 344 | crypto accelerators such as CAAM or CESA that do not support XTS. To |
Eric Biggers | 4006d79 | 2019-10-09 16:34:16 -0700 | [diff] [blame] | 345 | use AES-128-CBC, CONFIG_CRYPTO_ESSIV and CONFIG_CRYPTO_SHA256 (or |
| 346 | another SHA-256 implementation) must be enabled so that ESSIV can be |
| 347 | used. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 348 | |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 349 | Adiantum is a (primarily) stream cipher-based mode that is fast even |
| 350 | on CPUs without dedicated crypto instructions. It's also a true |
| 351 | wide-block mode, unlike XTS. It can also eliminate the need to derive |
Eric Biggers | f592efe | 2020-01-20 14:31:58 -0800 | [diff] [blame] | 352 | per-file encryption keys. However, it depends on the security of two |
| 353 | primitives, XChaCha12 and AES-256, rather than just one. See the |
| 354 | paper "Adiantum: length-preserving encryption for entry-level |
| 355 | processors" (https://eprint.iacr.org/2018/720.pdf) for more details. |
| 356 | To use Adiantum, CONFIG_CRYPTO_ADIANTUM must be enabled. Also, fast |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 357 | implementations of ChaCha and NHPoly1305 should be enabled, e.g. |
| 358 | CONFIG_CRYPTO_CHACHA20_NEON and CONFIG_CRYPTO_NHPOLY1305_NEON for ARM. |
| 359 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 360 | New encryption modes can be added relatively easily, without changes |
| 361 | to individual filesystems. However, authenticated encryption (AE) |
| 362 | modes are not currently supported because of the difficulty of dealing |
| 363 | with ciphertext expansion. |
| 364 | |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 365 | Contents encryption |
| 366 | ------------------- |
| 367 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 368 | For file contents, each filesystem block is encrypted independently. |
Chandan Rajendra | 196624e | 2019-10-22 20:33:12 -0700 | [diff] [blame] | 369 | Starting from Linux kernel 5.5, encryption of filesystems with block |
| 370 | size less than system's page size is supported. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 371 | |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 372 | Each block's IV is set to the logical block number within the file as |
| 373 | a little endian number, except that: |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 374 | |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 375 | - With CBC mode encryption, ESSIV is also used. Specifically, each IV |
| 376 | is encrypted with AES-256 where the AES-256 key is the SHA-256 hash |
| 377 | of the file's data encryption key. |
| 378 | |
Eric Biggers | b103fb7 | 2019-10-24 14:54:36 -0700 | [diff] [blame] | 379 | - With `DIRECT_KEY policies`_, the file's nonce is appended to the IV. |
| 380 | Currently this is only allowed with the Adiantum encryption mode. |
| 381 | |
| 382 | - With `IV_INO_LBLK_64 policies`_, the logical block number is limited |
| 383 | to 32 bits and is placed in bits 0-31 of the IV. The inode number |
| 384 | (which is also limited to 32 bits) is placed in bits 32-63. |
| 385 | |
Eric Biggers | e3b1078 | 2020-05-15 13:41:41 -0700 | [diff] [blame] | 386 | - With `IV_INO_LBLK_32 policies`_, the logical block number is limited |
| 387 | to 32 bits and is placed in bits 0-31 of the IV. The inode number |
| 388 | is then hashed and added mod 2^32. |
| 389 | |
Eric Biggers | b103fb7 | 2019-10-24 14:54:36 -0700 | [diff] [blame] | 390 | Note that because file logical block numbers are included in the IVs, |
| 391 | filesystems must enforce that blocks are never shifted around within |
| 392 | encrypted files, e.g. via "collapse range" or "insert range". |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 393 | |
| 394 | Filenames encryption |
| 395 | -------------------- |
| 396 | |
| 397 | For filenames, each full filename is encrypted at once. Because of |
| 398 | the requirements to retain support for efficient directory lookups and |
| 399 | filenames of up to 255 bytes, the same IV is used for every filename |
| 400 | in a directory. |
| 401 | |
Eric Biggers | b103fb7 | 2019-10-24 14:54:36 -0700 | [diff] [blame] | 402 | However, each encrypted directory still uses a unique key, or |
| 403 | alternatively has the file's nonce (for `DIRECT_KEY policies`_) or |
| 404 | inode number (for `IV_INO_LBLK_64 policies`_) included in the IVs. |
| 405 | Thus, IV reuse is limited to within a single directory. |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 406 | |
| 407 | With CTS-CBC, the IV reuse means that when the plaintext filenames |
| 408 | share a common prefix at least as long as the cipher block size (16 |
| 409 | bytes for AES), the corresponding encrypted filenames will also share |
| 410 | a common prefix. This is undesirable. Adiantum does not have this |
| 411 | weakness, as it is a wide-block encryption mode. |
| 412 | |
| 413 | All supported filenames encryption modes accept any plaintext length |
| 414 | >= 16 bytes; cipher block alignment is not required. However, |
| 415 | filenames shorter than 16 bytes are NUL-padded to 16 bytes before |
| 416 | being encrypted. In addition, to reduce leakage of filename lengths |
| 417 | via their ciphertexts, all filenames are NUL-padded to the next 4, 8, |
| 418 | 16, or 32-byte boundary (configurable). 32 is recommended since this |
| 419 | provides the best confidentiality, at the cost of making directory |
| 420 | entries consume slightly more space. Note that since NUL (``\0``) is |
| 421 | not otherwise a valid character in filenames, the padding will never |
| 422 | produce duplicate plaintexts. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 423 | |
| 424 | Symbolic link targets are considered a type of filename and are |
Eric Biggers | 8094c3c | 2019-01-06 08:36:21 -0500 | [diff] [blame] | 425 | encrypted in the same way as filenames in directory entries, except |
| 426 | that IV reuse is not a problem as each symlink has its own inode. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 427 | |
| 428 | User API |
| 429 | ======== |
| 430 | |
| 431 | Setting an encryption policy |
| 432 | ---------------------------- |
| 433 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 434 | FS_IOC_SET_ENCRYPTION_POLICY |
| 435 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 436 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 437 | The FS_IOC_SET_ENCRYPTION_POLICY ioctl sets an encryption policy on an |
| 438 | empty directory or verifies that a directory or regular file already |
| 439 | has the specified encryption policy. It takes in a pointer to a |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 440 | :c:type:`struct fscrypt_policy_v1` or a :c:type:`struct |
| 441 | fscrypt_policy_v2`, defined as follows:: |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 442 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 443 | #define FSCRYPT_POLICY_V1 0 |
| 444 | #define FSCRYPT_KEY_DESCRIPTOR_SIZE 8 |
| 445 | struct fscrypt_policy_v1 { |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 446 | __u8 version; |
| 447 | __u8 contents_encryption_mode; |
| 448 | __u8 filenames_encryption_mode; |
| 449 | __u8 flags; |
Eric Biggers | 2336d0d | 2019-08-04 19:35:44 -0700 | [diff] [blame] | 450 | __u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE]; |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 451 | }; |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 452 | #define fscrypt_policy fscrypt_policy_v1 |
| 453 | |
| 454 | #define FSCRYPT_POLICY_V2 2 |
| 455 | #define FSCRYPT_KEY_IDENTIFIER_SIZE 16 |
| 456 | struct fscrypt_policy_v2 { |
| 457 | __u8 version; |
| 458 | __u8 contents_encryption_mode; |
| 459 | __u8 filenames_encryption_mode; |
| 460 | __u8 flags; |
| 461 | __u8 __reserved[4]; |
| 462 | __u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]; |
| 463 | }; |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 464 | |
| 465 | This structure must be initialized as follows: |
| 466 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 467 | - ``version`` must be FSCRYPT_POLICY_V1 (0) if the struct is |
| 468 | :c:type:`fscrypt_policy_v1` or FSCRYPT_POLICY_V2 (2) if the struct |
| 469 | is :c:type:`fscrypt_policy_v2`. (Note: we refer to the original |
| 470 | policy version as "v1", though its version code is really 0.) For |
| 471 | new encrypted directories, use v2 policies. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 472 | |
| 473 | - ``contents_encryption_mode`` and ``filenames_encryption_mode`` must |
Eric Biggers | 2336d0d | 2019-08-04 19:35:44 -0700 | [diff] [blame] | 474 | be set to constants from ``<linux/fscrypt.h>`` which identify the |
| 475 | encryption modes to use. If unsure, use FSCRYPT_MODE_AES_256_XTS |
| 476 | (1) for ``contents_encryption_mode`` and FSCRYPT_MODE_AES_256_CTS |
| 477 | (4) for ``filenames_encryption_mode``. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 478 | |
Eric Biggers | b103fb7 | 2019-10-24 14:54:36 -0700 | [diff] [blame] | 479 | - ``flags`` contains optional flags from ``<linux/fscrypt.h>``: |
| 480 | |
| 481 | - FSCRYPT_POLICY_FLAGS_PAD_*: The amount of NUL padding to use when |
| 482 | encrypting filenames. If unsure, use FSCRYPT_POLICY_FLAGS_PAD_32 |
| 483 | (0x3). |
| 484 | - FSCRYPT_POLICY_FLAG_DIRECT_KEY: See `DIRECT_KEY policies`_. |
| 485 | - FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64: See `IV_INO_LBLK_64 |
Eric Biggers | e3b1078 | 2020-05-15 13:41:41 -0700 | [diff] [blame] | 486 | policies`_. |
| 487 | - FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32: See `IV_INO_LBLK_32 |
| 488 | policies`_. |
| 489 | |
| 490 | v1 encryption policies only support the PAD_* and DIRECT_KEY flags. |
| 491 | The other flags are only supported by v2 encryption policies. |
| 492 | |
| 493 | The DIRECT_KEY, IV_INO_LBLK_64, and IV_INO_LBLK_32 flags are |
| 494 | mutually exclusive. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 495 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 496 | - For v2 encryption policies, ``__reserved`` must be zeroed. |
| 497 | |
| 498 | - For v1 encryption policies, ``master_key_descriptor`` specifies how |
| 499 | to find the master key in a keyring; see `Adding keys`_. It is up |
| 500 | to userspace to choose a unique ``master_key_descriptor`` for each |
| 501 | master key. The e4crypt and fscrypt tools use the first 8 bytes of |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 502 | ``SHA-512(SHA-512(master_key))``, but this particular scheme is not |
| 503 | required. Also, the master key need not be in the keyring yet when |
| 504 | FS_IOC_SET_ENCRYPTION_POLICY is executed. However, it must be added |
| 505 | before any files can be created in the encrypted directory. |
| 506 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 507 | For v2 encryption policies, ``master_key_descriptor`` has been |
| 508 | replaced with ``master_key_identifier``, which is longer and cannot |
| 509 | be arbitrarily chosen. Instead, the key must first be added using |
| 510 | `FS_IOC_ADD_ENCRYPTION_KEY`_. Then, the ``key_spec.u.identifier`` |
| 511 | the kernel returned in the :c:type:`struct fscrypt_add_key_arg` must |
| 512 | be used as the ``master_key_identifier`` in the :c:type:`struct |
| 513 | fscrypt_policy_v2`. |
| 514 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 515 | If the file is not yet encrypted, then FS_IOC_SET_ENCRYPTION_POLICY |
| 516 | verifies that the file is an empty directory. If so, the specified |
| 517 | encryption policy is assigned to the directory, turning it into an |
| 518 | encrypted directory. After that, and after providing the |
| 519 | corresponding master key as described in `Adding keys`_, all regular |
| 520 | files, directories (recursively), and symlinks created in the |
| 521 | directory will be encrypted, inheriting the same encryption policy. |
| 522 | The filenames in the directory's entries will be encrypted as well. |
| 523 | |
| 524 | Alternatively, if the file is already encrypted, then |
| 525 | FS_IOC_SET_ENCRYPTION_POLICY validates that the specified encryption |
| 526 | policy exactly matches the actual one. If they match, then the ioctl |
| 527 | returns 0. Otherwise, it fails with EEXIST. This works on both |
| 528 | regular files and directories, including nonempty directories. |
| 529 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 530 | When a v2 encryption policy is assigned to a directory, it is also |
| 531 | required that either the specified key has been added by the current |
| 532 | user or that the caller has CAP_FOWNER in the initial user namespace. |
| 533 | (This is needed to prevent a user from encrypting their data with |
| 534 | another user's key.) The key must remain added while |
| 535 | FS_IOC_SET_ENCRYPTION_POLICY is executing. However, if the new |
| 536 | encrypted directory does not need to be accessed immediately, then the |
| 537 | key can be removed right away afterwards. |
| 538 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 539 | Note that the ext4 filesystem does not allow the root directory to be |
| 540 | encrypted, even if it is empty. Users who want to encrypt an entire |
| 541 | filesystem with one key should consider using dm-crypt instead. |
| 542 | |
| 543 | FS_IOC_SET_ENCRYPTION_POLICY can fail with the following errors: |
| 544 | |
| 545 | - ``EACCES``: the file is not owned by the process's uid, nor does the |
| 546 | process have the CAP_FOWNER capability in a namespace with the file |
| 547 | owner's uid mapped |
| 548 | - ``EEXIST``: the file is already encrypted with an encryption policy |
| 549 | different from the one specified |
| 550 | - ``EINVAL``: an invalid encryption policy was specified (invalid |
Daniel Rosenberg | 6e1918c | 2020-01-20 14:31:56 -0800 | [diff] [blame] | 551 | version, mode(s), or flags; or reserved bits were set); or a v1 |
| 552 | encryption policy was specified but the directory has the casefold |
| 553 | flag enabled (casefolding is incompatible with v1 policies). |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 554 | - ``ENOKEY``: a v2 encryption policy was specified, but the key with |
| 555 | the specified ``master_key_identifier`` has not been added, nor does |
| 556 | the process have the CAP_FOWNER capability in the initial user |
| 557 | namespace |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 558 | - ``ENOTDIR``: the file is unencrypted and is a regular file, not a |
| 559 | directory |
| 560 | - ``ENOTEMPTY``: the file is unencrypted and is a nonempty directory |
| 561 | - ``ENOTTY``: this type of filesystem does not implement encryption |
| 562 | - ``EOPNOTSUPP``: the kernel was not configured with encryption |
Chandan Rajendra | 643fa96 | 2018-12-12 15:20:12 +0530 | [diff] [blame] | 563 | support for filesystems, or the filesystem superblock has not |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 564 | had encryption enabled on it. (For example, to use encryption on an |
Chandan Rajendra | 643fa96 | 2018-12-12 15:20:12 +0530 | [diff] [blame] | 565 | ext4 filesystem, CONFIG_FS_ENCRYPTION must be enabled in the |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 566 | kernel config, and the superblock must have had the "encrypt" |
| 567 | feature flag enabled using ``tune2fs -O encrypt`` or ``mkfs.ext4 -O |
| 568 | encrypt``.) |
| 569 | - ``EPERM``: this directory may not be encrypted, e.g. because it is |
| 570 | the root directory of an ext4 filesystem |
| 571 | - ``EROFS``: the filesystem is readonly |
| 572 | |
| 573 | Getting an encryption policy |
| 574 | ---------------------------- |
| 575 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 576 | Two ioctls are available to get a file's encryption policy: |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 577 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 578 | - `FS_IOC_GET_ENCRYPTION_POLICY_EX`_ |
| 579 | - `FS_IOC_GET_ENCRYPTION_POLICY`_ |
| 580 | |
| 581 | The extended (_EX) version of the ioctl is more general and is |
| 582 | recommended to use when possible. However, on older kernels only the |
| 583 | original ioctl is available. Applications should try the extended |
| 584 | version, and if it fails with ENOTTY fall back to the original |
| 585 | version. |
| 586 | |
| 587 | FS_IOC_GET_ENCRYPTION_POLICY_EX |
| 588 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 589 | |
| 590 | The FS_IOC_GET_ENCRYPTION_POLICY_EX ioctl retrieves the encryption |
| 591 | policy, if any, for a directory or regular file. No additional |
| 592 | permissions are required beyond the ability to open the file. It |
| 593 | takes in a pointer to a :c:type:`struct fscrypt_get_policy_ex_arg`, |
| 594 | defined as follows:: |
| 595 | |
| 596 | struct fscrypt_get_policy_ex_arg { |
| 597 | __u64 policy_size; /* input/output */ |
| 598 | union { |
| 599 | __u8 version; |
| 600 | struct fscrypt_policy_v1 v1; |
| 601 | struct fscrypt_policy_v2 v2; |
| 602 | } policy; /* output */ |
| 603 | }; |
| 604 | |
| 605 | The caller must initialize ``policy_size`` to the size available for |
| 606 | the policy struct, i.e. ``sizeof(arg.policy)``. |
| 607 | |
| 608 | On success, the policy struct is returned in ``policy``, and its |
| 609 | actual size is returned in ``policy_size``. ``policy.version`` should |
| 610 | be checked to determine the version of policy returned. Note that the |
| 611 | version code for the "v1" policy is actually 0 (FSCRYPT_POLICY_V1). |
| 612 | |
| 613 | FS_IOC_GET_ENCRYPTION_POLICY_EX can fail with the following errors: |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 614 | |
| 615 | - ``EINVAL``: the file is encrypted, but it uses an unrecognized |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 616 | encryption policy version |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 617 | - ``ENODATA``: the file is not encrypted |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 618 | - ``ENOTTY``: this type of filesystem does not implement encryption, |
| 619 | or this kernel is too old to support FS_IOC_GET_ENCRYPTION_POLICY_EX |
| 620 | (try FS_IOC_GET_ENCRYPTION_POLICY instead) |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 621 | - ``EOPNOTSUPP``: the kernel was not configured with encryption |
Chao Yu | 0642ea2 | 2019-08-04 17:56:43 +0800 | [diff] [blame] | 622 | support for this filesystem, or the filesystem superblock has not |
| 623 | had encryption enabled on it |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 624 | - ``EOVERFLOW``: the file is encrypted and uses a recognized |
| 625 | encryption policy version, but the policy struct does not fit into |
| 626 | the provided buffer |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 627 | |
| 628 | Note: if you only need to know whether a file is encrypted or not, on |
| 629 | most filesystems it is also possible to use the FS_IOC_GETFLAGS ioctl |
| 630 | and check for FS_ENCRYPT_FL, or to use the statx() system call and |
| 631 | check for STATX_ATTR_ENCRYPTED in stx_attributes. |
| 632 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 633 | FS_IOC_GET_ENCRYPTION_POLICY |
| 634 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 635 | |
| 636 | The FS_IOC_GET_ENCRYPTION_POLICY ioctl can also retrieve the |
| 637 | encryption policy, if any, for a directory or regular file. However, |
| 638 | unlike `FS_IOC_GET_ENCRYPTION_POLICY_EX`_, |
| 639 | FS_IOC_GET_ENCRYPTION_POLICY only supports the original policy |
| 640 | version. It takes in a pointer directly to a :c:type:`struct |
| 641 | fscrypt_policy_v1` rather than a :c:type:`struct |
| 642 | fscrypt_get_policy_ex_arg`. |
| 643 | |
| 644 | The error codes for FS_IOC_GET_ENCRYPTION_POLICY are the same as those |
| 645 | for FS_IOC_GET_ENCRYPTION_POLICY_EX, except that |
| 646 | FS_IOC_GET_ENCRYPTION_POLICY also returns ``EINVAL`` if the file is |
| 647 | encrypted using a newer encryption policy version. |
| 648 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 649 | Getting the per-filesystem salt |
| 650 | ------------------------------- |
| 651 | |
| 652 | Some filesystems, such as ext4 and F2FS, also support the deprecated |
| 653 | ioctl FS_IOC_GET_ENCRYPTION_PWSALT. This ioctl retrieves a randomly |
| 654 | generated 16-byte value stored in the filesystem superblock. This |
| 655 | value is intended to used as a salt when deriving an encryption key |
| 656 | from a passphrase or other low-entropy user credential. |
| 657 | |
| 658 | FS_IOC_GET_ENCRYPTION_PWSALT is deprecated. Instead, prefer to |
| 659 | generate and manage any needed salt(s) in userspace. |
| 660 | |
Eric Biggers | e98ad46 | 2020-03-14 13:50:49 -0700 | [diff] [blame] | 661 | Getting a file's encryption nonce |
| 662 | --------------------------------- |
| 663 | |
| 664 | Since Linux v5.7, the ioctl FS_IOC_GET_ENCRYPTION_NONCE is supported. |
| 665 | On encrypted files and directories it gets the inode's 16-byte nonce. |
| 666 | On unencrypted files and directories, it fails with ENODATA. |
| 667 | |
| 668 | This ioctl can be useful for automated tests which verify that the |
| 669 | encryption is being done correctly. It is not needed for normal use |
| 670 | of fscrypt. |
| 671 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 672 | Adding keys |
| 673 | ----------- |
| 674 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 675 | FS_IOC_ADD_ENCRYPTION_KEY |
| 676 | ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 677 | |
| 678 | The FS_IOC_ADD_ENCRYPTION_KEY ioctl adds a master encryption key to |
| 679 | the filesystem, making all files on the filesystem which were |
| 680 | encrypted using that key appear "unlocked", i.e. in plaintext form. |
| 681 | It can be executed on any file or directory on the target filesystem, |
| 682 | but using the filesystem's root directory is recommended. It takes in |
| 683 | a pointer to a :c:type:`struct fscrypt_add_key_arg`, defined as |
| 684 | follows:: |
| 685 | |
| 686 | struct fscrypt_add_key_arg { |
| 687 | struct fscrypt_key_specifier key_spec; |
| 688 | __u32 raw_size; |
Eric Biggers | 93edd39 | 2019-11-19 14:24:47 -0800 | [diff] [blame] | 689 | __u32 key_id; |
| 690 | __u32 __reserved[8]; |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 691 | __u8 raw[]; |
| 692 | }; |
| 693 | |
| 694 | #define FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR 1 |
| 695 | #define FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER 2 |
| 696 | |
| 697 | struct fscrypt_key_specifier { |
| 698 | __u32 type; /* one of FSCRYPT_KEY_SPEC_TYPE_* */ |
| 699 | __u32 __reserved; |
| 700 | union { |
| 701 | __u8 __reserved[32]; /* reserve some extra space */ |
| 702 | __u8 descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE]; |
| 703 | __u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]; |
| 704 | } u; |
| 705 | }; |
| 706 | |
Eric Biggers | 93edd39 | 2019-11-19 14:24:47 -0800 | [diff] [blame] | 707 | struct fscrypt_provisioning_key_payload { |
| 708 | __u32 type; |
| 709 | __u32 __reserved; |
| 710 | __u8 raw[]; |
| 711 | }; |
| 712 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 713 | :c:type:`struct fscrypt_add_key_arg` must be zeroed, then initialized |
| 714 | as follows: |
| 715 | |
| 716 | - If the key is being added for use by v1 encryption policies, then |
| 717 | ``key_spec.type`` must contain FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR, and |
| 718 | ``key_spec.u.descriptor`` must contain the descriptor of the key |
| 719 | being added, corresponding to the value in the |
| 720 | ``master_key_descriptor`` field of :c:type:`struct |
| 721 | fscrypt_policy_v1`. To add this type of key, the calling process |
| 722 | must have the CAP_SYS_ADMIN capability in the initial user |
| 723 | namespace. |
| 724 | |
| 725 | Alternatively, if the key is being added for use by v2 encryption |
| 726 | policies, then ``key_spec.type`` must contain |
| 727 | FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER, and ``key_spec.u.identifier`` is |
| 728 | an *output* field which the kernel fills in with a cryptographic |
| 729 | hash of the key. To add this type of key, the calling process does |
| 730 | not need any privileges. However, the number of keys that can be |
| 731 | added is limited by the user's quota for the keyrings service (see |
| 732 | ``Documentation/security/keys/core.rst``). |
| 733 | |
| 734 | - ``raw_size`` must be the size of the ``raw`` key provided, in bytes. |
Eric Biggers | 93edd39 | 2019-11-19 14:24:47 -0800 | [diff] [blame] | 735 | Alternatively, if ``key_id`` is nonzero, this field must be 0, since |
| 736 | in that case the size is implied by the specified Linux keyring key. |
| 737 | |
| 738 | - ``key_id`` is 0 if the raw key is given directly in the ``raw`` |
| 739 | field. Otherwise ``key_id`` is the ID of a Linux keyring key of |
| 740 | type "fscrypt-provisioning" whose payload is a :c:type:`struct |
| 741 | fscrypt_provisioning_key_payload` whose ``raw`` field contains the |
| 742 | raw key and whose ``type`` field matches ``key_spec.type``. Since |
| 743 | ``raw`` is variable-length, the total size of this key's payload |
| 744 | must be ``sizeof(struct fscrypt_provisioning_key_payload)`` plus the |
| 745 | raw key size. The process must have Search permission on this key. |
| 746 | |
| 747 | Most users should leave this 0 and specify the raw key directly. |
| 748 | The support for specifying a Linux keyring key is intended mainly to |
| 749 | allow re-adding keys after a filesystem is unmounted and re-mounted, |
| 750 | without having to store the raw keys in userspace memory. |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 751 | |
| 752 | - ``raw`` is a variable-length field which must contain the actual |
Eric Biggers | 93edd39 | 2019-11-19 14:24:47 -0800 | [diff] [blame] | 753 | key, ``raw_size`` bytes long. Alternatively, if ``key_id`` is |
| 754 | nonzero, then this field is unused. |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 755 | |
| 756 | For v2 policy keys, the kernel keeps track of which user (identified |
| 757 | by effective user ID) added the key, and only allows the key to be |
| 758 | removed by that user --- or by "root", if they use |
| 759 | `FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS`_. |
| 760 | |
| 761 | However, if another user has added the key, it may be desirable to |
| 762 | prevent that other user from unexpectedly removing it. Therefore, |
| 763 | FS_IOC_ADD_ENCRYPTION_KEY may also be used to add a v2 policy key |
| 764 | *again*, even if it's already added by other user(s). In this case, |
| 765 | FS_IOC_ADD_ENCRYPTION_KEY will just install a claim to the key for the |
| 766 | current user, rather than actually add the key again (but the raw key |
| 767 | must still be provided, as a proof of knowledge). |
| 768 | |
| 769 | FS_IOC_ADD_ENCRYPTION_KEY returns 0 if either the key or a claim to |
| 770 | the key was either added or already exists. |
| 771 | |
| 772 | FS_IOC_ADD_ENCRYPTION_KEY can fail with the following errors: |
| 773 | |
| 774 | - ``EACCES``: FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR was specified, but the |
| 775 | caller does not have the CAP_SYS_ADMIN capability in the initial |
Eric Biggers | 93edd39 | 2019-11-19 14:24:47 -0800 | [diff] [blame] | 776 | user namespace; or the raw key was specified by Linux key ID but the |
| 777 | process lacks Search permission on the key. |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 778 | - ``EDQUOT``: the key quota for this user would be exceeded by adding |
| 779 | the key |
| 780 | - ``EINVAL``: invalid key size or key specifier type, or reserved bits |
| 781 | were set |
Eric Biggers | 93edd39 | 2019-11-19 14:24:47 -0800 | [diff] [blame] | 782 | - ``EKEYREJECTED``: the raw key was specified by Linux key ID, but the |
| 783 | key has the wrong type |
| 784 | - ``ENOKEY``: the raw key was specified by Linux key ID, but no key |
| 785 | exists with that ID |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 786 | - ``ENOTTY``: this type of filesystem does not implement encryption |
| 787 | - ``EOPNOTSUPP``: the kernel was not configured with encryption |
| 788 | support for this filesystem, or the filesystem superblock has not |
| 789 | had encryption enabled on it |
| 790 | |
| 791 | Legacy method |
| 792 | ~~~~~~~~~~~~~ |
| 793 | |
| 794 | For v1 encryption policies, a master encryption key can also be |
| 795 | provided by adding it to a process-subscribed keyring, e.g. to a |
| 796 | session keyring, or to a user keyring if the user keyring is linked |
| 797 | into the session keyring. |
| 798 | |
| 799 | This method is deprecated (and not supported for v2 encryption |
| 800 | policies) for several reasons. First, it cannot be used in |
| 801 | combination with FS_IOC_REMOVE_ENCRYPTION_KEY (see `Removing keys`_), |
| 802 | so for removing a key a workaround such as keyctl_unlink() in |
| 803 | combination with ``sync; echo 2 > /proc/sys/vm/drop_caches`` would |
| 804 | have to be used. Second, it doesn't match the fact that the |
| 805 | locked/unlocked status of encrypted files (i.e. whether they appear to |
| 806 | be in plaintext form or in ciphertext form) is global. This mismatch |
| 807 | has caused much confusion as well as real problems when processes |
| 808 | running under different UIDs, such as a ``sudo`` command, need to |
| 809 | access encrypted files. |
| 810 | |
| 811 | Nevertheless, to add a key to one of the process-subscribed keyrings, |
| 812 | the add_key() system call can be used (see: |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 813 | ``Documentation/security/keys/core.rst``). The key type must be |
| 814 | "logon"; keys of this type are kept in kernel memory and cannot be |
| 815 | read back by userspace. The key description must be "fscrypt:" |
| 816 | followed by the 16-character lower case hex representation of the |
| 817 | ``master_key_descriptor`` that was set in the encryption policy. The |
| 818 | key payload must conform to the following structure:: |
| 819 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 820 | #define FSCRYPT_MAX_KEY_SIZE 64 |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 821 | |
| 822 | struct fscrypt_key { |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 823 | __u32 mode; |
| 824 | __u8 raw[FSCRYPT_MAX_KEY_SIZE]; |
| 825 | __u32 size; |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 826 | }; |
| 827 | |
| 828 | ``mode`` is ignored; just set it to 0. The actual key is provided in |
| 829 | ``raw`` with ``size`` indicating its size in bytes. That is, the |
| 830 | bytes ``raw[0..size-1]`` (inclusive) are the actual key. |
| 831 | |
| 832 | The key description prefix "fscrypt:" may alternatively be replaced |
| 833 | with a filesystem-specific prefix such as "ext4:". However, the |
| 834 | filesystem-specific prefixes are deprecated and should not be used in |
| 835 | new programs. |
| 836 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 837 | Removing keys |
| 838 | ------------- |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 839 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 840 | Two ioctls are available for removing a key that was added by |
| 841 | `FS_IOC_ADD_ENCRYPTION_KEY`_: |
| 842 | |
| 843 | - `FS_IOC_REMOVE_ENCRYPTION_KEY`_ |
| 844 | - `FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS`_ |
| 845 | |
| 846 | These two ioctls differ only in cases where v2 policy keys are added |
| 847 | or removed by non-root users. |
| 848 | |
| 849 | These ioctls don't work on keys that were added via the legacy |
| 850 | process-subscribed keyrings mechanism. |
| 851 | |
| 852 | Before using these ioctls, read the `Kernel memory compromise`_ |
| 853 | section for a discussion of the security goals and limitations of |
| 854 | these ioctls. |
| 855 | |
| 856 | FS_IOC_REMOVE_ENCRYPTION_KEY |
| 857 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 858 | |
| 859 | The FS_IOC_REMOVE_ENCRYPTION_KEY ioctl removes a claim to a master |
| 860 | encryption key from the filesystem, and possibly removes the key |
| 861 | itself. It can be executed on any file or directory on the target |
| 862 | filesystem, but using the filesystem's root directory is recommended. |
| 863 | It takes in a pointer to a :c:type:`struct fscrypt_remove_key_arg`, |
| 864 | defined as follows:: |
| 865 | |
| 866 | struct fscrypt_remove_key_arg { |
| 867 | struct fscrypt_key_specifier key_spec; |
| 868 | #define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY 0x00000001 |
| 869 | #define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS 0x00000002 |
| 870 | __u32 removal_status_flags; /* output */ |
| 871 | __u32 __reserved[5]; |
| 872 | }; |
| 873 | |
| 874 | This structure must be zeroed, then initialized as follows: |
| 875 | |
| 876 | - The key to remove is specified by ``key_spec``: |
| 877 | |
| 878 | - To remove a key used by v1 encryption policies, set |
| 879 | ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR and fill |
| 880 | in ``key_spec.u.descriptor``. To remove this type of key, the |
| 881 | calling process must have the CAP_SYS_ADMIN capability in the |
| 882 | initial user namespace. |
| 883 | |
| 884 | - To remove a key used by v2 encryption policies, set |
| 885 | ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER and fill |
| 886 | in ``key_spec.u.identifier``. |
| 887 | |
| 888 | For v2 policy keys, this ioctl is usable by non-root users. However, |
| 889 | to make this possible, it actually just removes the current user's |
| 890 | claim to the key, undoing a single call to FS_IOC_ADD_ENCRYPTION_KEY. |
| 891 | Only after all claims are removed is the key really removed. |
| 892 | |
| 893 | For example, if FS_IOC_ADD_ENCRYPTION_KEY was called with uid 1000, |
| 894 | then the key will be "claimed" by uid 1000, and |
| 895 | FS_IOC_REMOVE_ENCRYPTION_KEY will only succeed as uid 1000. Or, if |
| 896 | both uids 1000 and 2000 added the key, then for each uid |
| 897 | FS_IOC_REMOVE_ENCRYPTION_KEY will only remove their own claim. Only |
| 898 | once *both* are removed is the key really removed. (Think of it like |
| 899 | unlinking a file that may have hard links.) |
| 900 | |
| 901 | If FS_IOC_REMOVE_ENCRYPTION_KEY really removes the key, it will also |
| 902 | try to "lock" all files that had been unlocked with the key. It won't |
| 903 | lock files that are still in-use, so this ioctl is expected to be used |
| 904 | in cooperation with userspace ensuring that none of the files are |
| 905 | still open. However, if necessary, this ioctl can be executed again |
| 906 | later to retry locking any remaining files. |
| 907 | |
| 908 | FS_IOC_REMOVE_ENCRYPTION_KEY returns 0 if either the key was removed |
| 909 | (but may still have files remaining to be locked), the user's claim to |
| 910 | the key was removed, or the key was already removed but had files |
| 911 | remaining to be the locked so the ioctl retried locking them. In any |
| 912 | of these cases, ``removal_status_flags`` is filled in with the |
| 913 | following informational status flags: |
| 914 | |
| 915 | - ``FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY``: set if some file(s) |
| 916 | are still in-use. Not guaranteed to be set in the case where only |
| 917 | the user's claim to the key was removed. |
| 918 | - ``FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS``: set if only the |
| 919 | user's claim to the key was removed, not the key itself |
| 920 | |
| 921 | FS_IOC_REMOVE_ENCRYPTION_KEY can fail with the following errors: |
| 922 | |
| 923 | - ``EACCES``: The FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR key specifier type |
| 924 | was specified, but the caller does not have the CAP_SYS_ADMIN |
| 925 | capability in the initial user namespace |
| 926 | - ``EINVAL``: invalid key specifier type, or reserved bits were set |
| 927 | - ``ENOKEY``: the key object was not found at all, i.e. it was never |
| 928 | added in the first place or was already fully removed including all |
| 929 | files locked; or, the user does not have a claim to the key (but |
| 930 | someone else does). |
| 931 | - ``ENOTTY``: this type of filesystem does not implement encryption |
| 932 | - ``EOPNOTSUPP``: the kernel was not configured with encryption |
| 933 | support for this filesystem, or the filesystem superblock has not |
| 934 | had encryption enabled on it |
| 935 | |
| 936 | FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS |
| 937 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 938 | |
| 939 | FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS is exactly the same as |
| 940 | `FS_IOC_REMOVE_ENCRYPTION_KEY`_, except that for v2 policy keys, the |
| 941 | ALL_USERS version of the ioctl will remove all users' claims to the |
| 942 | key, not just the current user's. I.e., the key itself will always be |
| 943 | removed, no matter how many users have added it. This difference is |
| 944 | only meaningful if non-root users are adding and removing keys. |
| 945 | |
| 946 | Because of this, FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS also requires |
| 947 | "root", namely the CAP_SYS_ADMIN capability in the initial user |
| 948 | namespace. Otherwise it will fail with EACCES. |
| 949 | |
| 950 | Getting key status |
| 951 | ------------------ |
| 952 | |
| 953 | FS_IOC_GET_ENCRYPTION_KEY_STATUS |
| 954 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 955 | |
| 956 | The FS_IOC_GET_ENCRYPTION_KEY_STATUS ioctl retrieves the status of a |
| 957 | master encryption key. It can be executed on any file or directory on |
| 958 | the target filesystem, but using the filesystem's root directory is |
| 959 | recommended. It takes in a pointer to a :c:type:`struct |
| 960 | fscrypt_get_key_status_arg`, defined as follows:: |
| 961 | |
| 962 | struct fscrypt_get_key_status_arg { |
| 963 | /* input */ |
| 964 | struct fscrypt_key_specifier key_spec; |
| 965 | __u32 __reserved[6]; |
| 966 | |
| 967 | /* output */ |
| 968 | #define FSCRYPT_KEY_STATUS_ABSENT 1 |
| 969 | #define FSCRYPT_KEY_STATUS_PRESENT 2 |
| 970 | #define FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED 3 |
| 971 | __u32 status; |
| 972 | #define FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF 0x00000001 |
| 973 | __u32 status_flags; |
| 974 | __u32 user_count; |
| 975 | __u32 __out_reserved[13]; |
| 976 | }; |
| 977 | |
| 978 | The caller must zero all input fields, then fill in ``key_spec``: |
| 979 | |
| 980 | - To get the status of a key for v1 encryption policies, set |
| 981 | ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR and fill |
| 982 | in ``key_spec.u.descriptor``. |
| 983 | |
| 984 | - To get the status of a key for v2 encryption policies, set |
| 985 | ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER and fill |
| 986 | in ``key_spec.u.identifier``. |
| 987 | |
| 988 | On success, 0 is returned and the kernel fills in the output fields: |
| 989 | |
| 990 | - ``status`` indicates whether the key is absent, present, or |
| 991 | incompletely removed. Incompletely removed means that the master |
| 992 | secret has been removed, but some files are still in use; i.e., |
| 993 | `FS_IOC_REMOVE_ENCRYPTION_KEY`_ returned 0 but set the informational |
| 994 | status flag FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY. |
| 995 | |
| 996 | - ``status_flags`` can contain the following flags: |
| 997 | |
| 998 | - ``FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF`` indicates that the key |
| 999 | has added by the current user. This is only set for keys |
| 1000 | identified by ``identifier`` rather than by ``descriptor``. |
| 1001 | |
| 1002 | - ``user_count`` specifies the number of users who have added the key. |
| 1003 | This is only set for keys identified by ``identifier`` rather than |
| 1004 | by ``descriptor``. |
| 1005 | |
| 1006 | FS_IOC_GET_ENCRYPTION_KEY_STATUS can fail with the following errors: |
| 1007 | |
| 1008 | - ``EINVAL``: invalid key specifier type, or reserved bits were set |
| 1009 | - ``ENOTTY``: this type of filesystem does not implement encryption |
| 1010 | - ``EOPNOTSUPP``: the kernel was not configured with encryption |
| 1011 | support for this filesystem, or the filesystem superblock has not |
| 1012 | had encryption enabled on it |
| 1013 | |
| 1014 | Among other use cases, FS_IOC_GET_ENCRYPTION_KEY_STATUS can be useful |
| 1015 | for determining whether the key for a given encrypted directory needs |
| 1016 | to be added before prompting the user for the passphrase needed to |
| 1017 | derive the key. |
| 1018 | |
| 1019 | FS_IOC_GET_ENCRYPTION_KEY_STATUS can only get the status of keys in |
| 1020 | the filesystem-level keyring, i.e. the keyring managed by |
| 1021 | `FS_IOC_ADD_ENCRYPTION_KEY`_ and `FS_IOC_REMOVE_ENCRYPTION_KEY`_. It |
| 1022 | cannot get the status of a key that has only been added for use by v1 |
| 1023 | encryption policies using the legacy mechanism involving |
| 1024 | process-subscribed keyrings. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1025 | |
| 1026 | Access semantics |
| 1027 | ================ |
| 1028 | |
| 1029 | With the key |
| 1030 | ------------ |
| 1031 | |
| 1032 | With the encryption key, encrypted regular files, directories, and |
| 1033 | symlinks behave very similarly to their unencrypted counterparts --- |
| 1034 | after all, the encryption is intended to be transparent. However, |
| 1035 | astute users may notice some differences in behavior: |
| 1036 | |
| 1037 | - Unencrypted files, or files encrypted with a different encryption |
| 1038 | policy (i.e. different key, modes, or flags), cannot be renamed or |
| 1039 | linked into an encrypted directory; see `Encryption policy |
Eric Biggers | f5e55e7 | 2019-01-22 16:20:21 -0800 | [diff] [blame] | 1040 | enforcement`_. Attempts to do so will fail with EXDEV. However, |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1041 | encrypted files can be renamed within an encrypted directory, or |
| 1042 | into an unencrypted directory. |
| 1043 | |
Eric Biggers | f5e55e7 | 2019-01-22 16:20:21 -0800 | [diff] [blame] | 1044 | Note: "moving" an unencrypted file into an encrypted directory, e.g. |
| 1045 | with the `mv` program, is implemented in userspace by a copy |
| 1046 | followed by a delete. Be aware that the original unencrypted data |
| 1047 | may remain recoverable from free space on the disk; prefer to keep |
| 1048 | all files encrypted from the very beginning. The `shred` program |
| 1049 | may be used to overwrite the source files but isn't guaranteed to be |
| 1050 | effective on all filesystems and storage devices. |
| 1051 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1052 | - Direct I/O is not supported on encrypted files. Attempts to use |
| 1053 | direct I/O on such files will fall back to buffered I/O. |
| 1054 | |
Eric Biggers | 457b1e3 | 2019-12-26 09:42:16 -0600 | [diff] [blame] | 1055 | - The fallocate operations FALLOC_FL_COLLAPSE_RANGE and |
| 1056 | FALLOC_FL_INSERT_RANGE are not supported on encrypted files and will |
| 1057 | fail with EOPNOTSUPP. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1058 | |
| 1059 | - Online defragmentation of encrypted files is not supported. The |
| 1060 | EXT4_IOC_MOVE_EXT and F2FS_IOC_MOVE_RANGE ioctls will fail with |
| 1061 | EOPNOTSUPP. |
| 1062 | |
| 1063 | - The ext4 filesystem does not support data journaling with encrypted |
| 1064 | regular files. It will fall back to ordered data mode instead. |
| 1065 | |
| 1066 | - DAX (Direct Access) is not supported on encrypted files. |
| 1067 | |
| 1068 | - The st_size of an encrypted symlink will not necessarily give the |
| 1069 | length of the symlink target as required by POSIX. It will actually |
Eric Biggers | 2f46a2b | 2018-01-11 23:30:09 -0500 | [diff] [blame] | 1070 | give the length of the ciphertext, which will be slightly longer |
| 1071 | than the plaintext due to NUL-padding and an extra 2-byte overhead. |
| 1072 | |
| 1073 | - The maximum length of an encrypted symlink is 2 bytes shorter than |
| 1074 | the maximum length of an unencrypted symlink. For example, on an |
| 1075 | EXT4 filesystem with a 4K block size, unencrypted symlinks can be up |
| 1076 | to 4095 bytes long, while encrypted symlinks can only be up to 4093 |
| 1077 | bytes long (both lengths excluding the terminating null). |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1078 | |
| 1079 | Note that mmap *is* supported. This is possible because the pagecache |
| 1080 | for an encrypted file contains the plaintext, not the ciphertext. |
| 1081 | |
| 1082 | Without the key |
| 1083 | --------------- |
| 1084 | |
| 1085 | Some filesystem operations may be performed on encrypted regular |
| 1086 | files, directories, and symlinks even before their encryption key has |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 1087 | been added, or after their encryption key has been removed: |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1088 | |
| 1089 | - File metadata may be read, e.g. using stat(). |
| 1090 | |
| 1091 | - Directories may be listed, in which case the filenames will be |
| 1092 | listed in an encoded form derived from their ciphertext. The |
| 1093 | current encoding algorithm is described in `Filename hashing and |
| 1094 | encoding`_. The algorithm is subject to change, but it is |
| 1095 | guaranteed that the presented filenames will be no longer than |
| 1096 | NAME_MAX bytes, will not contain the ``/`` or ``\0`` characters, and |
| 1097 | will uniquely identify directory entries. |
| 1098 | |
| 1099 | The ``.`` and ``..`` directory entries are special. They are always |
| 1100 | present and are not encrypted or encoded. |
| 1101 | |
| 1102 | - Files may be deleted. That is, nondirectory files may be deleted |
| 1103 | with unlink() as usual, and empty directories may be deleted with |
| 1104 | rmdir() as usual. Therefore, ``rm`` and ``rm -r`` will work as |
| 1105 | expected. |
| 1106 | |
| 1107 | - Symlink targets may be read and followed, but they will be presented |
| 1108 | in encrypted form, similar to filenames in directories. Hence, they |
| 1109 | are unlikely to point to anywhere useful. |
| 1110 | |
| 1111 | Without the key, regular files cannot be opened or truncated. |
| 1112 | Attempts to do so will fail with ENOKEY. This implies that any |
| 1113 | regular file operations that require a file descriptor, such as |
| 1114 | read(), write(), mmap(), fallocate(), and ioctl(), are also forbidden. |
| 1115 | |
| 1116 | Also without the key, files of any type (including directories) cannot |
| 1117 | be created or linked into an encrypted directory, nor can a name in an |
| 1118 | encrypted directory be the source or target of a rename, nor can an |
| 1119 | O_TMPFILE temporary file be created in an encrypted directory. All |
| 1120 | such operations will fail with ENOKEY. |
| 1121 | |
| 1122 | It is not currently possible to backup and restore encrypted files |
| 1123 | without the encryption key. This would require special APIs which |
| 1124 | have not yet been implemented. |
| 1125 | |
| 1126 | Encryption policy enforcement |
| 1127 | ============================= |
| 1128 | |
| 1129 | After an encryption policy has been set on a directory, all regular |
| 1130 | files, directories, and symbolic links created in that directory |
| 1131 | (recursively) will inherit that encryption policy. Special files --- |
| 1132 | that is, named pipes, device nodes, and UNIX domain sockets --- will |
| 1133 | not be encrypted. |
| 1134 | |
| 1135 | Except for those special files, it is forbidden to have unencrypted |
| 1136 | files, or files encrypted with a different encryption policy, in an |
| 1137 | encrypted directory tree. Attempts to link or rename such a file into |
Eric Biggers | f5e55e7 | 2019-01-22 16:20:21 -0800 | [diff] [blame] | 1138 | an encrypted directory will fail with EXDEV. This is also enforced |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1139 | during ->lookup() to provide limited protection against offline |
| 1140 | attacks that try to disable or downgrade encryption in known locations |
| 1141 | where applications may later write sensitive data. It is recommended |
| 1142 | that systems implementing a form of "verified boot" take advantage of |
| 1143 | this by validating all top-level encryption policies prior to access. |
| 1144 | |
| 1145 | Implementation details |
| 1146 | ====================== |
| 1147 | |
| 1148 | Encryption context |
| 1149 | ------------------ |
| 1150 | |
| 1151 | An encryption policy is represented on-disk by a :c:type:`struct |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 1152 | fscrypt_context_v1` or a :c:type:`struct fscrypt_context_v2`. It is |
| 1153 | up to individual filesystems to decide where to store it, but normally |
| 1154 | it would be stored in a hidden extended attribute. It should *not* be |
| 1155 | exposed by the xattr-related system calls such as getxattr() and |
| 1156 | setxattr() because of the special semantics of the encryption xattr. |
| 1157 | (In particular, there would be much confusion if an encryption policy |
| 1158 | were to be added to or removed from anything other than an empty |
| 1159 | directory.) These structs are defined as follows:: |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1160 | |
Eric Biggers | 1d6217a4 | 2020-07-08 14:57:22 -0700 | [diff] [blame] | 1161 | #define FSCRYPT_FILE_NONCE_SIZE 16 |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1162 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 1163 | #define FSCRYPT_KEY_DESCRIPTOR_SIZE 8 |
| 1164 | struct fscrypt_context_v1 { |
| 1165 | u8 version; |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1166 | u8 contents_encryption_mode; |
| 1167 | u8 filenames_encryption_mode; |
| 1168 | u8 flags; |
Eric Biggers | 2336d0d | 2019-08-04 19:35:44 -0700 | [diff] [blame] | 1169 | u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE]; |
Eric Biggers | 1d6217a4 | 2020-07-08 14:57:22 -0700 | [diff] [blame] | 1170 | u8 nonce[FSCRYPT_FILE_NONCE_SIZE]; |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1171 | }; |
| 1172 | |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 1173 | #define FSCRYPT_KEY_IDENTIFIER_SIZE 16 |
| 1174 | struct fscrypt_context_v2 { |
| 1175 | u8 version; |
| 1176 | u8 contents_encryption_mode; |
| 1177 | u8 filenames_encryption_mode; |
| 1178 | u8 flags; |
| 1179 | u8 __reserved[4]; |
| 1180 | u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]; |
Eric Biggers | 1d6217a4 | 2020-07-08 14:57:22 -0700 | [diff] [blame] | 1181 | u8 nonce[FSCRYPT_FILE_NONCE_SIZE]; |
Eric Biggers | ba13f2c | 2019-08-04 19:35:49 -0700 | [diff] [blame] | 1182 | }; |
| 1183 | |
| 1184 | The context structs contain the same information as the corresponding |
| 1185 | policy structs (see `Setting an encryption policy`_), except that the |
| 1186 | context structs also contain a nonce. The nonce is randomly generated |
| 1187 | by the kernel and is used as KDF input or as a tweak to cause |
Eric Biggers | f592efe | 2020-01-20 14:31:58 -0800 | [diff] [blame] | 1188 | different files to be encrypted differently; see `Per-file encryption |
| 1189 | keys`_ and `DIRECT_KEY policies`_. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1190 | |
| 1191 | Data path changes |
| 1192 | ----------------- |
| 1193 | |
| 1194 | For the read path (->readpage()) of regular files, filesystems can |
| 1195 | read the ciphertext into the page cache and decrypt it in-place. The |
| 1196 | page lock must be held until decryption has finished, to prevent the |
| 1197 | page from becoming visible to userspace prematurely. |
| 1198 | |
| 1199 | For the write path (->writepage()) of regular files, filesystems |
| 1200 | cannot encrypt data in-place in the page cache, since the cached |
| 1201 | plaintext must be preserved. Instead, filesystems must encrypt into a |
| 1202 | temporary buffer or "bounce page", then write out the temporary |
| 1203 | buffer. Some filesystems, such as UBIFS, already use temporary |
| 1204 | buffers regardless of encryption. Other filesystems, such as ext4 and |
| 1205 | F2FS, have to allocate bounce pages specially for encryption. |
| 1206 | |
Satya Tangirala | 880253e | 2020-07-24 18:45:00 +0000 | [diff] [blame] | 1207 | Fscrypt is also able to use inline encryption hardware instead of the |
| 1208 | kernel crypto API for en/decryption of file contents. When possible, |
| 1209 | and if directed to do so (by specifying the 'inlinecrypt' mount option |
| 1210 | for an ext4/F2FS filesystem), it adds encryption contexts to bios and |
| 1211 | uses blk-crypto to perform the en/decryption instead of making use of |
| 1212 | the above read/write path changes. Of course, even if directed to |
| 1213 | make use of inline encryption, fscrypt will only be able to do so if |
| 1214 | either hardware inline encryption support is available for the |
| 1215 | selected encryption algorithm or CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK |
| 1216 | is selected. If neither is the case, fscrypt will fall back to using |
| 1217 | the above mentioned read/write path changes for en/decryption. |
| 1218 | |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1219 | Filename hashing and encoding |
| 1220 | ----------------------------- |
| 1221 | |
| 1222 | Modern filesystems accelerate directory lookups by using indexed |
| 1223 | directories. An indexed directory is organized as a tree keyed by |
| 1224 | filename hashes. When a ->lookup() is requested, the filesystem |
| 1225 | normally hashes the filename being looked up so that it can quickly |
| 1226 | find the corresponding directory entry, if any. |
| 1227 | |
| 1228 | With encryption, lookups must be supported and efficient both with and |
| 1229 | without the encryption key. Clearly, it would not work to hash the |
| 1230 | plaintext filenames, since the plaintext filenames are unavailable |
| 1231 | without the key. (Hashing the plaintext filenames would also make it |
| 1232 | impossible for the filesystem's fsck tool to optimize encrypted |
| 1233 | directories.) Instead, filesystems hash the ciphertext filenames, |
| 1234 | i.e. the bytes actually stored on-disk in the directory entries. When |
| 1235 | asked to do a ->lookup() with the key, the filesystem just encrypts |
| 1236 | the user-supplied name to get the ciphertext. |
| 1237 | |
| 1238 | Lookups without the key are more complicated. The raw ciphertext may |
| 1239 | contain the ``\0`` and ``/`` characters, which are illegal in |
| 1240 | filenames. Therefore, readdir() must base64-encode the ciphertext for |
| 1241 | presentation. For most filenames, this works fine; on ->lookup(), the |
| 1242 | filesystem just base64-decodes the user-supplied name to get back to |
| 1243 | the raw ciphertext. |
| 1244 | |
| 1245 | However, for very long filenames, base64 encoding would cause the |
| 1246 | filename length to exceed NAME_MAX. To prevent this, readdir() |
| 1247 | actually presents long filenames in an abbreviated form which encodes |
| 1248 | a strong "hash" of the ciphertext filename, along with the optional |
| 1249 | filesystem-specific hash(es) needed for directory lookups. This |
| 1250 | allows the filesystem to still, with a high degree of confidence, map |
| 1251 | the filename given in ->lookup() back to a particular directory entry |
| 1252 | that was previously listed by readdir(). See :c:type:`struct |
Daniel Rosenberg | edc440e | 2020-01-20 14:32:01 -0800 | [diff] [blame] | 1253 | fscrypt_nokey_name` in the source for more details. |
Eric Biggers | f4f864c | 2017-10-29 06:30:14 -0400 | [diff] [blame] | 1254 | |
| 1255 | Note that the precise way that filenames are presented to userspace |
| 1256 | without the key is subject to change in the future. It is only meant |
| 1257 | as a way to temporarily present valid filenames so that commands like |
| 1258 | ``rm -r`` work as expected on encrypted directories. |
Eric Biggers | 0564336 | 2019-06-20 11:16:58 -0700 | [diff] [blame] | 1259 | |
| 1260 | Tests |
| 1261 | ===== |
| 1262 | |
| 1263 | To test fscrypt, use xfstests, which is Linux's de facto standard |
| 1264 | filesystem test suite. First, run all the tests in the "encrypt" |
Satya Tangirala | 880253e | 2020-07-24 18:45:00 +0000 | [diff] [blame] | 1265 | group on the relevant filesystem(s). One can also run the tests |
| 1266 | with the 'inlinecrypt' mount option to test the implementation for |
| 1267 | inline encryption support. For example, to test ext4 and |
Eric Biggers | 0564336 | 2019-06-20 11:16:58 -0700 | [diff] [blame] | 1268 | f2fs encryption using `kvm-xfstests |
| 1269 | <https://github.com/tytso/xfstests-bld/blob/master/Documentation/kvm-quickstart.md>`_:: |
| 1270 | |
| 1271 | kvm-xfstests -c ext4,f2fs -g encrypt |
Satya Tangirala | 5fee360 | 2020-07-02 01:56:05 +0000 | [diff] [blame] | 1272 | kvm-xfstests -c ext4,f2fs -g encrypt -m inlinecrypt |
Eric Biggers | 0564336 | 2019-06-20 11:16:58 -0700 | [diff] [blame] | 1273 | |
| 1274 | UBIFS encryption can also be tested this way, but it should be done in |
| 1275 | a separate command, and it takes some time for kvm-xfstests to set up |
| 1276 | emulated UBI volumes:: |
| 1277 | |
| 1278 | kvm-xfstests -c ubifs -g encrypt |
| 1279 | |
| 1280 | No tests should fail. However, tests that use non-default encryption |
| 1281 | modes (e.g. generic/549 and generic/550) will be skipped if the needed |
| 1282 | algorithms were not built into the kernel's crypto API. Also, tests |
| 1283 | that access the raw block device (e.g. generic/399, generic/548, |
| 1284 | generic/549, generic/550) will be skipped on UBIFS. |
| 1285 | |
| 1286 | Besides running the "encrypt" group tests, for ext4 and f2fs it's also |
| 1287 | possible to run most xfstests with the "test_dummy_encryption" mount |
| 1288 | option. This option causes all new files to be automatically |
| 1289 | encrypted with a dummy key, without having to make any API calls. |
| 1290 | This tests the encrypted I/O paths more thoroughly. To do this with |
| 1291 | kvm-xfstests, use the "encrypt" filesystem configuration:: |
| 1292 | |
| 1293 | kvm-xfstests -c ext4/encrypt,f2fs/encrypt -g auto |
Satya Tangirala | 5fee360 | 2020-07-02 01:56:05 +0000 | [diff] [blame] | 1294 | kvm-xfstests -c ext4/encrypt,f2fs/encrypt -g auto -m inlinecrypt |
Eric Biggers | 0564336 | 2019-06-20 11:16:58 -0700 | [diff] [blame] | 1295 | |
| 1296 | Because this runs many more tests than "-g encrypt" does, it takes |
| 1297 | much longer to run; so also consider using `gce-xfstests |
| 1298 | <https://github.com/tytso/xfstests-bld/blob/master/Documentation/gce-xfstests.md>`_ |
| 1299 | instead of kvm-xfstests:: |
| 1300 | |
| 1301 | gce-xfstests -c ext4/encrypt,f2fs/encrypt -g auto |
Satya Tangirala | 5fee360 | 2020-07-02 01:56:05 +0000 | [diff] [blame] | 1302 | gce-xfstests -c ext4/encrypt,f2fs/encrypt -g auto -m inlinecrypt |