Verificar o firmware de uma instância de VM confidencial

O firmware de todas as instâncias de VM confidencial é UEFI e é baseado no projeto Open Virtual Machine Firmware. O firmware é gerenciado pelo Google para manter a segurança, o desempenho e a estabilidade.

O firmware gerenciado pelo Google também garante a consistência dos valores armazenados nos registros de medição na raiz de confiança de uma instância de VM confidencial. Isso ajuda a evitar que as cargas de trabalho de Computação confidencial sejam bloqueadas pela verificação de atestado quando o firmware de uma instância de VM confidencial é atualizado.

Para ajudar a estabelecer que a instância de VM confidencial está sendo executada em um firmware genuíno gerenciado pelo Google, execute as seguintes tarefas:

  • Recupere uma aprovação de lançamento assinada pelo Google em instâncias de VM confidenciais com AMD SEV-SNP ou Intel TDX ativados. Uma autorização de lançamento contém medições pré-calculadas e assinadas relacionadas ao firmware.

  • Verifique a aprovação de lançamento comparando com medições específicas da arquitetura.

  • Verifique se o binário UEFI é aprovado pelo Google e não foi modificado.

Além do atestado remoto, é possível incluir a verificação de firmware como parte da política de segurança que determina se uma instância de VM confidencial precisa ter acesso a recursos protegidos.

Extrair endossos de lançamento

Você pode recuperar as recomendações de lançamento usando ferramentas do Google ou suas próprias ferramentas.

Extrair endossos de lançamento com ferramentas do Google

Para recuperar uma autorização de lançamento de uma instância de VM confidencial AMD SEV-SNP ou Intel TDX usando ferramentas do Google:

  1. Use o SSH para se conectar à instância de VM confidencial.

  2. Use o Go-TPM-Tools (AMD SEV-SNP ou Intel TDX) ou SEV Guest (AMD SEV-SNP) para extrair um relatório de atestado e certificados associados.

  3. Use gcetcbendorsement para extrair a assinatura do UEFI do atestado e armazená-la em um arquivo. Em seguida, verifique se o endosso está vinculado ao Google e se a medição do relatório de atestado está entre as medições assinadas.

Extrair endossos de lançamento com suas próprias ferramentas

Para recuperar uma recomendação de lançamento usando suas próprias ferramentas, siga estas instruções.

AMD SEV-SNP

  1. Faça uma solicitação de convidado estendida para o processador seguro AMD e extraia um relatório de atestado.

  2. Extraia a medição de 384 bits do relatório armazenada no deslocamento 90h. Para mais informações, consulte a especificação ABI do firmware de paginação aninhada segura do SEV (link em inglês), capítulo 7.3, tabela 22.

  3. Use a medição de 384 bits para fazer o download de uma recomendação de lançamento de referência serializada do seguinte bucket do Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. Decodificar o arquivo BINARYPB com uma ferramenta como protoc, usando a definição de mensagem VMLaunchEndorsement:

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

Locais alternativos de lançamento

A aprovação de lançamento também pode ser disponibilizada em uma tabela GUID no mecanismo de entrega de certificados AMD SEV-SNP. Ele tem o seguinte GUID:

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

A tabela GUID está documentada na especificação de bloco de comunicação do convidado-hipervisor AMD, na seção "Solicitação de convidado estendida do SNP".

Também pode haver referências a locais locais e remotos da aprovação de lançamento no registro de eventos do cliente do Grupo de Computação Confiável para PC, encontrado no evento SP800-155, conforme documentado na especificação do perfil de firmware da plataforma de cliente do Grupo de Computação Confiável para PC, versão 1.06, revisão 52.

