cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

amd-memory-encryption.txt (10576B)


      1Secure Encrypted Virtualization (SEV) is a feature found on AMD processors.
      2
      3SEV is an extension to the AMD-V architecture which supports running encrypted
      4virtual machines (VMs) under the control of KVM. Encrypted VMs have their pages
      5(code and data) secured such that only the guest itself has access to the
      6unencrypted version. Each encrypted VM is associated with a unique encryption
      7key; if its data is accessed by a different entity using a different key the
      8encrypted guests data will be incorrectly decrypted, leading to unintelligible
      9data.
     10
     11Key management for this feature is handled by a separate processor known as the
     12AMD secure processor (AMD-SP), which is present in AMD SOCs. Firmware running
     13inside the AMD-SP provides commands to support a common VM lifecycle. This
     14includes commands for launching, snapshotting, migrating and debugging the
     15encrypted guest. These SEV commands can be issued via KVM_MEMORY_ENCRYPT_OP
     16ioctls.
     17
     18Secure Encrypted Virtualization - Encrypted State (SEV-ES) builds on the SEV
     19support to additionally protect the guest register state. In order to allow a
     20hypervisor to perform functions on behalf of a guest, there is architectural
     21support for notifying a guest's operating system when certain types of VMEXITs
     22are about to occur. This allows the guest to selectively share information with
     23the hypervisor to satisfy the requested function.
     24
     25Launching (SEV and SEV-ES)
     26--------------------------
     27Boot images (such as bios) must be encrypted before a guest can be booted. The
     28MEMORY_ENCRYPT_OP ioctl provides commands to encrypt the images: LAUNCH_START,
     29LAUNCH_UPDATE_DATA, LAUNCH_MEASURE and LAUNCH_FINISH. These four commands
     30together generate a fresh memory encryption key for the VM, encrypt the boot
     31images and provide a measurement than can be used as an attestation of a
     32successful launch.
     33
     34For a SEV-ES guest, the LAUNCH_UPDATE_VMSA command is also used to encrypt the
     35guest register state, or VM save area (VMSA), for all of the guest vCPUs.
     36
     37LAUNCH_START is called first to create a cryptographic launch context within
     38the firmware. To create this context, guest owner must provide a guest policy,
     39its public Diffie-Hellman key (PDH) and session parameters. These inputs
     40should be treated as a binary blob and must be passed as-is to the SEV firmware.
     41
     42The guest policy is passed as plaintext. A hypervisor may choose to read it,
     43but should not modify it (any modification of the policy bits will result
     44in bad measurement). The guest policy is a 4-byte data structure containing
     45several flags that restricts what can be done on a running SEV guest.
     46See KM Spec section 3 and 6.2 for more details.
     47
     48The guest policy can be provided via the 'policy' property (see below)
     49
     50# ${QEMU} \
     51   sev-guest,id=sev0,policy=0x1...\
     52
     53Setting the "SEV-ES required" policy bit (bit 2) will launch the guest as a
     54SEV-ES guest (see below)
     55
     56# ${QEMU} \
     57   sev-guest,id=sev0,policy=0x5...\
     58
     59The guest owner provided DH certificate and session parameters will be used to
     60establish a cryptographic session with the guest owner to negotiate keys used
     61for the attestation.
     62
     63The DH certificate and session blob can be provided via the 'dh-cert-file' and
     64'session-file' properties (see below)
     65
     66# ${QEMU} \
     67     sev-guest,id=sev0,dh-cert-file=<file1>,session-file=<file2>
     68
     69LAUNCH_UPDATE_DATA encrypts the memory region using the cryptographic context
     70created via the LAUNCH_START command. If required, this command can be called
     71multiple times to encrypt different memory regions. The command also calculates
     72the measurement of the memory contents as it encrypts.
     73
     74LAUNCH_UPDATE_VMSA encrypts all the vCPU VMSAs for a SEV-ES guest using the
     75cryptographic context created via the LAUNCH_START command. The command also
     76calculates the measurement of the VMSAs as it encrypts them.
     77
     78LAUNCH_MEASURE can be used to retrieve the measurement of encrypted memory and,
     79for a SEV-ES guest, encrypted VMSAs. This measurement is a signature of the
     80memory contents and, for a SEV-ES guest, the VMSA contents, that can be sent
     81to the guest owner as an attestation that the memory and VMSAs were encrypted
     82correctly by the firmware. The guest owner may wait to provide the guest
     83confidential information until it can verify the attestation measurement.
     84Since the guest owner knows the initial contents of the guest at boot, the
     85attestation measurement can be verified by comparing it to what the guest owner
     86expects.
     87
     88LAUNCH_FINISH finalizes the guest launch and destroys the cryptographic
     89context.
     90
     91See SEV KM API Spec [1] 'Launching a guest' usage flow (Appendix A) for the
     92complete flow chart.
     93
     94To launch a SEV guest
     95
     96# ${QEMU} \
     97    -machine ...,confidential-guest-support=sev0 \
     98    -object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1
     99
    100To launch a SEV-ES guest
    101
    102# ${QEMU} \
    103    -machine ...,confidential-guest-support=sev0 \
    104    -object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1,policy=0x5
    105
    106An SEV-ES guest has some restrictions as compared to a SEV guest. Because the
    107guest register state is encrypted and cannot be updated by the VMM/hypervisor,
    108a SEV-ES guest:
    109 - Does not support SMM - SMM support requires updating the guest register
    110   state.
    111 - Does not support reboot - a system reset requires updating the guest register
    112   state.
    113 - Requires in-kernel irqchip - the burden is placed on the hypervisor to
    114   manage booting APs.
    115
    116Launching (SEV-SNP)
    117-------------------
    118Boot images (such as bios) must be encrypted before a guest can be booted. The
    119MEMORY_ENCRYPT_OP ioctl provides commands to encrypt the images:
    120KVM_SNP_INIT, SNP_LAUNCH_START, SNP_LAUNCH_UPDATE, and SNP_LAUNCH_FINISH. These
    121four commands together generate a fresh memory encryption key for the VM,
    122encrypt the boot images for a successful launch.
    123
    124KVM_SNP_INIT is called first to initialize the SEV-SNP firmware and SNP
    125features in the KVM. The feature flags value can be provided through the
    126'init-flags' property of the 'sev-snp-guest' object.
    127
    128+------------+-------+----------+---------------------------------+
    129| key        | type  | default  | meaning                         |
    130+------------+-------+----------+---------------------------------+
    131| init_flags | hex   | 0        | SNP feature flags               |
    132+-----------------------------------------------------------------+
    133
    134Note: currently the init_flags must be zero.
    135
    136SNP_LAUNCH_START is called first to create a cryptographic launch context
    137within the firmware. To create this context, guest owner must provide a guest
    138policy and other parameters as described in the SEV-SNP firmware
    139specification. The launch parameters should be specified as described in the
    140QAPI schema for the 'sev-snp-guest' object.
    141
    142The SNP_LAUNCH_START uses the following parameters (see the SEV-SNP
    143specification for more details):
    144
    145+--------+-------+----------+----------------------------------------------+
    146| key    | type  | default  | meaning                                      |
    147+--------+-------+----------+----------------------------------------------+
    148| policy | hex   | 0x30000  | a 64-bit guest policy                        |
    149| imi_en | bool  | 0        | 1 when IMI is enabled                        |
    150| ma_end | bool  | 0        | 1 when migration agent is used               |
    151| gosvw  | string| 0        | 16-byte base64 encoded string for the guest  |
    152|        |       |          | OS visible workaround.                       |
    153+--------+-------+----------+----------------------------------------------+
    154
    155SNP_LAUNCH_UPDATE encrypts the memory region using the cryptographic context
    156created via the SNP_LAUNCH_START command. If required, this command can be called
    157multiple times to encrypt different memory regions. The command also calculates
    158the measurement of the memory contents as it encrypts.
    159
    160SNP_LAUNCH_FINISH finalizes the guest launch flow. Optionally, while finalizing
    161the launch the firmware can perform checks on the launch digest computing
    162through the SNP_LAUNCH_UPDATE. To perform the check the user must supply
    163the id block, authentication blob and host data that should be included in the
    164attestation report. See the SEV-SNP spec for further details.
    165
    166The SNP_LAUNCH_FINISH uses the following parameters, which can be configured
    167by the corresponding parameters documented in the QAPI schema for the
    168'sev-snp-guest' object.
    169
    170+------------+-------+----------+----------------------------------------------+
    171| key        | type  | default  | meaning                                      |
    172+------------+-------+----------+----------------------------------------------+
    173| id_block   | string| none     | base64 encoded ID block                      |
    174+------------+-------+----------+----------------------------------------------+
    175| id_auth    | string| none     | base64 encoded authentication information    |
    176+------------+-------+----------+----------------------------------------------+
    177| auth_key_en| bool  | 0        | auth block contains author key               |
    178+------------+-------+----------+----------------------------------------------+
    179| host_data  | string| none     | host provided data                           |
    180+------------+-------+----------+----------------------------------------------+
    181
    182To launch a SEV-SNP guest (additional parameters are documented in the QAPI
    183schema for the 'sev-snp-guest' object):
    184
    185# ${QEMU} \
    186    -machine ...,confidential-guest-support=sev0 \
    187    -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1
    188
    189Debugging
    190-----------
    191Since the memory contents of a SEV guest are encrypted, hypervisor access to
    192the guest memory will return cipher text. If the guest policy allows debugging,
    193then a hypervisor can use the DEBUG_DECRYPT and DEBUG_ENCRYPT commands to access
    194the guest memory region for debug purposes.  This is not supported in QEMU yet.
    195
    196Snapshot/Restore
    197-----------------
    198TODO
    199
    200Live Migration
    201----------------
    202TODO
    203
    204References
    205-----------------
    206
    207AMD Memory Encryption whitepaper:
    208https://developer.amd.com/wordpress/media/2013/12/AMD_Memory_Encryption_Whitepaper_v7-Public.pdf
    209
    210Secure Encrypted Virtualization Key Management:
    211[1] http://developer.amd.com/wordpress/media/2017/11/55766_SEV-KM-API_Specification.pdf
    212
    213KVM Forum slides:
    214http://www.linux-kvm.org/images/7/74/02x08A-Thomas_Lendacky-AMDs_Virtualizatoin_Memory_Encryption_Technology.pdf
    215https://www.linux-kvm.org/images/9/94/Extending-Secure-Encrypted-Virtualization-with-SEV-ES-Thomas-Lendacky-AMD.pdf
    216
    217AMD64 Architecture Programmer's Manual:
    218   http://support.amd.com/TechDocs/24593.pdf
    219   SME is section 7.10
    220   SEV is section 15.34
    221   SEV-ES is section 15.35