Firmware einer Confidential VM-Instanz prüfen

Die Firmware für alle Confidential VM-Instanzen ist UEFI und basiert auf dem Open Virtual Machine Firmware -Projekt. Die Firmware wird von Google verwaltet, um Sicherheit, Leistung und Stabilität zu gewährleisten.

Die von Google verwaltete Firmware sorgt auch für Konsistenz der Werte, die in den Messregistern des Root of Trust für eine Confidential VM-Instanz gespeichert sind. So wird verhindert, dass Confidential Computing-Arbeitslasten bei der Attestierungsprüfung blockiert werden, wenn die Firmware einer Confidential VM-Instanz aktualisiert wird.

So können Sie feststellen, ob Ihre Confidential VM-Instanz mit der von Google verwalteten Originalfirmware ausgeführt wird:

  • Rufen Sie eine von Google signierte Startbestätigung für Confidential VM Instanzen mit aktiviertem AMD SEV-SNP oder Intel TDX ab. Eine Startbestätigung enthält vorab berechnete und signierte Messwerte zur Firmware.

  • Überprüfen Sie die Startbestätigung, indem Sie sie mit architekturabhängigen Messwerten vergleichen.

  • Prüfen Sie, ob die UEFI-Binärdatei von Google bestätigt und unverändert ist.

Neben der Remote-Attestierung können Sie die Firmware-Überprüfung in Ihre Sicherheitsrichtlinie aufnehmen, um zu bestimmen, ob eine Confidential VM-Instanz Zugriff auf geschützte Ressourcen haben soll.

Startbestätigungen abrufen

Sie können Startbestätigungen mit Google-Tools oder Ihren eigenen Tools abrufen.

Startbestätigungen mit Google-Tools abrufen

So rufen Sie eine Startbestätigung von einer Confidential VM-Instanz mit AMD SEV-SNP oder Intel TDX mit Google-Tools ab:

  1. Stellen Sie eine SSH-Verbindung zu Ihrer Confidential VM-Instanz her.

  2. Rufen Sie mit Go-TPM-Tools (AMD SEV-SNP oder Intel TDX) oder SEV Guest (AMD SEV-SNP) einen Attestierungsbericht und die zugehörigen Zertifikate ab.

  3. Verwenden Sie gcetcbendorsement , um die UEFI-Bestätigung aus der Attestierung zu extrahieren und in einer Datei zu speichern. Anschließend können Sie prüfen, ob die Bestätigung auf Google zurückzuführen ist und ob die Messung des Attestierungsberichts zu den signierten Messungen gehört.

Startbestätigungen mit eigenen Tools abrufen

Folgen Sie der Anleitung, um eine Startbestätigung mit Ihren eigenen Tools abzurufen.

AMD SEV-SNP

  1. Senden Sie eine erweiterte Gastanfrage an den AMD Secure Processor, um einen Attestierungsbericht abzurufen.

  2. Extrahieren Sie die 384-Bit-Messung des Berichts, die am Offset 90h gespeichert ist. Weitere Informationen finden Sie in der Spezifikation des SEV Secure Nested Paging Firmware ABI, Kapitel 7.3, Tabelle 22.

  3. Verwenden Sie die 384-Bit-Messung, um eine serialisierte Referenz-Startbestätigung aus dem folgenden Cloud Storage-Bucket herunterzuladen:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. Decodieren Sie die BINARYPB-Datei mit einem Tool wie protoc und verwenden Sie dabei die VMLaunchEndorsement Nachrichtendefinition:

    message VMLaunchEndorsement {
      bytes serialized_uefi_golden = 1;
      bytes signature = 2;
    }
    

Alternative Speicherorte für Startbestätigungen

Die Startbestätigung ist möglicherweise auch in einer GUID-Tabelle im AMD SEV-SNP-Zertifikatbereitstellungsmechanismus verfügbar. Sie hat die folgende GUID:

9f4116cd-c503-4f5a-8f6f-fb68882f4ce2

Die GUID-Tabelle ist in der Spezifikation des AMD Guest-Hypervisor Communication Block, im Abschnitt „SNP Extended Guest Request“ dokumentiert.

Möglicherweise gibt es auch Verweise auf lokale und Remote-Speicherorte der Startbestätigung im Ereignisprotokoll des Trusted Computing Group PC-Clients, das im SP800-155-Ereignis gemäß der Spezifikation des TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 zu finden ist.

