Skip to content

Commit cbabf03

Browse files
dubekardbiesheuvel
authored andcommitted
virt: Add efi_secret module to expose confidential computing secrets
The new efi_secret module exposes the confidential computing (coco) EFI secret area via securityfs interface. When the module is loaded (and securityfs is mounted, typically under /sys/kernel/security), a "secrets/coco" directory is created in securityfs. In it, a file is created for each secret entry. The name of each such file is the GUID of the secret entry, and its content is the secret data. This allows applications running in a confidential computing setting to read secrets provided by the guest owner via a secure secret injection mechanism (such as AMD SEV's LAUNCH_SECRET command). Removing (unlinking) files in the "secrets/coco" directory will zero out the secret in memory, and remove the filesystem entry. If the module is removed and loaded again, that secret will not appear in the filesystem. Signed-off-by: Dov Murik <dovmurik@linux.ibm.com> Reviewed-by: Gerd Hoffmann <kraxel@redhat.com> Link: https://lore.kernel.org/r/20220412212127.154182-3-dovmurik@linux.ibm.com Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
1 parent 1227418 commit cbabf03

File tree

6 files changed

+422
-0
lines changed

6 files changed

+422
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
What: security/secrets/coco
2+
Date: February 2022
3+
Contact: Dov Murik <dovmurik@linux.ibm.com>
4+
Description:
5+
Exposes confidential computing (coco) EFI secrets to
6+
userspace via securityfs.
7+
8+
EFI can declare memory area used by confidential computing
9+
platforms (such as AMD SEV and SEV-ES) for secret injection by
10+
the Guest Owner during VM's launch. The secrets are encrypted
11+
by the Guest Owner and decrypted inside the trusted enclave,
12+
and therefore are not readable by the untrusted host.
13+
14+
The efi_secret module exposes the secrets to userspace. Each
15+
secret appears as a file under <securityfs>/secrets/coco,
16+
where the filename is the GUID of the entry in the secrets
17+
table. This module is loaded automatically by the EFI driver
18+
if the EFI secret area is populated.
19+
20+
Two operations are supported for the files: read and unlink.
21+
Reading the file returns the content of secret entry.
22+
Unlinking the file overwrites the secret data with zeroes and
23+
removes the entry from the filesystem. A secret cannot be read
24+
after it has been unlinked.
25+
26+
For example, listing the available secrets::
27+
28+
# modprobe efi_secret
29+
# ls -l /sys/kernel/security/secrets/coco
30+
-r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b
31+
-r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6
32+
-r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2
33+
-r--r----- 1 root root 0 Jun 28 11:54 e6f5a162-d67f-4750-a67c-5d065f2a9910
34+
35+
Reading the secret data by reading a file::
36+
37+
# cat /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910
38+
the-content-of-the-secret-data
39+
40+
Wiping a secret by unlinking a file::
41+
42+
# rm /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910
43+
# ls -l /sys/kernel/security/secrets/coco
44+
-r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b
45+
-r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6
46+
-r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2
47+
48+
Note: The binary format of the secrets table injected by the
49+
Guest Owner is described in
50+
drivers/virt/coco/efi_secret/efi_secret.c under "Structure of
51+
the EFI secret area".

drivers/virt/Kconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,7 @@ source "drivers/virt/vboxguest/Kconfig"
4747
source "drivers/virt/nitro_enclaves/Kconfig"
4848

4949
source "drivers/virt/acrn/Kconfig"
50+
51+
source "drivers/virt/coco/efi_secret/Kconfig"
52+
5053
endif

drivers/virt/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ obj-y += vboxguest/
99

1010
obj-$(CONFIG_NITRO_ENCLAVES) += nitro_enclaves/
1111
obj-$(CONFIG_ACRN_HSM) += acrn/
12+
obj-$(CONFIG_EFI_SECRET) += coco/efi_secret/
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# SPDX-License-Identifier: GPL-2.0-only
2+
config EFI_SECRET
3+
tristate "EFI secret area securityfs support"
4+
depends on EFI && X86_64
5+
select EFI_COCO_SECRET
6+
select SECURITYFS
7+
help
8+
This is a driver for accessing the EFI secret area via securityfs.
9+
The EFI secret area is a memory area designated by the firmware for
10+
confidential computing secret injection (for example for AMD SEV
11+
guests). The driver exposes the secrets as files in
12+
<securityfs>/secrets/coco. Files can be read and deleted (deleting
13+
a file wipes the secret from memory).
14+
15+
To compile this driver as a module, choose M here.
16+
The module will be called efi_secret.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# SPDX-License-Identifier: GPL-2.0-only
2+
obj-$(CONFIG_EFI_SECRET) += efi_secret.o

0 commit comments

Comments
 (0)