@@ -38,20 +38,14 @@ fail at runtime.
3838Use cases
3939=========
4040
41- By itself, the base fs-verity feature only provides integrity
42- protection, i.e. detection of accidental (non-malicious) corruption.
41+ By itself, fs-verity only provides integrity protection, i.e.
42+ detection of accidental (non-malicious) corruption.
4343
4444However, because fs-verity makes retrieving the file hash extremely
4545efficient, it's primarily meant to be used as a tool to support
4646authentication (detection of malicious modifications) or auditing
4747(logging file hashes before use).
4848
49- Trusted userspace code (e.g. operating system code running on a
50- read-only partition that is itself authenticated by dm-verity) can
51- authenticate the contents of an fs-verity file by using the
52- `FS_IOC_MEASURE_VERITY `_ ioctl to retrieve its hash, then verifying a
53- digital signature of it.
54-
5549A standard file hash could be used instead of fs-verity. However,
5650this is inefficient if the file is large and only a small portion may
5751be accessed. This is often the case for Android application package
@@ -69,24 +63,31 @@ still be used on read-only filesystems. fs-verity is for files that
6963must live on a read-write filesystem because they are independently
7064updated and potentially user-installed, so dm-verity cannot be used.
7165
72- The base fs-verity feature is a hashing mechanism only; actually
73- authenticating the files may be done by:
74-
75- * Userspace-only
76-
77- * Builtin signature verification + userspace policy
78-
79- fs-verity optionally supports a simple signature verification
80- mechanism where users can configure the kernel to require that
81- all fs-verity files be signed by a key loaded into a keyring;
82- see `Built-in signature verification `_.
83-
84- * Integrity Measurement Architecture (IMA)
85-
86- IMA supports including fs-verity file digests and signatures in the
87- IMA measurement list and verifying fs-verity based file signatures
88- stored as security.ima xattrs, based on policy.
89-
66+ fs-verity does not mandate a particular scheme for authenticating its
67+ file hashes. (Similarly, dm-verity does not mandate a particular
68+ scheme for authenticating its block device root hashes.) Options for
69+ authenticating fs-verity file hashes include:
70+
71+ - Trusted userspace code. Often, the userspace code that accesses
72+ files can be trusted to authenticate them. Consider e.g. an
73+ application that wants to authenticate data files before using them,
74+ or an application loader that is part of the operating system (which
75+ is already authenticated in a different way, such as by being loaded
76+ from a read-only partition that uses dm-verity) and that wants to
77+ authenticate applications before loading them. In these cases, this
78+ trusted userspace code can authenticate a file's contents by
79+ retrieving its fs-verity digest using `FS_IOC_MEASURE_VERITY `_, then
80+ verifying a signature of it using any userspace cryptographic
81+ library that supports digital signatures.
82+
83+ - Integrity Measurement Architecture (IMA). IMA supports fs-verity
84+ file digests as an alternative to its traditional full file digests.
85+ "IMA appraisal" enforces that files contain a valid, matching
86+ signature in their "security.ima" extended attribute, as controlled
87+ by the IMA policy. For more information, see the IMA documentation.
88+
89+ - Trusted userspace code in combination with `Built-in signature
90+ verification `_. This approach should be used only with great care.
9091
9192User API
9293========
@@ -111,8 +112,7 @@ follows::
111112 };
112113
113114This structure contains the parameters of the Merkle tree to build for
114- the file, and optionally contains a signature. It must be initialized
115- as follows:
115+ the file. It must be initialized as follows:
116116
117117- ``version `` must be 1.
118118- ``hash_algorithm `` must be the identifier for the hash algorithm to
@@ -129,12 +129,14 @@ as follows:
129129 file or device. Currently the maximum salt size is 32 bytes.
130130- ``salt_ptr `` is the pointer to the salt, or NULL if no salt is
131131 provided.
132- - ``sig_size `` is the size of the signature in bytes, or 0 if no
133- signature is provided. Currently the signature is (somewhat
134- arbitrarily) limited to 16128 bytes. See `Built-in signature
135- verification `_ for more information.
136- - ``sig_ptr `` is the pointer to the signature, or NULL if no
137- signature is provided.
132+ - ``sig_size `` is the size of the builtin signature in bytes, or 0 if no
133+ builtin signature is provided. Currently the builtin signature is
134+ (somewhat arbitrarily) limited to 16128 bytes.
135+ - ``sig_ptr `` is the pointer to the builtin signature, or NULL if no
136+ builtin signature is provided. A builtin signature is only needed
137+ if the `Built-in signature verification `_ feature is being used. It
138+ is not needed for IMA appraisal, and it is not needed if the file
139+ signature is being handled entirely in userspace.
138140- All reserved fields must be zeroed.
139141
140142FS_IOC_ENABLE_VERITY causes the filesystem to build a Merkle tree for
@@ -158,7 +160,7 @@ fatal signal), no changes are made to the file.
158160FS_IOC_ENABLE_VERITY can fail with the following errors:
159161
160162- ``EACCES ``: the process does not have write access to the file
161- - ``EBADMSG ``: the signature is malformed
163+ - ``EBADMSG ``: the builtin signature is malformed
162164- ``EBUSY ``: this ioctl is already running on the file
163165- ``EEXIST ``: the file already has verity enabled
164166- ``EFAULT ``: the caller provided inaccessible memory
@@ -168,10 +170,10 @@ FS_IOC_ENABLE_VERITY can fail with the following errors:
168170 reserved bits are set; or the file descriptor refers to neither a
169171 regular file nor a directory.
170172- ``EISDIR ``: the file descriptor refers to a directory
171- - ``EKEYREJECTED ``: the signature doesn't match the file
172- - ``EMSGSIZE ``: the salt or signature is too long
173- - ``ENOKEY ``: the fs-verity keyring doesn't contain the certificate
174- needed to verify the signature
173+ - ``EKEYREJECTED ``: the builtin signature doesn't match the file
174+ - ``EMSGSIZE ``: the salt or builtin signature is too long
175+ - ``ENOKEY ``: the ". fs-verity" keyring doesn't contain the certificate
176+ needed to verify the builtin signature
175177- ``ENOPKG ``: fs-verity recognizes the hash algorithm, but it's not
176178 available in the kernel's crypto API as currently configured (e.g.
177179 for SHA-512, missing CONFIG_CRYPTO_SHA512).
@@ -180,8 +182,8 @@ FS_IOC_ENABLE_VERITY can fail with the following errors:
180182 support; or the filesystem superblock has not had the 'verity'
181183 feature enabled on it; or the filesystem does not support fs-verity
182184 on this file. (See `Filesystem support `_.)
183- - ``EPERM ``: the file is append-only; or, a signature is required and
184- one was not provided.
185+ - ``EPERM ``: the file is append-only; or, a builtin signature is
186+ required and one was not provided.
185187- ``EROFS ``: the filesystem is read-only
186188- ``ETXTBSY ``: someone has the file open for writing. This can be the
187189 caller's file descriptor, another open file descriptor, or the file
@@ -270,9 +272,9 @@ This ioctl takes in a pointer to the following structure::
270272- ``FS_VERITY_METADATA_TYPE_DESCRIPTOR `` reads the fs-verity
271273 descriptor. See `fs-verity descriptor `_.
272274
273- - ``FS_VERITY_METADATA_TYPE_SIGNATURE `` reads the signature which was
274- passed to FS_IOC_ENABLE_VERITY, if any. See `Built-in signature
275- verification `_.
275+ - ``FS_VERITY_METADATA_TYPE_SIGNATURE `` reads the builtin signature
276+ which was passed to FS_IOC_ENABLE_VERITY, if any. See `Built-in
277+ signature verification `_.
276278
277279The semantics are similar to those of ``pread() ``. ``offset ``
278280specifies the offset in bytes into the metadata item to read from, and
@@ -299,7 +301,7 @@ FS_IOC_READ_VERITY_METADATA can fail with the following errors:
299301 overflowed
300302- ``ENODATA ``: the file is not a verity file, or
301303 FS_VERITY_METADATA_TYPE_SIGNATURE was requested but the file doesn't
302- have a built-in signature
304+ have a builtin signature
303305- ``ENOTTY ``: this type of filesystem does not implement fs-verity, or
304306 this ioctl is not yet implemented on it
305307- ``EOPNOTSUPP ``: the kernel was not configured with fs-verity
@@ -347,8 +349,8 @@ non-verity one, with the following exceptions:
347349 with EIO (for read()) or SIGBUS (for mmap() reads).
348350
349351- If the sysctl "fs.verity.require_signatures" is set to 1 and the
350- file is not signed by a key in the fs-verity keyring, then opening
351- the file will fail. See `Built-in signature verification `_.
352+ file is not signed by a key in the ". fs-verity" keyring, then
353+ opening the file will fail. See `Built-in signature verification `_.
352354
353355Direct access to the Merkle tree is not supported. Therefore, if a
354356verity file is copied, or is backed up and restored, then it will lose
@@ -433,29 +435,34 @@ root hash as well as other fields such as the file size::
433435Built-in signature verification
434436===============================
435437
436- With CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y, fs-verity supports putting
437- a portion of an authentication policy (see `Use cases `_) in the
438- kernel. Specifically, it adds support for:
438+ CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y adds supports for in-kernel
439+ verification of fs-verity builtin signatures.
440+
441+ **IMPORTANT **! Please take great care before using this feature.
442+ It is not the only way to do signatures with fs-verity, and the
443+ alternatives (such as userspace signature verification, and IMA
444+ appraisal) can be much better. It's also easy to fall into a trap
445+ of thinking this feature solves more problems than it actually does.
446+
447+ Enabling this option adds the following:
439448
440- 1. At fs-verity module initialization time, a keyring ".fs-verity" is
441- created. The root user can add trusted X.509 certificates to this
442- keyring using the add_key() system call, then (when done)
443- optionally use keyctl_restrict_keyring() to prevent additional
444- certificates from being added.
449+ 1. At boot time, the kernel creates a keyring named ".fs-verity". The
450+ root user can add trusted X.509 certificates to this keyring using
451+ the add_key() system call.
445452
4464532. `FS_IOC_ENABLE_VERITY `_ accepts a pointer to a PKCS#7 formatted
447454 detached signature in DER format of the file's fs-verity digest.
448- On success, this signature is persisted alongside the Merkle tree.
449- Then, any time the file is opened, the kernel will verify the
455+ On success, the ioctl persists the signature alongside the Merkle
456+ tree. Then, any time the file is opened, the kernel verifies the
450457 file's actual digest against this signature, using the certificates
451458 in the ".fs-verity" keyring.
452459
4534603. A new sysctl "fs.verity.require_signatures" is made available.
454461 When set to 1, the kernel requires that all verity files have a
455462 correctly signed digest as described in (2).
456463
457- fs-verity file digests must be signed in the following format, which
458- is similar to the structure used by ` FS_IOC_MEASURE_VERITY `_ ::
464+ The data that the signature as described in (2) must be a signature of
465+ is the fs-verity file digest in the following format ::
459466
460467 struct fsverity_formatted_digest {
461468 char magic[8]; /* must be "FSVerity" */
@@ -464,13 +471,66 @@ is similar to the structure used by `FS_IOC_MEASURE_VERITY`_::
464471 __u8 digest[];
465472 };
466473
467- fs-verity's built-in signature verification support is meant as a
468- relatively simple mechanism that can be used to provide some level of
469- authenticity protection for verity files, as an alternative to doing
470- the signature verification in userspace or using IMA-appraisal.
471- However, with this mechanism, userspace programs still need to check
472- that the verity bit is set, and there is no protection against verity
473- files being swapped around.
474+ That's it. It should be emphasized again that fs-verity builtin
475+ signatures are not the only way to do signatures with fs-verity. See
476+ `Use cases `_ for an overview of ways in which fs-verity can be used.
477+ fs-verity builtin signatures have some major limitations that should
478+ be carefully considered before using them:
479+
480+ - Builtin signature verification does *not * make the kernel enforce
481+ that any files actually have fs-verity enabled. Thus, it is not a
482+ complete authentication policy. Currently, if it is used, the only
483+ way to complete the authentication policy is for trusted userspace
484+ code to explicitly check whether files have fs-verity enabled with a
485+ signature before they are accessed. (With
486+ fs.verity.require_signatures=1, just checking whether fs-verity is
487+ enabled suffices.) But, in this case the trusted userspace code
488+ could just store the signature alongside the file and verify it
489+ itself using a cryptographic library, instead of using this feature.
490+
491+ - A file's builtin signature can only be set at the same time that
492+ fs-verity is being enabled on the file. Changing or deleting the
493+ builtin signature later requires re-creating the file.
494+
495+ - Builtin signature verification uses the same set of public keys for
496+ all fs-verity enabled files on the system. Different keys cannot be
497+ trusted for different files; each key is all or nothing.
498+
499+ - The sysctl fs.verity.require_signatures applies system-wide.
500+ Setting it to 1 only works when all users of fs-verity on the system
501+ agree that it should be set to 1. This limitation can prevent
502+ fs-verity from being used in cases where it would be helpful.
503+
504+ - Builtin signature verification can only use signature algorithms
505+ that are supported by the kernel. For example, the kernel does not
506+ yet support Ed25519, even though this is often the signature
507+ algorithm that is recommended for new cryptographic designs.
508+
509+ - fs-verity builtin signatures are in PKCS#7 format, and the public
510+ keys are in X.509 format. These formats are commonly used,
511+ including by some other kernel features (which is why the fs-verity
512+ builtin signatures use them), and are very feature rich.
513+ Unfortunately, history has shown that code that parses and handles
514+ these formats (which are from the 1990s and are based on ASN.1)
515+ often has vulnerabilities as a result of their complexity. This
516+ complexity is not inherent to the cryptography itself.
517+
518+ fs-verity users who do not need advanced features of X.509 and
519+ PKCS#7 should strongly consider using simpler formats, such as plain
520+ Ed25519 keys and signatures, and verifying signatures in userspace.
521+
522+ fs-verity users who choose to use X.509 and PKCS#7 anyway should
523+ still consider that verifying those signatures in userspace is more
524+ flexible (for other reasons mentioned earlier in this document) and
525+ eliminates the need to enable CONFIG_FS_VERITY_BUILTIN_SIGNATURES
526+ and its associated increase in kernel attack surface. In some cases
527+ it can even be necessary, since advanced X.509 and PKCS#7 features
528+ do not always work as intended with the kernel. For example, the
529+ kernel does not check X.509 certificate validity times.
530+
531+ Note: IMA appraisal, which supports fs-verity, does not use PKCS#7
532+ for its signatures, so it partially avoids the issues discussed
533+ here. IMA appraisal does use X.509.
474534
475535Filesystem support
476536==================
0 commit comments