Intel TDX

  1. Erstellen Sie einen configfs-tsm-Bericht eintrag:

    name=/sys/kernel/config/tsm/report/report0
    mkdir "${name}"
    cat "${your_nonce_file}" > "${name}/inblob"
    cat "${name}/outblob" > "${your_quote_destination}"
    
  2. Extrahieren Sie die 384-Bit-Messung der Vertrauensstellung des Angebots (MRTD), die am Offset b8h gespeichert ist (für TDX-Modul 1.5). Weitere Informationen finden Sie in der TDX DCAP-Bibliothek für Angebote.

  3. Verwenden Sie die 384-Bit-Messung, um eine serialisierte Referenz-Startbestätigung aus dem folgenden Cloud Storage-Bucket herunterzuladen:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Decodieren Sie die Startbestätigung mit einem Tool wie protoc und verwenden Sie dabei die VMLaunchEndorsement Nachrichtendefinition:

    message VMLaunchEndorsement {
      bytes serialized_uefi_golden = 1;
      bytes signature = 2;
    }
    

Beispiel für eine Startbestätigung

Eine Startbestätigung sieht in etwa so aus:

VMLaunchEndorsement:
serialized_uefi_golden: "SERIALIZED_BYTES"
signature: "LAUNCH_ENDORSEMENT_SIGNATURE_BYTES"

UEFI-Referenzmessungen

Das Feld serialized_uefi_golden enthält eine serialisierte Version mehrerer Werte, wie im folgenden Protocol Buffer definiert:

message VMGoldenMeasurement {
  google.protobuf.Timestamp timestamp = 1;

  // The changelist number this UEFI was built from.
  uint64 cl_spec = 2;

  // DER format certificate of the key that signed this document.
  bytes cert = 4;

  // SHA-384 digest of the UEFI binary without TEE-specifics about launch.
  bytes digest = 5;

  // A sequence of PEM-encoded certificates of keys used in cert in Root ...
  // final intermediate order. The last certificate will have a signed cert.
  bytes ca_bundle = 6;

  VMSevSnp sev_snp = 7;

  VMTdx tdx = 8;
}

Das Feld VMSevSnp in der Nachricht VMGoldenMeasurement wird durch den folgenden Protocol Buffer definiert:

message VMSevSnp {
  // The Google-reported security version number of this UEFI on SEV-SNP.
  uint32 svn = 1;

  // Expected MEASUREMENT report field values given [key]-many VMSAs at launch.
  map<uint32, bytes> measurements = 2; // bytes size 48

  // A UUID that Google uses for its CVM UEFIs
  bytes family_id = 3; // size 16

  // A UUID to name this specific release of the UEFI image. This is randomly
  // generated with each build.
  bytes image_id = 4; // size 16

  // The launch policy that verifiers should expect with this UEFI.
  uint64 policy = 5;

  // Optional. PEM-encoded certs for Identity..Author..Root. If a singleton,
  // only an Id-key is used.
  bytes ca_bundle = 6;
}

Das Feld VMTdx in der Nachricht VMGoldenMeasurement wird durch den folgenden Protocol Buffer definiert:

message VMTdx {
  message Measurement {
    // The amount of RAM in GiB provided to the VM. This is relevant to the
    // construction of the measured TDHOB page that includes memory region
    // resource attributes.
    uint32 ram_gib = 1;
    // If true, EFI_UNACCEPTED_MEMORY not presented to guest.
    // All memory is accepted by the firmware. Relevant to the TDHOB page
    // since the resource attribute will include
    // EFI_RESOURCE_ATTRIBUTE_NEEDS_EARLY_ACCEPT.
    bool early_accept = 2;
    // The SHA-384 digest of the measurement operations for the VM at launch.
    bytes mrtd = 3;
  }
  // The Google-reported security version number of this UEFI on TDX.
  uint32 svn = 1;

  // Expected MRTD report field values given legal configurations.
  repeated Measurement measurements = 2;
}

So entpacken und decodieren Sie diese Werte aus dem serialized_uefi_golden field mit Ihren eigenen Tools:

  1. Weisen Sie eine neue VMGoldenMeasurement-Nachricht zu.

  2. Heben Sie die Serialisierung von serialized_uefi_golden in der Nachricht auf.

Alternativ können Sie den gcetcbendorsement inspect Befehl verwenden.

Startbestätigungen überprüfen

Nachdem Sie eine Startbestätigung abgerufen haben, überprüfen Sie die Signatur und fügen Sie die Messungen gegebenenfalls in Ihre Sicherheitsrichtlinie ein.