Intel TDX

  1. Faça uma entrada configfs-tsm report:

    name=/sys/kernel/config/tsm/report/report0
    mkdir "${name}"
    cat "${your_nonce_file}" > "${name}/inblob"
    cat "${name}/outblob" > "${your_quote_destination}"
    
  2. Extraia a medida de domínio de confiança de 384 bits da citação MRTD armazenada no deslocamento b8h (para o Módulo TDX 1.5). Para mais informações, consulte a biblioteca de cotações DCAP da TDX.

  3. Use a medição de 384 bits para fazer o download de uma recomendação de lançamento de referência serializada do seguinte bucket do Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Decodificar a autorização de lançamento com uma ferramenta como protoc, usando a definição de mensagem VMLaunchEndorsement:

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

Exemplo de recomendação de lançamento

Uma recomendação de lançamento é semelhante ao exemplo abaixo:

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

Medições douradas da UEFI

O campo serialized_uefi_golden contém uma versão serializada de vários valores, conforme definido pelo seguinte buffer de protocolo:

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;
}

O campo VMSevSnp na mensagem VMGoldenMeasurement é definido pelo seguinte buffer de protocolo:

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;
}

O campo VMTdx na mensagem VMGoldenMeasurement é definido pelo seguinte buffer de protocolo:

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;
}

Para descompactar e decodificar esses valores do serialized_uefi_golden field com sua própria ferramenta, siga estas etapas:

  1. Aloque uma nova mensagem VMGoldenMeasurement.

  2. Desempacote serialized_uefi_golden na mensagem.

Como alternativa, use o comando gcetcbendorsement inspect.

Verificar recomendações de lançamento

Depois de extrair uma assinatura de lançamento, verifique a assinatura e integre as medições à sua política de segurança, quando apropriado.

Verificar uma assinatura de endosso de lançamento

É possível verificar a assinatura de um endosso de lançamento incluindo o certificado de chave raiz de computação de computação confidencial do Compute Engine nas suas âncoras de confiança.

O campo cert do VMGoldenMeasurement no endosso de lançamento contém um certificado X.509v3 codificado em DER da chave pública da chave de assinatura de endosso. O certificado é assinado pela chave raiz.

Use gcetcbendorsement para mostrar quais comandos openssl executar para verificar a assinatura. Por exemplo, se você executar o seguinte comando:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Você receberá uma resposta semelhante ao seguinte exemplo:

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")

Se você preferir usar suas próprias ferramentas, substitua os comandos gcetcbendorsement inspect usados na resposta pela sua própria lógica de extração de buffer de protocolo para os campos nomeados da mensagem VMGoldenMeasurement desserializada.

Verificar as medições de recomendação de lançamento

O código de exemplo sobre como criar uma recomendação de lançamento está disponível no repositório do GitHub gce-tcb-verifier. Você pode usar isso para entender como o Google extraiu as medições do UEFI e incorporar medições relevantes à sua política de segurança.

Por exemplo, você pode verificar se o firmware foi assinado pelo fornecedor, e comparar as medições específicas da arquitetura com os valores pré-calculados e assinados fornecidos na mensagem VMLaunchEndorsement.

Embora o firmware virtual do Compute Engine seja atualizado na redefinição, o valor do PCR0 não muda. Por isso, o valor svn do firmware na medição assinada pode ser diferente do EV_S_CRTM_VERSION medido para PCR0, e o evento EV_POST_CODE no resumo de blob do firmware é ignorado.

Verificar o binário UEFI de uma instância de VM confidencial

  1. Em um endosso de lançamento, descompacte o valor serialized_uefi_golden em um VMGoldenMeasurement. Para conferir exemplos, consulte a implementação em Go ou a compilação do protoc de endorsement.proto para outro idioma que ofereça suporte a buffers de protocolo.

  2. Extraia o valor de resumo de VMGoldenMeasurement. Este é o resumo SHA-384 do binário UEFI em que a instância de VM confidencial está sendo executada.

  3. Use o resumo SHA-384 para fazer o download do binário do firmware do seguinte bucket do Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. Se for um URL válido e o firmware for transferido, execute um hash SHA-384 no binário do firmware. Se ele corresponder ao resumo da medição ideal, o firmware em execução na instância de VM confidencial não será modificado.