| .. | .. |
|---|
| 81 | 81 | return 0; |
|---|
| 82 | 82 | } |
|---|
| 83 | 83 | |
|---|
| 84 | + if (fsverity_keyring->keys.nr_leaves_on_tree == 0) { |
|---|
| 85 | + /* |
|---|
| 86 | + * The ".fs-verity" keyring is empty, due to builtin signatures |
|---|
| 87 | + * being supported by the kernel but not actually being used. |
|---|
| 88 | + * In this case, verify_pkcs7_signature() would always return an |
|---|
| 89 | + * error, usually ENOKEY. It could also be EBADMSG if the |
|---|
| 90 | + * PKCS#7 is malformed, but that isn't very important to |
|---|
| 91 | + * distinguish. So, just skip to ENOKEY to avoid the attack |
|---|
| 92 | + * surface of the PKCS#7 parser, which would otherwise be |
|---|
| 93 | + * reachable by any task able to execute FS_IOC_ENABLE_VERITY. |
|---|
| 94 | + */ |
|---|
| 95 | + fsverity_err(inode, |
|---|
| 96 | + "fs-verity keyring is empty, rejecting signed file!"); |
|---|
| 97 | + return -ENOKEY; |
|---|
| 98 | + } |
|---|
| 99 | + |
|---|
| 84 | 100 | d = kzalloc(sizeof(*d) + hash_alg->digest_size, GFP_KERNEL); |
|---|
| 85 | 101 | if (!d) |
|---|
| 86 | 102 | return -ENOMEM; |
|---|