coco.rst 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. .. SPDX-License-Identifier: GPL-2.0
  2. ==============================
  3. Confidential Computing secrets
  4. ==============================
  5. This document describes how Confidential Computing secret injection is handled
  6. from the firmware to the operating system, in the EFI driver and the efi_secret
  7. kernel module.
  8. Introduction
  9. ============
  10. Confidential Computing (coco) hardware such as AMD SEV (Secure Encrypted
  11. Virtualization) allows guest owners to inject secrets into the VMs
  12. memory without the host/hypervisor being able to read them. In SEV,
  13. secret injection is performed early in the VM launch process, before the
  14. guest starts running.
  15. The efi_secret kernel module allows userspace applications to access these
  16. secrets via securityfs.
  17. Secret data flow
  18. ================
  19. The guest firmware may reserve a designated memory area for secret injection,
  20. and publish its location (base GPA and length) in the EFI configuration table
  21. under a ``LINUX_EFI_COCO_SECRET_AREA_GUID`` entry
  22. (``adf956ad-e98c-484c-ae11-b51c7d336447``). This memory area should be marked
  23. by the firmware as ``EFI_RESERVED_TYPE``, and therefore the kernel should not
  24. be use it for its own purposes.
  25. During the VM's launch, the virtual machine manager may inject a secret to that
  26. area. In AMD SEV and SEV-ES this is performed using the
  27. ``KVM_SEV_LAUNCH_SECRET`` command (see [sev]_). The strucutre of the injected
  28. Guest Owner secret data should be a GUIDed table of secret values; the binary
  29. format is described in ``drivers/virt/coco/efi_secret/efi_secret.c`` under
  30. "Structure of the EFI secret area".
  31. On kernel start, the kernel's EFI driver saves the location of the secret area
  32. (taken from the EFI configuration table) in the ``efi.coco_secret`` field.
  33. Later it checks if the secret area is populated: it maps the area and checks
  34. whether its content begins with ``EFI_SECRET_TABLE_HEADER_GUID``
  35. (``1e74f542-71dd-4d66-963e-ef4287ff173b``). If the secret area is populated,
  36. the EFI driver will autoload the efi_secret kernel module, which exposes the
  37. secrets to userspace applications via securityfs. The details of the
  38. efi_secret filesystem interface are in [secrets-coco-abi]_.
  39. Application usage example
  40. =========================
  41. Consider a guest performing computations on encrypted files. The Guest Owner
  42. provides the decryption key (= secret) using the secret injection mechanism.
  43. The guest application reads the secret from the efi_secret filesystem and
  44. proceeds to decrypt the files into memory and then performs the needed
  45. computations on the content.
  46. In this example, the host can't read the files from the disk image
  47. because they are encrypted. Host can't read the decryption key because
  48. it is passed using the secret injection mechanism (= secure channel).
  49. Host can't read the decrypted content from memory because it's a
  50. confidential (memory-encrypted) guest.
  51. Here is a simple example for usage of the efi_secret module in a guest
  52. to which an EFI secret area with 4 secrets was injected during launch::
  53. # ls -la /sys/kernel/security/secrets/coco
  54. total 0
  55. drwxr-xr-x 2 root root 0 Jun 28 11:54 .
  56. drwxr-xr-x 3 root root 0 Jun 28 11:54 ..
  57. -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b
  58. -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6
  59. -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2
  60. -r--r----- 1 root root 0 Jun 28 11:54 e6f5a162-d67f-4750-a67c-5d065f2a9910
  61. # hd /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910
  62. 00000000 74 68 65 73 65 2d 61 72 65 2d 74 68 65 2d 6b 61 |these-are-the-ka|
  63. 00000010 74 61 2d 73 65 63 72 65 74 73 00 01 02 03 04 05 |ta-secrets......|
  64. 00000020 06 07 |..|
  65. 00000022
  66. # rm /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910
  67. # ls -la /sys/kernel/security/secrets/coco
  68. total 0
  69. drwxr-xr-x 2 root root 0 Jun 28 11:55 .
  70. drwxr-xr-x 3 root root 0 Jun 28 11:54 ..
  71. -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b
  72. -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6
  73. -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2
  74. References
  75. ==========
  76. See [sev-api-spec]_ for more info regarding SEV ``LAUNCH_SECRET`` operation.
  77. .. [sev] Documentation/virt/kvm/x86/amd-memory-encryption.rst
  78. .. [secrets-coco-abi] Documentation/ABI/testing/securityfs-secrets-coco
  79. .. [sev-api-spec] https://www.amd.com/system/files/TechDocs/55766_SEV-KM_API_Specification.pdf