Signatur einer Startbestätigung überprüfen

Sie können die Signatur einer Startbestätigung überprüfen, indem Sie das Zertifikat des Root-Schlüssels der Trusted Computing Base von Compute Engine Confidential Computing in Ihre Vertrauensanker aufnehmen.

Das Feld cert der VMGoldenMeasurement in der Startbestätigung enthält ein DER-codiertes X.509v3-Zertifikat des öffentlichen Schlüssels des Signaturschlüssels der Bestätigung. Das Zertifikat ist mit dem Root-Schlüssel signiert.

Mit „gcetcbendorsement“ können Sie sehen, welche openssl Befehle ausgeführt werden müssen, um die Signatur zu überprüfen. Wenn Sie beispielsweise den folgenden Befehl ausführen:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Sie sollten eine Antwort ähnlich der folgenden erhalten:

openssl verify -CAfile <(openssl x509 -outform pem -in <(curl https://pki.goog/cloud_integrity/GCE-cc-tcb-root_1.crt)) \
    <(gcetcbendorsement inspect mask "LAUNCH_ENDORSEMENT_FILENAME.binarypb" --path=cert) \
    && \
    openssl pkeyutl -verify -pkeyopt rsa_padding_mode:pss \
        -pkeyopt rsa_pss_saltlen:32 -pkeyopt digest:sha256 -pkeyopt rsa_mgf1_md:sha256 -pubin \
        -inkey <(openssl x509 -pubkey -nocert -outform pem -in <(gcetcbendorsement inspect mask "LAUNCH_ENDORSEMENT_FILENAME.binarypb" --path=cert)) \
        -sigfile <(gcetcbendorsement inspect signature "LAUNCH_ENDORSEMENT_FILENAME.binarypb") -keyform PEM \
        -in <(openssl dgst -sha256 -binary <(gcetcbendorsement inspect payload "LAUNCH_ENDORSEMENT_FILENAME.binarypb")

Wenn Sie Ihre eigenen Tools verwenden möchten, können Sie die in der Antwort verwendeten gcetcbendorsement inspect-Befehle durch Ihre eigene Protocol Buffer-Extraktionslogik für die genannten Felder der deserialisierten VMGoldenMeasurement-Nachricht ersetzen.

Messungen der Startbestätigung überprüfen

Der Beispielcode für die Erstellung einer Startbestätigung ist im gce-tcb-verifier GitHub-Repository verfügbar. So können Sie nachvollziehen, wie Google die Messungen aus dem UEFI abgeleitet hat, und relevante Messungen in Ihre Sicherheitsrichtlinie aufnehmen.

Sie können beispielsweise prüfen, ob die Firmware vom Firmware-Anbieter signiert ist, und die architekturabhängigen Messungen mit vorab berechneten und signierten Werten vergleichen, die in der Nachricht VMLaunchEndorsement enthalten sind.

Obwohl die virtuelle Firmware von Compute Engine beim Zurücksetzen aktualisiert wird, ändert sich der PCR0-Wert nicht. Aus diesem Grund kann der svn-Wert der Firmware in der signierten Messung vom EV_S_CRTM_VERSION-Wert abweichen, der für PCR0 gemessen wurde, und das EV_POST_CODE-Ereignis im Firmware-Blob-Digest wird übersprungen.

UEFI-Binärdatei einer Confidential VM-Instanz überprüfen

  1. Entpacken Sie den serialized_uefi_golden Wert aus einer Startbestätigung in eine VMGoldenMeasurement. Beispiele finden Sie in der Implementierung in Go, oder in der protoc-Kompilierung von endorsement.proto für eine andere Sprache, die Protocol Buffers unterstützt.

  2. Rufen Sie den Digest-Wert aus VMGoldenMeasurement ab. Dies ist der SHA-384-Digest der UEFI-Binärdatei, die auf der Confidential VM-Instanz ausgeführt wird.

  3. Verwenden Sie den SHA-384-Digest, um die Firmware-Binärdatei aus dem folgenden Cloud Storage-Bucket herunterzuladen:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. Wenn es sich um eine gültige URL handelt und die Firmware heruntergeladen wird, führen Sie einen SHA-384-Hash für die Firmware-Binärdatei aus. Wenn er mit dem Digest aus der Referenzmessung übereinstimmt, wird die Firmware auf Ihrer Confidential VM-Instanz unverändert ausgeführt.