Skip to content

fix(tpm-qvl): expose only the attested event log in VerifiedReport - #1338

Merged
kvinwang merged 1 commit into
nextfrom
fix/gcp-image-identity-attested-pcr2
Sep 23, 2026
Merged

kvinwang merged 1 commit into
nextfrom
fix/gcp-image-identity-attested-pcr2

Conversation

@kvinwang

@kvinwang kvinwang commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator

The TPM event log carries no signature; an entry is attested only when tpm-qvl replays it against a quoted PCR value, and only the PCRs in the signed selection are replayed. The GCP image check nevertheless read the UKI Authenticode digest from the raw TpmQuote::event_log, so for a quote over e.g. {0, 14} its PCR-2 entries were never checked and could carry any digest.

tpm_qvl::verify::VerifiedReport now carries event_log: only the entries of quoted PCRs, all of which were replayed. The verifier reads the GCP image identity from there instead of from the raw quote, like the Nitro arms already read from attestation.report.

Rejecting logs with entries for unquoted PCRs is not an option: real GCP CVMs ship the whole firmware log (PCRs 0-11) while quoting only {0, 2, 14}.

Impact: not exploitable end-to-end today, because decode_mr_gcp_tpm_from_v1 independently requires PCR 2. POST /verify and the KMS boot-auth path fail there first, so no key is released. --verify-cert does reach the bypassed check, but the failed app-info decode makes it report is_valid: false and omit os_image_hash_verified.

Split out of #1238.

@kvinwang
kvinwang force-pushed the fix/gcp-image-identity-attested-pcr2 branch from 0920a90 to 2b51ad5 Compare September 23, 2026 07:24
@kvinwang kvinwang changed the title fix(verifier): bind the GCP image identity to an attested PCR 2 fix(verifier): require PCR 2 in the quote before reading the GCP UKI digest Sep 23, 2026
The TPM event log carries no signature; an entry is attested only when
tpm-qvl replays it against a quoted PCR value, and only the PCRs in the
signed selection are replayed. The GCP image check nevertheless read the UKI
Authenticode digest from the raw `TpmQuote::event_log`, so for a quote over
e.g. {0, 14} its PCR-2 entries were never checked and could carry any digest.

`VerifiedReport` now carries `event_log`: the entries of the quoted PCRs,
all of which were replayed. The verifier reads the GCP image identity from
there instead of from the raw quote, like the Nitro arms already read from
the verified report.

Rejecting logs with entries for unquoted PCRs is not an option: GCP CVMs
ship the whole firmware log (PCRs 0-11) while quoting only {0, 2, 14}.
@kvinwang
kvinwang force-pushed the fix/gcp-image-identity-attested-pcr2 branch from 2b51ad5 to 9b83478 Compare September 23, 2026 07:34
@kvinwang kvinwang changed the title fix(verifier): require PCR 2 in the quote before reading the GCP UKI digest fix(tpm-qvl): expose only the attested event log in VerifiedReport Sep 23, 2026
@kvinwang
kvinwang merged commit 43b31c5 into next Sep 23, 2026
11 checks passed
@kvinwang
kvinwang deleted the fix/gcp-image-identity-attested-pcr2 branch September 23, 2026 07:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant